2013-04-07 4 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'? –

+0

Не так далеко, насколько я знаю. Я редактировал код для включения конструкторов из подкласса. Единственный раз, когда я обращаюсь к абстрактному классу, я использую super.getAlphabet(), и когда я использую super.toString() для печати имени и алфавита. –

ответ

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

Какова цель первого присвоения this.alphabet, если вы только собираетесь перезаписать, что поле в setAlphabet так или иначе? Только это:

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

было бы намного понятнее.

Если вы проверяли значение this.alphabet после первой строки, но перед вызовом setAlphabet, тогда вероятность того, что setAlphabet просто не работает так, как вы этого хотите.

+0

Это хороший момент. По какой-то причине я подумал, что, выполнив это: alphabet = alphabet; Я разрешал использовать переменный алфавит во всем классе. Но у вас есть точка. –

0

У вас есть два конструктора для вашего абстрактного класса, и первый из них не вызывает метод setAlphabet().

+0

Я не вижу, как он мог бы вызвать метод setAlphabet(). Алфавитная переменная не имеет значения, когда она находится в этом конструкторе. –

+0

Если вы используете конструктор 'public AbstractDFA (String nameofmachine) из вашего подкласса (т. Е. С помощью' super ("some string"); 'в конструкторе superclass: es),' alphabet' никогда не будет инициализироваться и, следовательно, toString() '. Если вы хотите предоставить алфавит по умолчанию, вы можете просто объявить его как «private String alphabet =« abcd »;' – Theodor

+0

Другим способом является то, что первый конструктор вызовет второй конструктор с 'this (" some machine name "," какой-то алфавит по умолчанию ")' – Theodor

Смежные вопросы