class A{
    int a = 5;
}
class B extends A{
    int a = 8;
}public class 羽毛 {
    
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.a);
        
        B b = new B();
        System.out.println(b.a);
    }
}
为什么a.a会是5?????

解决方案 »

  1.   

    这么跟你说吧
    把子类赋值给父类,时,所有子类自己所拥有的特征都被屏蔽了,而所有子类覆盖父类的东西也都被还原,这是继承的一个规律,在你这里,当你把子类赋给父类后,根据这个规律,子类覆盖父类的东西被还原了,所以它是5另外,如果强制把父类的实例幅给子类时候将会出现错误。有一种特殊的赋值方式:
    先把子类的实例赋给父类      这个时候,这个实例在子类的所有特征都被屏蔽了,所有父盖父类的东西也被还原了
    然后我们再把这个实例赋给子类(需要强制转换),那么这个时候,将不会出现错误,而且这个实例所拥有的特征将重新被激活,并且它覆盖父类的东西也将重新产生效应。
    比如class A{
        int a = 5;
    }
    class B extends A{
        int a = 8;
        int b=9;
    }class Test{
        
        public static void main(String[] args) {
            A a = new B();//如果这里改为A a = new A();那么B b =(B)a;处将会出错
            System.out.println(a.a);//这里是5,a被还原了
            //System.out.println(a.b);//这里将出错,不能访问b
            B b =(B)a;
            System.out.println(b.a);//这里是8,a又回来了
            System.out.println(b.b);//这里没错误,b又重新被激活了。
        }
    }
      

  2.   

    class A{
        int a = 5;
        public int getA()
        {
         return a;
        }
    }
    class B extends A{
    int a = 8;
        public int getA()
        {
         return a;
        }
    }public class Test {
        
        public static void main(String[] args) {
            A a = new B();
            System.out.println(a.getA());
            
            B b = new B();
            System.out.println(b.getA());
        }
    }