为什么在向上转换期间无法访问此数据成员?

时间:2015-09-01 19:44:45

标签: java

我在这里有一个超级和子类,我正在尝试学习预告。

class Demo1{
    int x=10;

    void show(){
        System.out.println(this.x);
        System.out.println(this.s);
     }
}

和Child类:

class Demo2 extends Demo1{

    int ashish=200;
    String s="Nana";

    public static void main(String... args){
        Demo1 d=new Demo2();
        d.show();
    }
}

在这里,我正在尝试打印String s。为什么它显示变量不存在的编译错误? 据我所知,在upcasting期间..创建的对象实例具有子类的所有数据成员,并且它的引用被赋予父类变量,那么为什么this没有引用Demo2的数据成员? / p>

2 个答案:

答案 0 :(得分:2)

class Demo1{
int x=10;

void show(){
    System.out.println(this.x);
    System.out.println(this.s);
 }
}

Demo1必须能够作为独立单位存在。如果您创建了Demo1的实例,它本身就没有任何s,所以这将是荒谬的。

abstract class Demo1{
    int x=10;
    abstract String s();

    void show(){
       System.out.println(this.x);
       System.out.println(this.s());
    }
}
class Demo2 extends Demo1 {
    String s = "foo";
    public String s() { return s; }
}

这明确表明Demo1有一个"洞" - 实现详细信息子类型需要填写,告诉它如何获取s

答案 1 :(得分:0)

超类对任何子类的成员(字段和方法)一无所知。因此,不允许在超类中使用s字段,因此会出现编译器错误。