2013-11-22 2 views
3

Я в настоящее время новичок в программировании на Java, и мне было поручено «Копировать и протестировать версию игры Hangman. Ваше решение будет включать в себя класс Hangman, конструктор которого выбирает слово, а метод угадывания обрабатывает каждый догадавшийся персонаж».Переменные в конструкторе?

Однако у меня есть небольшая проблема. Весь мой код работает и компилируется, и я уже написал метод угадывания, но у меня проблема с компиляцией. Я объявляю свои переменные экземпляра внутри моего конструктора. Я использую переменное слово String в моем коде в разных местах, и это не позволяет мне скомпилировать.
Сердце моей проблемы в этом.

public class Hangman{ 

public Hangman() { 

    String word = "p u m p k i n"; 
    String blanks = "_ _ _ _ _ _ _"; 


} 
int k = word.length(); ... rest code after this 

Когда я пытаюсь скомпилировать это, это не позволяет мне. Он говорит, что переменное слово равно null и отображает сообщение об ошибке. Почему я не могу использовать word.length(), чтобы найти значение длины? Невозможно ли использовать переменные, объявленные внутри конструктора, как переменные экземпляра? Простейшим обходным пути для этого является объявление переменных экземпляра вне конструктора (мой код работает безупречно, если я это делаю), но в подсказке мне нужно выбрать объявить слово внутри конструктора. Почему я не могу использовать слово String, которое Я объявил «тыкву» внутри конструктора, чтобы получить k? Использование переменных пробелов внутри моего метода тоже не работает.

Итак, что не так с этим? Как использовать переменные, объявленные в конструкторе как переменные экземпляра? Или это невозможно? Почему я не могу использовать слово String или String, объявленные в конструкторе? Спасибо.

+0

Переменные, объявленные в любой функции, являются локальными для этой функции, и их область действия находится только в этой функции. Поэтому нет необходимости использовать переменные, объявленные в конструкторе как переменные экземпляра. Вы можете объявить переменные экземпляра и инициализировать их внутри своего конструктора. –

ответ

4

Каждый раз, когда вы создаете локальные переменные в конструкторе.

public Hangman() { 

    String word = "p u m p k i n"; 
    String blanks = "_ _ _ _ _ _ _"; 


} 

То, что вы должны сделать, это Присвоить значения в constructor членам.

String word; 
    String blanks; 
    public Hangman() { 
     word = "p u m p k i n"; 
     blanks = "_ _ _ _ _ _ _"; 

    } 

Более того, не имеет смысла, что они не попадают в конструкторы args и не назначают их в конструкторе.

Это должно быть

public Hangman (String word, String blanks) { 
         this.word = word; 
         this.blanks = blanks; 

        } 
1

Вы должны сделать следующее

public class Hangman{ 

private String word; 
private String blanks 

public Hangman() { 

    word = "p u m p k i n"; 
    blanks = "_ _ _ _ _ _ _"; 


} 
int k = word.length(); ... rest code after this 

Так в основном вы должны определить переменные, как переменные экземпляра, а не локальные переменные (которые вы сделали). Если вы хотите получить доступ к нему в своем классе позже, то он должен быть таким, поэтому вы должны сделать его переменными экземпляра. Также для переменных экземпляра записи присваиваются значения по умолчанию.

4

Объявите их как переменные экземпляра и инициализируйте их в конструкторе. Если вы объявите и инициализируете их в конструкторе, они будут доступны только внутри конструктора (локальная область) и не будут доступны в другом месте, что сделает их бесполезными.

private String word; 
private String blanks; 

public Hangman() { 
    word = "p u m p k i n"; 
    blanks = "_ _ _ _ _ _ _"; 
} 

// Have setters and getters for word and blanks if possible. 
2

Поскольку вы объявляете word в конструкторе, то есть текст:

String word = "p u m p k i n"; 
String blanks = "_ _ _ _ _ _ _"; 

находится в скобках public Hangman(), это local конструктору. Он существует только в области конструктора.

Чтобы это исправить, привести декларацию переменных вне как так:

public class Hangman{ 

private String word;  //declaring class variables as private 
private String blanks; //is a common best-practice 

public Hangman() { 
    word = "p u m p k i n"; 
    blanks = "_ _ _ _ _ _ _"; 
} 

int k = word.length(); ... rest code after this 

А почему мы, как объявлять переменные класса как частные, статья на Википедии encapsulation может быть полезным.

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