2013-09-29 61 views
0

我有下面的Java代碼的子類的變量:訪問經由接口

public interface Person { 
    int eat (String food); 
    int sleep (int time); 
    boolean coitus (person partner); 
} 

public class Citizen implements Person { 
    private int passion; 
    private int morality; 
    private String party; 
    public citizen() { 
     passion = 0; 
     morality = 100; 
     party = "Democrat"; 
    } 
    public boolean coitus (person partner) { 
     passion += 10; 
     morality -= 10; 
     return true; 
    } 
    ... rest of implementation methods 
} 

並在主方法中,我有這些行:

Person Jon = new Citizen(); 
System.out.println(Jon.party); 

第二行失敗。我無法通過接口訪問子類的變量。爲什麼是這樣?我們可以用方法很好地做到這一點:

Person Jon = new Citizen(); 
Person Romney = new Citizen(); 
System.out.println(Jon.coitus(Romney)); 

上述三行工作得很好 - 換句話說,接口的方法是動態的。爲什麼它與變量不一樣,有沒有辦法解決這個問題?

+1

嘗試閱讀關於Java約定..類和接口是大寫,變量不是。閱讀代碼更容易。 – porfiriopartida

+0

對不起,我忘了大寫的名字。現在會做。 –

回答

3

聚會是一個私人實例屬性,您需要編寫一個公共getter來訪問它。 另外,你應該是執行你的界面而不是延伸吧。

我建議用大寫字母開始您的類和接口名稱,這是Java中的一般命名約定。另一方面,變量不應以大寫字母開頭。我建議你閱讀Code Convention for the Java Programming Language

public class Citizen implements Person { 
    public String getParty() { 
     return party; 
    }  
} 
+0

所以如果派對是靜態的,我可以在沒有公共獲取者的情況下訪問它? –

+2

您必須區分訪問級別修飾符(public,private,protected)和屬性是實例還是類屬性。 如果您的實例屬性派對是公開的,您可以直接訪問它:jon.party。如果它是靜態的,你可以通過你的類訪問它:Jon.party。同樣在這種情況下,它的狀態對於這個類的所有實例都是一樣的,這不是你想要的。 底線,爲您需要訪問的每個私有屬性添加一個公共getter。 –