标题: 请大家来看看这个代码,求解释! [打印本页] 作者: 瓶中人 时间: 2013-10-23 21:41 标题: 请大家来看看这个代码,求解释! public class B extends A
{
public void look(B b){
System.out.println("这就是B");
}
public void look(A a){
System.out.println("这就是A");
}
public void look(Object o){
System.out.println("这就是Object");
}
public static void main(String[] args)
{
B b = new B();
b.look(null);
b.look(b);
}
}
class A
{
}
结果是:这就是B 这就是B 为什么呢?作者: 漫步人 时间: 2013-10-23 22:11
B b = new B();
b.look(null);类B继承了A的无参构造器super();
b.look(b);调用了b方法的有参构造器!所以结果这就是B
希望对你有帮助!作者: 终结者 时间: 2013-10-23 22:52
只能作为你的参考,第二个输出"这就是B"你应该知道,至于第一个输出“这就是B”我是这样想的:我将第一个方法注释了,输出的结果是“这就是A”,我又增加了一个方法public void look(C c){System.out.println("这就是c")},结果报错“对look”的引用不明确,B中的方法look(A)和B中的方法look(c)都匹配,所以我猜想这可能是b对象调用自己的方法传递null参数调用首先就调用接收自己对象的方法作者: 王飚 时间: 2013-10-24 12:27
创建的是子类的对象,所以先调用子类的方法look(B b)作者: Yuan先生 时间: 2013-10-24 17:11
在这个程序中,null 可以赋值给Object和B,但是编译器会预先赋值给子类即B,所以会输出两次B,如果你再加一个C类为参数的话,编译器就会报错,因为编译器不知道赋值给B还是C,null 是一个模棱两可的类型
[plain] view plaincopy
public class B {
public void look(B b){
System.out.println("这就是B");
}
public void look(Object o){
System.out.println("这就是Object");
}
public void look(CC c){
System.out.println("这就是C");
}
public static void main(String[] args){
B b = new B();
b.look(null);//在此处报错:The method look(B) is ambiguous for the type B