为什么分配给子类的引用不能访问子类的成员

时间:2010-12-18 23:42:04

标签: java

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字段。但是,这会产生编译错误。为什么呢?

4 个答案:

答案 0 :(得分:4)

您无法从父类引用访问子类的实例变量,因为绑定是在编译时(并且在编译期间很明显'a'不是实现1的一部分),不像被覆盖的方法是绑定运行时即动态绑定

答案 1 :(得分:0)

我认为您需要将其标记为受保护或公开,以供您的后代阅读。

e.g。

protected String s;

答案 2 :(得分:0)

尝试过,似乎没有给出任何错误,并且完全按照代码段显示。

打印出“s1”然后“s2”

虽然声明变量可见性通常是一种好习惯。

答案 3 :(得分:0)

这与参考的表观类型与参考的实际类型有关。

如果你这样做:

  pract1 p = new pract();

然后表观类型是“pract1”。而实际的类型是“实践”

表观类型在编译时是已知的。也就是说,编译器会根据表观类型进行类型检查。因此,当您尝试访问子类的成员时,就编译器而言,超类没有这些成员,因此它是一个错误。

这是必要的,因为对实践1的引用可能不一定是指实例的实例。编译器没有机会。

然而,在运行时,使用实际类型。