java的包Package中同名类的冲突及其理解 布满荆棘的人生 2022-06-13 14:37 412阅读 0赞 在一个项目中建立三个包分别为: chapter2 pack2 pack3 ![Center][] 其中初始化(主)函数在InitialTelphone类里,看图显然是在chapter2包里。 这是chapter2包下的Telphone类实现 package chapter2; public class Telphone { //属性 private float cup; private float screen; private float mem; //get set方法 public float getScreen() { return screen; } public void setScreen(float newScreen) { screen=newScreen; } //方法 public Telphone() { System.out.println("第一个包的Telphone类"); } } 这是pack2包下的Telphone类实现 package pack2; public class Telphone { public Telphone() { // TODO Auto-generated constructor stub System.out.println("第二个包的类Telphone"); } } 这是pack3包下的Telphone类实现 package pack3; public class Telphone { public Telphone() { // TODO Auto-generated constructor stub System.out.println("第三个包的Telphone类"); } } chapter2包下的initialTelphone类实现: package chapter2; public class InitalTelphone { public static void main(String[] args) { //通过无参方法生成对象 Telphone tel=new Telphone(); } } 在initialTelphone文件写没有导入包pack2.Telphone和pack3.Telphone 执行程序将会得到以下结果: 第一个包的Telphone类 若在initialTelphone文件中导入pack2.telphone intialTelphone代码改变如下: package chapter2; import pack2.Telphone; public class InitalTelphone { public static void main(String[] args) { //通过无参方法生成对象 Telphone tel=new Telphone(); } } 执行程序会发现结果为: 第二个包的类Telphone 但是如果导入的包形式为:impor pack2.\*; package chapter2; import pack2.*; public class InitalTelphone { public static void main(String[] args) { //通过无参方法生成对象 Telphone tel=new Telphone(); } } 程序运行结果又发生了变化: 第一个包的Telphone类 如果同时导入pack2.Telphone和pack3.Telphone 则会发生包冲突报错 The import pack3.Telphone collides with another import statement package chapter2; import pack2.Telphone; import pack3.Telphone;; public class InitalTelphone { public static void main(String[] args) { //通过无参方法生成对象 Telphone tel=new Telphone(); } } 但是把pack2.telphone格式改为pack2.\*,pack3.Telphone保持不变 package chapter2; import pack2.*; import pack3.Telphone;; public class InitalTelphone { public static void main(String[] args) { //通过无参方法生成对象 Telphone tel=new Telphone(); //有参构造方法生成对象 //Telphone tel2=new Telphone(4.0f,3.0f,1.5f); } } 程序执行结果为: 第三个包的Telphone类 显然如果把pack3.Telphone格式也改为pack3.\*,结果可想而知: 第一个包的Telphone类 但是如果把chapter2中的Telphone类给删除了 导入包的格式为pack2.\*;pack3.\*; 运行程序就会出现冲突错误: The type Telphone is ambiguous The type Telphone is ambiguous 如果只导入Pack2.\*或者只导入Pack3.\*则又可以运行成功: (import Pack2.\*;)结果:第二个包的Telphone类 (import Pack3.\*;)结果:第三个包的Telphone类 通过上述程序的测试,我知道了包重名类的简单运行机制: 1 如果没有导入任何包,主函数运行时创建类的实例首先从自己所在的包里面找 2 如果导入一个包,并且导入该包的形式精确到重名的类,则主函数创建重名类实例将会从导入的包里找 3 如果导入一个包,包的格式为 import 包名.\*;类型的,则主函数创建重名类实例时首先在主函数自己所在的包里找,找不到了再去导入的.\*包里面找 4 如果导入多个包,并且导入的多个包中只有一个导入类型精确到重名类,则主函数创建重名类实例时在导入精确到类的包里面找。 5 如果导入多个包,并且读入的多个包中都是(import 包名.\*;)类型的,主函数创建重名类实例时直接在自己所在包里找;如果找不到,并且导入的多个包里有两个同名类就会报错 ; [Center]: /images/20220613/598306cdbfcf49a2abe6dfc1239dd123.png
还没有评论,来说两句吧...