2013-10-25 44 views
0

簡而言之,我有一個包含多個變量和方法的抽象類。其他類擴展了這個抽象類,但是當我嘗試通過調用抽象類中的getter方法來讀取抽象類中的私有變量時,它將返回null作爲變量的值。如何讀寫抽象類的變量

public class JavaApplication { 

    public static void main(String[] args) { 
     NewClass1 n1 = new NewClass1(); 
     NewClass2 n2 = new NewClass2(); 

     n1.setVar("hello"); 
     n2.print(); 

    } 
} 



public class NewClass1 { 

    public String firstWord; 

    public void setVar(String var) { 
     firstWord = var; 
    } 

    public String getVar() { 
     return firstWord; 
    } 

} 



public class NewClass2 extends NewClass1{ 

    public void print() { 
     System.out.println(makeCall()); 
    } 

    public String makeCall() { 
     return getVar(); 
    } 

} 

仍打印出null。

+2

請發表實際的代碼。正如所寫的,你的'子類'類不會被編譯。 – rgettman

+0

爲什麼「System.out.println(var2)」不在方法中? – BobLoblaw

+0

只需編譯代碼('String var2 = getVar1();'),將它放在方法中就行了。沒有必要保護''。 –

回答

1

直到String被初始化,它將爲空。您應該在抽象類中有一個構造函數來設置它。

public abstract class Command 
{ 
    String firstWord; // = null 

    protected Command(){} 

    protected Command(String w) 
    { 
     firstWord = w; 
    } 
    //... 
} 

public class Open extends Command 
{ 
    public Open() 
    { 
     this("your text"); 
    } 

    public Open(String w) 
    { 
     super(w); 
    } 

    // ... 
} 

如果您需要修改firstWord字符串每次​​被稱爲那麼它可能沒有必要使用帶有String參數的構造函數(我加了一個默認的構造函數上面)。不過,如果你做這種方式然後要麼

  • 必須確保setFirstWord()getFirstWord()之前調用,或
  • 處理案件時getFirstWord()回報null。這可以通過簡單地使用默認值(可能由每個子類決定)或其他方式來實現,如未能執行。

因爲我不知道你的實現的所有細節,我不能告訴你更多的信息。

+0

剛剛向Command添加了一個構造函數。現在,它的所有子類都需要一個帶參數的構造函數 – user2891805

+0

這個firstWord應該完成什麼?是的,如果你沒有默認的構造函數,那麼所有的子類必須用適當的參數調用super()。每個子類是不同的嗎? – clcto

+0

每個子類都有一個執行方法,該方法覆蓋了抽象類(超級類)中的執行方法。各種執行方法的內容需要使用抽象類中的變量並能夠對其進行更改。現在他們不能,所以這個程序沒有按照它應該的那樣工作。 – user2891805