class pract1 {
String s="s1";
public String getS()
{
return s;
}
}
class pract extends pract1{
String a="s2";
public String getS() {
return a;
}
public static void main(String[] args) {
pract1 parent= new pract1();
pract child= new pract();
parent=child;
System.out.println(parent.a); // syntax error it should be (parent.s);
System.out.println(parent.getS());
}
}
我将child
分配给parent
。使用parent
引用,我应该能够访问a
字段。但是,这会产生编译错误。为什么呢?
答案 0 :(得分:4)
您无法从父类引用访问子类的实例变量,因为绑定是在编译时(并且在编译期间很明显'a'不是实现1的一部分),不像被覆盖的方法是绑定运行时即动态绑定
答案 1 :(得分:0)
我认为您需要将其标记为受保护或公开,以供您的后代阅读。
e.g。
protected String s;
答案 2 :(得分:0)
尝试过,似乎没有给出任何错误,并且完全按照代码段显示。
打印出“s1”然后“s2”
虽然声明变量可见性通常是一种好习惯。
答案 3 :(得分:0)
这与参考的表观类型与参考的实际类型有关。
如果你这样做:
pract1 p = new pract();
然后表观类型是“pract1”。而实际的类型是“实践”
表观类型在编译时是已知的。也就是说,编译器会根据表观类型进行类型检查。因此,当您尝试访问子类的成员时,就编译器而言,超类没有这些成员,因此它是一个错误。
这是必要的,因为对实践1的引用可能不一定是指实例的实例。编译器没有机会。
然而,在运行时,使用实际类型。