请原谅我的无知。以下代码输出
A1 has name A1
B1 has name A1
但我期待
A1 has name A1
B1 has name B1
as String name在子类中重新定义。谁能解释一下?
代码段:
public class Client {
public static void main(String[] args) {
A1 a = new A1();
A1 b = new B1();
System.out.println(a.greeting() + " has name " + a.getName());
System.out.println(b.greeting() + " has name " + b.getName());
}
}
class A1 {
String name = "A1";
String getName() {
return name;
}
String greeting() {
return "class A1";
}
}
class B1 extends A1 {
String name = "B1";
String greeting() {
return "class B1";
}
}
答案 0 :(得分:2)
通过在子类中声明一个与父类中声明的变量同名的变量,您可以隐藏父类中的变量。子类中的变量是与父类中具有相同名称的变量不同的变量。您可以尝试这样的事情:
class B1 extends A1 {
public B1(){
name = "B1";
}
String greeting() {
return "class B1";
}
}
答案 1 :(得分:1)
您不能覆盖getName
,因此来自B1
的{{1}}使用A1
实施,它会从name
返回一个字段A1
,并且无法访问name
中的B1
。如前所述,这称为变量隐藏。
答案 2 :(得分:0)
这是一个Oracle JavaDoc,它更详细地介绍了用Java覆盖和隐藏的内容。
http://docs.oracle.com/javase/tutorial/java/IandI/override.html
另见SO文章,关于覆盖Java实例变量
Is there a way to override class variables in Java?
我认为这应该有助于解释为什么会发生这种情况,它主要与您如何实例化变量有关。