Java覆盖继承

时间:2013-09-17 14:52:01

标签: java inheritance override

正如我在这里可以理解的那样'a1'对于具有'a = 200'作为属性的B类对象进行了处理。因此,我预计程序将打印200.但为什么这个程序打印100而不是200?

    class A{
        int a=100;
    }

    class B extends A{
        int a=200;

    }

    class Demo{
        public static void main(String args[]){
            A a1=new B(); 
            System.out.println("a : "+a1.a); //Prints 100  
        }
    }

2 个答案:

答案 0 :(得分:9)

通过声明类B中与其父类A中的字段具有相同名称的字段,您基本上隐藏了该字段。但是,变量的字段访问是基于该变量的声明/静态类型完成的。

换句话说,字段不是像方法那样的多态实体。

在这种情况下,变量a1被声明为类型A。因此,访问的字段将是父类A中的字段。

答案 1 :(得分:4)

Docs

  

在一个类中,与超类中的字段同名的字段会隐藏超类的字段,即使它们的类型不同。在子类中,超类中的字段不能通过其简单名称引用。相反,必须通过super

访问该字段

因此,在您的情况下,超级calss a

隐藏的B类字段A

如果你想获得价值,

class Demo{
    public static void main(String args[]){
        A a1=new B(); 
        System.out.println("a : "+a1.a); //Prints 200  
    }
}
class A{
    int a=100;
}

class B extends A{
     public B() {
        super.a=200;
    }

}