如果一個(gè)類中的方法及屬性與靜態(tài)導(dǎo)入的方法及屬性重名會(huì)出現(xiàn)什么問(wèn)題呢魏颓?我們先來(lái)看一個(gè)正常的靜態(tài)導(dǎo)入,代碼如下:
import static java.lang.Math.PI;
import static java.lang.Math.abs;
public class Client {
public static void main(String[] args) {
System.out.println("PI="+PI);
System.out.println("abs(100)=" +abs(-100));
}
}
很簡(jiǎn)單的例子吱晒,打印出靜態(tài)常量PI值甸饱,計(jì)算-100的絕對(duì)值。現(xiàn)在的問(wèn)題是:如果我們?cè)贑lient類中也定義了PI常量和abs方法仑濒,會(huì)出現(xiàn)什么問(wèn)題叹话?代碼如下:
import static java.lang.Math.PI;
import static java.lang.Math.abs;
public class Client {
//常量名與靜態(tài)導(dǎo)入的PI相同
public final static String PI="祖沖之";
//方法名與靜態(tài)導(dǎo)入的相同
public static int abs(int abs){
return 0;
}
public static void main(String[] args) {
System.out.println("PI="+PI);
System.out.println("abs(100)=" +abs(-100));
}
}
以上代碼中,定義了一個(gè)PI字符串類型的常量墩瞳,又定義了一個(gè)abs方法驼壶,與靜態(tài)導(dǎo)入的相同。首先說(shuō)好消息:編譯器沒(méi)有報(bào)錯(cuò)喉酌,接下來(lái)是不好的消息了:我們不知道哪個(gè)屬性和哪個(gè)方法被調(diào)用了热凹,因?yàn)槌A棵头椒嗤降渍{(diào)用了哪一個(gè)方法呢瞭吃?我們運(yùn)行一下看看結(jié)果:
PI=祖沖之
abs(100)=0
很明顯是本地的屬性和方法被引用了碌嘀,為什么不是Math類中的屬性和方法呢?那是因?yàn)榫幾g器有一個(gè)“最短路徑”原則:如果能夠在本類中查找到的變量歪架、常量股冗、方法,就不會(huì)到其他包或父類和蚪、接口中查找止状,以確保本類中的屬性、方法優(yōu)先攒霹。
因此怯疤,如果要變更一個(gè)被靜態(tài)導(dǎo)入的方法,最好的辦法是在原始類中重構(gòu)催束,而不是在本類中覆蓋集峦。