正如我在这里可以理解的那样'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
}
}
答案 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;
}
}