2016-06-14 60 views
0

所以我,如果我有兩個類是這樣的:擴展A類與B類,但在B類方法不能達到A級的屬性

public class A extends B{ 

    public String name = "Alpha" 

} 

public class B{ 

    public void revealAName(){ 
     print(this.name); 
    } 
} 

main(){ 
A newA = new A(); 
newA.revealName(); 
} 

在這種情況下,Eclipse中表示,屬性名沒有按不存在。爲什麼這麼說?爲什麼我不能在類B的方法中使用類A對象的屬性?我該如何解決它?

+0

你可以通過從A得到B而不是從B得到A – wero

+0

是的,但是我不能使用A對象來使用B方法...... –

+0

換句話說:你不能使用派生類的字段在超類 – wero

回答

0

B不知道什麼屬性在A,這兩個類可以單獨編譯。

但如果你改變它,以便B extends A,您可以從派生類(B)訪問name

class A { 
    String name = "Alpha"; 
} 

class B extends A { 
    public void revealAName(){ 
     print(this.name); 
    } 
} 
A a = new A(); 
a.name; // OK 
a.revealName(); // not OK 

B b = new B();  
b.name; // OK 
b.revealName(); // OK 

又見Oracle tutorial on inheritance

1

首先,有應該只有一個應該包含主要方法的公共類。其次,您正在使用繼承。因此,您必須將基類變量的訪問修飾符賦予「受保護」才能訪問您的子類。所以,它應該是:

保護的字符串名稱=「阿爾法」;

,因爲「默認」訪問修飾符不會允許子類訪問。從controlling access to members of class

 
Modifier  Class Package Subclass World 
public   Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

另一件事,你用「this.name」這是試圖讓「名」類B.這就是爲什麼它顯示錯誤的變量。

在使用繼承,你可以直接使用父類的變量,而無需使用任何對象引用,或者您可以在重複的變量名的情況下使用「超級」的對象引用。 You can refer this image in case of doubt ..

希望,它現在是明確的。

+0

我合併我的回答到你,因爲你是更詳細。如果您不批准,請隨時回滾編輯。 –

+0

謝謝...奧斯汀。這很好。 +1 –

相關問題