1.作用:用于解决类名冲突
例如:
小军写了一个Arrays
类,恰好JDK也自带了一个Arrays
类,两个都需要的情况下,可以用包来解决类名冲突。
2.定义:
package,是一种定义的名字空间,一个类总是属于某个包
例如:
一个Person,完整的名称是 某个包名.Person
3.注意
①.在定义一个class的时候,需要在class中第一行声明这个class属于哪个包。
②.包存在多级结构,但不属于继承关系,例如:java.util和java.util.zip属于不同的包。
③.没有写包名的类会有默认的包,但容易造成类名冲突。
④.所有Java文件对应的目录层次要和包的层次一致。
4.包作用域
不用 public、protected、private修饰的方法或字段,就是包作用域。即在同一个包下,class可以对于包内的class进行调用。
例如:
package hello;
public class Person {
// 包作用域:
void hello() {
System.out.println("Hello!");
}
}
package hello;
public class Main {
public static void main(String[] args) {
Person p = new Person();
p.hello(); // 可以调用,因为Main和Person在同一个包
}
}
5.import
在不同的包的情况下,对于class的调用有三种方法。
①.在使用另一个包的class时,完整写出类名。
例如:
zhangsan.Person 调用lisi.ls.Person
// Person.java
package zhangsan;
public class Person {
public void run() {
lisi.ls.Person person =new lisi.ls.Person();
}
}
2.使用import
// Person.java
package zhangsan;
// 导入完整类名:
import lisi.ls.Person;
public class Person {
public void run() {
Person person = new Person();
}
}
注意:
①.在使用import时,可以使用*,表示导入该包下的所有类,不包括子包中的类。
例如:导入ls下的所有类 import lisi.ls.*;
一般不推荐这样的写法,很难找到某个类属于哪个包,就比如现在,不知道Person是否属于lisi.ls包下的类。
3.import static
可以导入一个类的静态字段和静态方法
package main;
// 导入System类的所有静态字段和静态方法:
import static java.lang.System.*;
public class Main {
public static void main(String[] args) {
// 相当于调用System.out.println(…)
out.println("Hello, world!");
}
}
Java编译器最终编译出的.class文件只使用完整类名,因此,在代码中,当编译器遇到一个class名称时:
如果是完整类名,就直接根据完整类名查找这个class;
如果是简单类名,则按下面顺序依次查找:
查找当前的package是否存在在个class;
查找import的包是否包含这个class;
查找java.lang 包是否包含这个class。
例如:
// Main.java
package test;
import java.text.Format;
public class Main {
public static void main(String[] args) {
java.util.List list; // ok,使用完整类名 -> java.util.List
Format format = null; // ok,使用import的类 -> java.text.Format
String s = "hi"; // ok,使用java.lang包的String -> java.lang.String
System.out.println(s); // ok,使用java.lang包的System -> java.lang.System
MessageFormat mf = null; // 编译错误:无法找到MessageFormat: MessageFormat cannot be resolved to a type
}
}
编写class的时候,编译器会自动帮我们做两个import动作:
默认自动import当前package的其他class;
默认自动import java.lang.*。
注意:
①.自动导入的是java.lang包,但类似java.lang.reflect这些包仍需要手动导入。
②.导入的类名中有相同的,一个使用import,另一个就必须写完整类名。
③.自行定义类名的时候,不要将java.lang包的类和JDK常用类重名,即不要使用String、System、java.uitl.List等等。