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可代表任何非基本类型对象。

的重载解析过程是分两阶段运行的。第一阶段选取所有可获得并且可应用的方法或构造
器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一个。如果一个方法或构造器
可以接受传递给另一个方法或构造器的任何参数,那么我们就说第一个方法比第二个方法缺
乏精确性,调用时就会选取第二个方法。

使用上面的规则来解释该程序:构造器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
本文地址:https://www.zhiletu.com/archives-242.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微