如何解决类名冲突呢?
Java兴义了名字空间:包
报名 + 类名 = 完整类名
如下代码
package xiaoming;
public class Person{
}
package xiaohong;
public class Person{
}
- 小明的Person类:xiaoming.Person
- 小红的Person类:xiaohong.Person
这样就可以区分开来了
Jvm只看完整类名,因此,只要包名不同,类就不同:
- xiaoming.Person
- xiaohong.Person
包可以是多层结构
- java.util.Arrays
包没有父子关系
- java.util和java.util.zip是不同的包,两者没有任何关系
因为JVM在家class并执行代码时,总是使用class的完整类名
- xiaoming.Person
- java.lang.String
- java.util.Arrays
- Hello(没有定义package,不推荐)
编译器编译后的class文件中全部是完整类名
这也就起到了用package来区分class的原理
包作用域
位于同一个包的类,可以访问包作用域的字段和方法:
- 不用public,protected、private修饰的字段和方法就是包作用域
package hello;
public class World{
static int findMac(int[] ns)
}
package hello;
public class Map{
int price;
void setPrice(int price){
}
}
引用其他类
- 使用完整类名
- 先impport, 再使用类名
- 可以使用*(但是不推荐)
静态导入
- import static 可以导入一个类的静态字段和静态方法
- import static很少使用
import static java.lang.System.*;
public class Main{
public static void main(String[] args){
//Sysout
out.println("Hello, world");
}
}
查找class
编译器最终编译出的.class文件只使用完整类名,因此,在代码中,编译器遇到一个class名称时:
- 如果是完整类名,就直接根据完整类名查找
如果是简单类名:
- 查找当前package的class
- 查找import的class
- 查找java.lang包的class
如果无法确定类名:
- 编译错误
import java.text.Format;
java.util.List list;//->java.util.List
Format format - null; //>java.text.Format
String s = 'hi'; // ->java.lang.String
System.out.println(s); // -> java.lang.System
MessageFormat mf = null; // Compile error;
//MessageFormat cannot be resolved to a tye
自动import
在编写代码的时候,编译器有几条规则
编写class时:
- 默认自动import当前package的其他class
- 默认自动import java.lang.*
我们在使用的时候有以下几点需要注意
报名使用倒置的域名确保唯一:
Org.apache
org.apache.commons.log不要和java.lang包的类崇明:
String.System,Runtime….- 不要和JDK常用类重名:
java.util.List,java,text.Fromat,java.math.Biginteger
- 不要和JDK常用类重名:
以上内容来自廖雪峰老师的飞扬学院。