2012-01-06 111 views
5

如果您從聲明瞭某些成員變量的活動繼承,那麼如何在執行繼承的子類中訪問這些成員變量?在java中訪問繼承類變量

+0

另請檢查您是否沒有命名衝突:http://java.sys-con.com/node/46344如果您遇到意外的行爲 – jefflunt 2012-01-06 19:26:49

回答

7

publicprotected成員名稱可以通過this.memberName從任何構造函數或非static方法或初始值設定項來訪問。

private或包級別成員(從不同包中的子類訪問)不能直接訪問,需要通過非特權接口(如public獲取器)訪問。

2

如果成員被聲明爲private,或者如果它們是使用默認(包)訪問聲明的,並且您的子類位於不同的類中,則無法訪問這些變量。如果提供訪問器,則可以使用這些訪問器。否則,他們無法訪問。

如果成員宣佈protectedpublic,那麼你訪問他們,如果他們在自己的類(this.var,或者只是var如果沒有歧義)被宣佈。如果在子類中有一個與超類同名的成員,則可以使用super.var來訪問超類變量。

+0

downvoter會謹慎解釋嗎? – 2012-01-06 19:37:17

+1

+1以反駁無法解釋的反對票。 – mre 2012-01-06 19:40:15

4
class A { 
    protected int a = 3; 
} 

class B extends A { 
    protected int b = 2; 

    void doIt() { 
     System.out.println("super.a:" + super.a); 
     System.out.println("this.b: " + this.b); 
    } 
} 
+0

你不需要'super'關鍵字。 – mre 2012-01-06 19:29:49

+1

沒錯。但這是一個初學者的問題。所以,我想說清楚。 – ollins 2012-01-06 19:33:13

+2

如果該字段被子類中的字段隱藏,則只需要'super'關鍵字。 – 2012-01-06 19:38:13

1

如其他人所述,可通過子類中的this.field訪問公共和受保護字段。包專用字段也可以用相同的方式訪問,但只有當子類與父代在同一個包中。

私有字段不能以這種方式訪問​​,但如果安全設置允許,可以使用Java reflection訪問它們。一般不建議這樣做(私人成員通常是私人的),但在某些情況下它可能很有用,例如訪問私人類成員進行代碼測試。請參閱the answers to this question瞭解如何以這種方式使用反射。