A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 瓶中人 中级黑马   /  2013-10-23 21:41  /  1547 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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 为什么呢?

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
B b = new B();
b.look(null);类B继承了A的无参构造器super();
b.look(b);调用了b方法的有参构造器!所以结果这就是B
希望对你有帮助!

评分

参与人数 1技术分 +1 收起 理由
狼王 + 1 赞一个!

查看全部评分

回复 使用道具 举报
只能作为你的参考,第二个输出"这就是B"你应该知道,至于第一个输出“这就是B”我是这样想的:我将第一个方法注释了,输出的结果是“这就是A”,我又增加了一个方法public void look(C c){System.out.println("这就是c")},结果报错“对look”的引用不明确,B中的方法look(A)和B中的方法look(c)都匹配,所以我猜想这可能是b对象调用自己的方法传递null参数调用首先就调用接收自己对象的方法

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
创建的是子类的对象,所以先调用子类的方法look(B b)
回复 使用道具 举报
在这个程序中,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{  
}  

评分

参与人数 1技术分 +1 收起 理由
杨增坤 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马