黑马程序员技术交流社区

标题: 请大家来看看这个代码,求解释! [打印本页]

作者: 瓶中人    时间: 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  
               
     }  
}  
class CC{  
}  




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2