2013-04-07 58 views
0

我正在編寫一個類的程序。當我運行程序時,字母表的值永遠不會粘住,當我在我的子類中使用toString()時,字母總是爲空。我知道在第二個構造函數中,this.alphabet等於我想要它相等但在此之後它失去了它的價值。奇怪的部分是machineName保持它的價值。我對java和stackoverflow仍然很陌生,所以我很抱歉如果我做了一些虛無的事情。此外,我不能改變我只能實現它的方法或變量。Java中抽象類的問題

public abstract class AbstractDFA{ 

private String machineName; 
private String alphabet; 

public AbstractDFA(String nameofmachine) 
{  
    StringBuilder b = new StringBuilder(); 
    for (int i = 0; nameofmachine.charAt(i) != '.'; i++) 
    { 
    b.append(nameofmachine.charAt(i)); 
    } 
    machineName = b.toString(); 

} 

public AbstractDFA(String nameofmachine, String alphabet) 
{ 
    this.alphabet = alphabet; 
    this.machineName = nameofmachine; 
    setAlphabet(this.alphabet); 
} 

public String toString() 
{ 
    return "Machine Name: " + machineName + "\nAlphabet: " + getAlphabet();; 
} 

public void setAlphabet(String alpha) 
{ 
    StringBuilder beta = new StringBuilder(); 
    beta.append("{"); 
    for (int i = 0; i < alpha.length(); i++) 
    { 
    beta.append(alpha.charAt(i)); 
    if (i != (alpha.length() - 1)) 
    { 
     beta.append(", "); 
    } 
    } 
    beta.append("}"); 
    alphabet = beta.toString(); 
} 

public String getAlphabet() 
{ 
    return alphabet; 
} 
} 

公共類DFA擴展AbstractDFA {

public DFA(String fileName){ 
    super(fileName); 
    readDFA(fileName); 
} 

public DFA(String name, String alpha, int numStates, int start, int[][] delta, boolean[] finalstates){ 
    super(name,alpha); 
    this.numberOfStates = numStates; 
    this.start = start; 
    this.delta = delta; 
    this.finalStates = finalstates; 
} 
} 
+0

這是一個抽象類。子類中是否有代碼可能影響您所看到的內容?例如你的一個子類重寫'setAlphabet'? – 2013-04-07 16:37:51

+0

據我所知並不如此。我編輯了代碼以包含來自子類的構造函數。我使用super.getAlphabet()時以及使用super.toString()打印出名稱和字母表時,只有其他時間訪問抽象類。 – 2013-04-07 16:49:36

回答

0
this.alphabet = alphabet; 
setAlphabet(this.alphabet); 

什麼是第一分配this.alphabet的目的,如果你只是要覆蓋該領域setAlphabet呢?正是如此:

public AbstractDFA(String nameofmachine, String alphabet) 
{ 
    this.machineName = nameofmachine; 
    setAlphabet(alphabet); 
} 

會更加清晰。

如果您在第一行之後,但在致電setAlphabet之前檢查this.alphabet的值,那麼可能setAlphabet根本無法按預期工作。

+0

這是一個很好的觀點。出於某種原因,我認爲通過做this.alphabet = alphabet;我允許在整個班級中使用可變字母表。但你有一點。 – 2013-04-07 16:36:45

0

您的抽象類有兩個構造函數,第一個不調用setAlphabet()方法。

+0

我不明白它是如何調用setAlphabet()方法的。當它在該構造函數中時,該字母變量沒有值。 – 2013-04-07 16:50:58

+0

如果你在你的子類中使用'public AbstractDFA(String nameofmachine)'構造函數(即在超類:es構造函數中使用'super(「some string」);''),'alphabet'永遠不會被初始化, toString()'被調用。如果你想提供一個默認的''alphabet'',你可以簡單地聲明它爲'private String alphabet =「abcd」;' – Theodor 2013-04-07 17:01:43

+0

另一種方法是讓第一個構造函數調用第二個構造函數'this(「some machine name」,「一些默認字母表「) – Theodor 2013-04-07 17:04:07