2015-09-01 68 views
-2

我在這裏有一個超級和一個子類,我試圖學習向上註解。爲什麼這個數據成員在註冊期間不可訪問?

class Demo1{ 
    int x=10; 

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

和子類:

class Demo2 extends Demo1{ 

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

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

在這裏,我試圖打印String s。爲什麼它顯示變量不存在的編譯錯誤? 據我所知,在上傳過程中,創建的對象實例擁有子類的所有數據成員,並且其引用被賦予父類變量,那麼爲什麼this不引用Demo2的數據成員?

+3

如果沒有Demo2類或'upcast',這將無法編譯 - 爲什麼? *相同*理由成立。 – user2864740

回答

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

0

超類不知道任何有關任何子類的成員(字段和方法)。因此,在超類中使用s字段是不允許的,因此會出現編譯器錯誤。

相關問題