目录
java语言中的package和import机制:
- 1、为什么要使用package?
- package是java中包机制。包机制的作用是为了方便程序的管理。不同功能的类分别放在不同的包下。
- (按照功能划分的,不同的包具有不同的功能)
- 2、package怎么用?
- package是一个关键字,后面加包名。例如:
- package com.javase.day1206;
- 注意:package语句只允许出现在java源代码的第一行
-
- 3、包名有没有命名规范? 有
- 一般采用公司域名倒序的方式(因为公司域名具有全球唯一性。)
- 包名命名规范:
- 公司域名倒序 + 项目名 + 模块名 + 功能名
-
- 4、对于带有package的java程序怎么编译?怎么运行?
- 采用之前的编译和运行 不行了
- 类名不再是HelloWorld了
- 类名:com.javase.day1206.HelloWorld
-
- 用文本编辑器编写的带包文件的编译运行:
- 在编写当前文件的地址栏cmd直接进入dos界面,然后编译,然后输入以下命令运行
- 不能用之前那种切换目录的方式。使用这种方式直接生成包的目录,直接编译不生成目录且无法运行。
- 运行时也要在编写java文件的文件夹cmd然后运行,不能切换到class文件所在位置运行。
-
- 编译:
- javac -d . HelloWorld.java
- javac 负责编译的命令
- -d 带包编译
- . 代表编译之后生成的东西放到当前目录下(.代表当前目录)
- HelloWorld.java 被编译的java文件
- 运行:
- java 完整类名 —— java com.javase.day1206.HelloWorld
-
- 注意:
- 带包名描述的类名(完整类名) : java.util.Scanner
- 不带包名描述的(简类名) : Scanner
-
- 用idea时右键src新建包:com.javase.day1206
- 生成包之后右键new class,然后取名,然后运行即可。
-
- 5、关于import的使用: 两个类不在同一个包中的时候,其中一个类使用了另一个类,此时需要使用import(导包)
- import什么时候使用?
- A类中使用B类
- A类和B类都在同一个包下,不需要使用import
- A类和B类不在同一个包下,需要使用import
- 注意:
- java.lang包下的类都不需要导包(但是这个包的子包需要导)。相当于:java.lang.*;在每个类中默认有。
-
- import怎么用?
- import语句只能出现在package语句之下,class声明语句之上
- import语句还可以采用*的方式.
- 例:
- import com.javase.day1206.HelloWorld;可以使用:
- import com.javase.day1206.*;
-
- 疑问: import com.javase.day1206.*; 这样是不是效率比较低?
- 不是!编译器编译时会把*变为具体的类名。但是要注意:这里的*只代表某些类的名字。
- 不要想着用 import Java *; 或import *; 把所有的类导入进来。这样是不现实的。
- package com.javase.day1206;
-
- public class HelloWorld {
- public static void main(String[] args) {
- System.out.println("HelloWorld");
- }
- }
同一个包中import可以省
- package com.javase.day1206;
-
- public class Text01 {
- public static void main(String[] args) {
- //创建HelloWorld对象
- com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
- System.out.println(hw);//com.javase.day1206.HelloWorld@1b6d3586
-
- //包名可以省略吗?
- //思考:这里的包名之所以可以省略,是因为这两个类在同一个包中。
- HelloWorld hw2 = new HelloWorld();
- System.out.println(hw2);//com.javase.day1206.HelloWorld@4554617c
- }
- }
不同包的两个类,一个类中要使用另一个类中的东西,必须有import
- package com;
-
- //import com.javase.day1206.HelloWorld;
- //import还可以采用*的方式
- import com.javase.day1206.*;
-
- public class Text02 {
- public static void main(String[] args) {
- /*
- HelloWorld hw = new HelloWorld();
- System.out.println(hw);
- 没有导包之前,编译报错:
- Error:(6, 9) java: 找不到符号
- 符号: 类 HelloWorld
- 位置: 类 com.Text02
- 原因:Text02在com包下,HelloWorld在com.javase.day1206包下
- 不在同一个paceage下,包名不可以省略。
- */
-
- /*想要编译通过,必须这样:
- com.javase.day1206.HelloWorld hw = new com.javase.day1206.HelloWorld();
- System.out.println(hw);
- com.javase.day1206.HelloWorld hw2 = new com.javase.day1206.HelloWorld();
- System.out.println(hw2);
- com.javase.day1206.HelloWorld hw3 = new com.javase.day1206.HelloWorld();
- System.out.println(hw3);
- com.javase.day1206.HelloWorld@1b6d3586
- com.javase.day1206.HelloWorld@4554617c
- com.javase.day1206.HelloWorld@74a14482
- */
-
- //虽然上面那样可以运行,但是每次这样写太麻烦了,所以这里就需要用到import 将需要用到的类导入进来。
- //import com.javase.day1206.HelloWorld;
- //包名.类名 就是带包的类的新名字。
-
- HelloWorld hw1 = new HelloWorld();
- System.out.println(hw1);
- }
- }
解释之前接收键盘输入时使用的java.util.Scanner ,以及使用java.lang.下所有的类都不需要导
- package com.javase.day1206;
-
- //第二种方法:使用import导包
- //import java.util.Scanner;
- //也可以使用*的方式导包
- import java.util.*;
-
- public class Text03 {
- public static void main(String[] args) {
- //为什么要这样写?
- //因为Text03与Scanner这两个类不在同一个包中,在Text03中使用Scanner类中的东西
- //第一种方法:需要在前面加Scanner类的包名:java.util
- //java.util.Scanner s = new java.util.Scanner(System.in);
-
- //导包之后使用时,类名前就不用加包名了。
- Scanner s = new Scanner(System.in);
- String str = s.next();
- System.out.println("您输入的字符串为:"+str);
-
- //String类为什么不需要导包就可以使用?
- //因为String类在java.lang包下,这个包下的所有类都不需要导包就可以使用!
- java.lang.String name = "张三";
- System.out.println("名字是:"+name);
- java.lang.String userName = "李四";
- System.out.println("用户名是:"+userName);
- }
- }
-
访问控制权限有几个,控制范围以及修饰什么?
- 1、访问控制权限有4个:
- public 公开的
- private 私有的
-
- protected 受保护的
- 什么都不加 默认的
-
- 2、访问控制权限各自的控制范围:
- public : 表示公开的,任何位置都可以访问
- private: 表示私有的,只能在本类中访问
-
- “默认” : 只能在本类、同包 访问
- protected : 本类、同包、子类中访问
-
- 访问控制权限 本类 同包 子类 任意位置
- --------------------------------------------------------------------------
- public 可以 可以 可以 可以
- protected 可以 可以 可以 X
- 默认 可以 可以 X X
- private 可以 X X X
-
- 默认范围从大到小排序:public > protected > 默认 > private
-
- 3、访问控制权限符可以修饰什么?
- 属性、方法 。 (四个都可以修饰)
- 类、接口 。 (public 和 默认。其他的不能修饰)
本类的 访问控制权限符可以修饰什么东西
- package com;
-
- public class User{
- //私有的
- private int id;
- //受保护的
- protected int age;
- //公开的
- public int weight;
- //什么都不加:默认的
- String name;
-
- //本类
- public static void main(String[] args) {
- User u = new User();
- System.out.println(u.id);
- System.out.println(u.age);
- System.out.println(u.weight);
- System.out.println(u.name);
- }
-
- //方法
- public void m1(){}
- private void m2(){}
- protected void m3(){}
- void m4(){}
-
- //静态的也可以,访问控制权限与是否静态无关
- public static void a(){}
- private static void b(){}
- protected static void c(){}
- static void d(){}
- }
-
- //Error: 此处不允许使用修饰符private
- //private class MyClass1{}
-
- //Error: 此处不允许使用修饰符protected
- //protected class MyClass2{}
-
同包的
- //同包
- package com;
-
- public class Text1 {
- public static void main(String[] args) {
- User u = new User();
-
- //Error: id 在 User 中是 private 访问控制
- //System.out.println(u.id);
-
- System.out.println(u.age);
- System.out.println(u.weight);
- System.out.println(u.name);
- }
- }
不同包中
- //不同包中
- package com.javase;
-
- import com.User;
-
- public class Text2 {
- public static void main(String[] args) {
- User u = new User();
-
- //Error: age 在 com.User 中是 protected 访问控制
- //System.out.println(u.age);
-
- //公开的,在哪里都可以使用
- System.out.println(u.weight);
-
- //Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
- //System.out.println(u.name);
- }
- }
子类中
- //不同包,子类
- package com.javase.day1206;
-
- import com.User;
-
- //User在com包下,Vip在com.javase.day1206包下,两个类不在同一个包下。
- //但是Vip是User的子类。
-
- public class Vip extends User{
- public static void main(String[] args) {
-
- }
- //实例方法
- public void shopping(){
- //this表示当前对象
- //编译通过
- System.out.println(this.age);
-
- //Error: name在com.User中不是公共的; 无法从外部程序包中对其进行访问
- //System.out.println(this.name);
- }
- }