關于java的包Package中同名類的沖突及其理解
java的包Package中同名類的沖突及理解
在一個項目中建立三個包分別為
chapter2pack2pack3

其中初始化(主)函數(shù)在InitialTelphone類里,看圖顯然是在chapter2包里。
這是chapter2包下的Telphone類實現(xiàn)
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類實現(xiàn)
package pack2;
public class Telphone {
public Telphone() {
// TODO Auto-generated constructor stub
System.out.println("第二個包的類Telphone");
}
}這是pack3包下的Telphone類實現(xiàn)
package pack3;
public class Telphone {
public Telphone() {
// TODO Auto-generated constructor stub
System.out.println("第三個包的Telphone類");
}
}chapter2包下的initialTelphone類實現(xiàn)
package chapter2;
public class InitalTelphone {
public static void main(String[] args) {
//通過無參方法生成對象
Telphone tel=new Telphone();
}
}在initialTelphone文件寫沒有導入包pack2.Telphone和pack3.Telphone
執(zhí)行程序?qū)玫揭韵陆Y(jié)果:
第一個包的Telphone類
若在initialTelphone文件中導入pack2.telphone
intialTelphone代碼改變?nèi)缦拢?/p>
package chapter2;
import pack2.Telphone;
public class InitalTelphone {
public static void main(String[] args) {
//通過無參方法生成對象
Telphone tel=new Telphone();
}
}執(zhí)行程序會發(fā)現(xiàn)結(jié)果為:
第二個包的類Telphone
但是如果導入的包形式為:impor pack2.*;
package chapter2;
import pack2.*;
public class InitalTelphone {
public static void main(String[] args) {
//通過無參方法生成對象
Telphone tel=new Telphone();
}
}程序運行結(jié)果又發(fā)生了變化:
第一個包的Telphone類
如果同時導入pack2.Telphone和pack3.Telphone
則會發(fā)生包沖突報錯
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);
}
}程序執(zhí)行結(jié)果為:
第三個包的Telphone類
顯然如果把pack3.Telphone格式也改為pack3.*,結(jié)果可想而知:
第一個包的Telphone類
但是如果把chapter2中的Telphone類給刪除了
導入包的格式為pack2.*;pack3.*;
運行程序就會出現(xiàn)沖突錯誤:
The type Telphone is ambiguousThe type Telphone is ambiguous
如果只導入Pack2.*或者只導入Pack3.*則又可以運行成功:
(import Pack2.*;)結(jié)果:第二個包的Telphone類
(import Pack3.*;)結(jié)果:第三個包的Telphone類
通過上述程序的測試,
我知道了包重名類的簡單運行機制:
1、如果沒有導入任何包,主函數(shù)運行時創(chuàng)建類的實例首先從自己所在的包里面找
2、如果導入一個包,并且導入該包的形式精確到重名的類,則主函數(shù)創(chuàng)建重名類實例將會從導入的包里找
3、如果導入一個包,包的格式為 import 包名.*;類型的,則主函數(shù)創(chuàng)建重名類實例時首先在主函數(shù)自己所在的包里找,找不到了再去導入的.*包里面找
4、如果導入多個包,并且導入的多個包中只有一個導入類型精確到重名類,則主函數(shù)創(chuàng)建重名類實例時在導入精確到類的包里面找。
5、如果導入多個包,并且讀入的多個包中都是(import 包名.*;)類型的,主函數(shù)創(chuàng)建重名類實例時直接在自己所在包里找;如果找不到,并且導入的多個包里有兩個同名類就會報錯 ;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot如何返回Json數(shù)據(jù)格式
這篇文章主要介紹了SpringBoot如何返回Json數(shù)據(jù)格式問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03
Java面試題沖刺第三十天--數(shù)據(jù)庫(6)
這篇文章主要為大家分享了最有價值的三道關于數(shù)據(jù)庫的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構和算法相關的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下2021-09-09

