package和import机制
**疑问:**前面写的代码都是在同一个文件夹中,同一文件夹下访问其他类时可以直接通过文件名即类名访问(比如说我在测试类下可以直接创建一个Customer类型的对象,显然Customer和Test是两个文件)。但是不同文件夹下,还可以通过类名直接进行访问吗?
**不可以!**此时,HelloWorld.java在另一个文件夹下,所以我们需要后面的import机制。
public class Test01{
public static void main(String[] args){
// 错误: 找不到符号
HelloWorld hw = new HelloWorld();
}
}
1. package关键字
1. 为什么要使用package 机制
package是 Java 中的包机制。包机制使得程序的分类管理更加方便。不同功能的类分别存放在不同的包下。(按照功能划分的,不同的软件包具有不同的功能。)
2. package怎么使用
package是一个关键字,后面直接加需要访问的类名。
注意:一旦使用package关键字,当前类的类名会改变,需要在原类名前加上包名
此外,package语句只能出现在Java源代码的第一行
3.包名规范问题
公司域名倒叙+项目名 + 模块名 + 功能名
4.程序编译运行问题
对于带有package的Java程序怎么编译?怎么运行?
一旦使用package关键字,当前类的类名会改变,需要在原类名前加上包名
- 编译
你可以选择原本的编译方式,但是运行时必须要保证类路径和包名一致,此时你需要按照包名建立文件夹,再将正常编译生成的class文件存放到正确的类路径下,才可以运行。
上述过程太麻烦,通过以下命令进行带包编译,会自动生成与包名一致的类路径
javac -d . HelloWorld.java
/*
javac 负责编译的命令
-d 带包编译
. 代表编译之后生成的东西放到当前目录下(点代表当前目录)
HelloWorld.java 被编译的java文件名。
*/
- 运行
导入包后,类名已经变了
java com.study.HelloWorld
5.导包后,类名改变。什么时候可以省略包名?
当访问的类和当前类在同一包下时,新类名的前缀——包名可以省略不写。
补充:以后说类名的时候,如果带着包名描述,表示完整类名。
如果没有带包,描述的话,表示简类名。
java.util.Scanner 完整类名。
Scanner 简类名
此外,不同包下的简类名可以相同
com.Test和src.Test不一样,尽管简类名都一样,但是完整类名不一样。
package com.study;
public class Test01{
public static void main(String[] args){
com.study.HelloWorld hw = new com.study.HelloWorld();
System.out.println(hw);//com.study.HelloWorld@4517d9a3
HelloWorld hw1 = new HelloWorld();
//这里为什么能省略包名呢?
//这里的包名之所以可以省略,是因为HelloWorld和Test01在同一个 package下
System.out.println(hw1);//com.study.HelloWorld@372f7a8d
}
}
那访问不同包下的类时,包名能省略吗?
不可以 !
此时就会使得代码很复杂,所以需要导包,使用import关键字
package com;
import com.study.HelloWorld;
public class Test02{
public static void main(String[] args){
com.study.HelloWorld hw = new com.study.HelloWorld();
System.out.println(hw);//com.study.HelloWorld@4517d9a3
//这里的包名能省略吗?
//不在同一个package下,包名不可以省略
/*
//错误: 找不到符号
//不能省略
HelloWorld hw1 = new HelloWorld();
System.out.println(hw1);
*/
//使用import关键字导包后就可以省略包名
HelloWorld hw1 = new HelloWorld();
System.out.println(hw1);//com.study.HelloWorld@372f7a8d
}
}
2. import关键字
1.什么时候不需要 import关键字
- java.lang包中的java文件不需要,比如 String.java就不用导包
- 访问同一个包中的类不需要导包
- 其他情况一律需要import导包
2. import怎么使用?
import 完整类名;
import 包名.星号//这个效率不低,因为编译器在编译的时候,会自动把变成具体的类名。
import java.util.Scanner; // 完整类名。
总结
1. package 语句会改变类的类名!
**类(class文件)路径必须和包名一致!**新的编译语句会自动生成与包名一致的类路径