Java常见疑难问题-类9
34. 参数兼容的方法重载
public class Confusing {
private Confusing(Object o) {
System.out.println(“Object”);
}
private Confusing(double[] dArr) {
System.out.println(“double array”);
}
public static void main(String[] args) {
new Confusing(null);
}
}
上面的程序打印的是”double array”,为什么?
null可代表任何非基本类型对象。
Java的重载解析过程是分两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造
器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器
可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺
乏精确性,调用时就会选取第二个方法。
使用上面的规则来解释该程序:构造器Confusing(Object o)可以接受任何传递
Confusing(double[] dArr)的参数,因此Confusing(Object o)相对缺乏精确性,所以
Confusing(null)会调用Confusing(double[] dArr)构造器。
如果想强制要求编译器选择一个自己想要的重载版本,需要将实参强制转型为所需要的构造
器或方法的参数类型:如这里要调用Confusing(Object o)本版,则这样调用:
Confusing((Object)null)。
如果你确实进行了重载,那么请确保所有的重载版本所接受的参数类型都互不兼容,这样,
任何两个重载版本都不会同时是可应用的。
35. 静态方法不具有多态特性
class A1 {
public static void f() {
System.out.println(“A1.f()”);
}
}
class A2 extends A1 {
public static void f() {
System.out.println(“A2.f()”);
}
}
class T {
public static void main(String[] args) {
A1 a1 = new A1();
A1 a2 = new A2();
// 静态方法不具有多态效果,它是根据引用声明类型来调用
a1.f();// A1.f()
a2.f();// A1.f()
}
}
对静态方法的调用不存在任何动态的分派机制。当一个程序调用了一个静态方法时,要被调
用的方法都是在编译时就被选定的,即调用哪个方法是根据该引用被声明的类型决定的。上
面程序中a1与a2引用的类型都是A1类型,所以调用的是A1中的f()方法。
声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 嗅谱网
转载请注明:转自《Java常见疑难问题-类9》
本文地址:http://www.xiupu.net/archives-242.html
关注公众号:
微信赞赏
支付宝赞赏