打字猴:1.70043894e+09
1700438940
1700438941 System.out.println(“abs(100)=”+abs(-100));
1700438942
1700438943 }
1700438944
1700438945 }
1700438946
1700438947 很简单的例子,打印出静态常量PI值,计算-100的绝对值。现在的问题是:如果我们在Client类中也定义了PI常量和abs方法,会出现什么问题?代码如下:
1700438948
1700438949 import static java.lang.Math.PI;
1700438950
1700438951 import static java.lang.Math.abs;
1700438952
1700438953 public class Client{
1700438954
1700438955 //常量名与静态导入的PI相同
1700438956
1700438957 public fnal static String PI=“祖冲之”;
1700438958
1700438959 //方法名与静态导入的相同
1700438960
1700438961 public static int abs(int abs){
1700438962
1700438963 return 0;
1700438964
1700438965 }
1700438966
1700438967 public static void main(String[]args){
1700438968
1700438969 System.out.println(“PI=”+PI);
1700438970
1700438971 System.out.println(“abs(100)=”+abs(-100));
1700438972
1700438973 }
1700438974
1700438975 }
1700438976
1700438977 以上代码中,定义了一个PI字符串类型的常量,又定义了一个abs方法,与静态导入的相同。首先说好消息:编译器没有报错,接下来是不好的消息了:我们不知道哪个属性和哪个方法被调用了,因为常量名和方法名相同,到底调用了哪一个方法呢?我们运行一下看看结果:
1700438978
1700438979 PI=祖冲之
1700438980
1700438981 abs(100)=0
1700438982
1700438983 很明显是本地的属性和方法被引用了,为什么不是Math类中的属性和方法呢?那是因为编译器有一个“最短路径”原则:如果能够在本类中查找到的变量、常量、方法,就不会到其他包或父类、接口中查找,以确保本类中的属性、方法优先。
1700438984
1700438985 因此,如果要变更一个被静态导入的方法,最好的办法是在原始类中重构,而不是在本类中覆盖。
1700438986
1700438987
1700438988
1700438989
[ 上一页 ]  [ :1.70043894e+09 ]  [ 下一页 ]