#java #class #integer #int
#java #класс #целое #int
Вопрос:
Я хочу использовать значение int, которое находится в Gui.class, в DrawPanel1.class как я могу легко передавать значение int из класса в файл класса? Мое значение int:
/* Gui.java */
static int gamestate = 1;
Я хочу уменьшить gamestate на 1, в DrawPanel.java в buttonHandler, например, так:
/*DrawPanel.java */
class StartNewGameHandler implements ActionListener{
public void actionPerformed( ActionEvent e ){
gamestate--;
}
}
Ответ №1:
Если вы действительно хотите получить прямой доступ к статической переменной, вы могли бы использовать:
Gui.gamestate--;
Однако я бы настоятельно рекомендовал вам сохранять переменные закрытыми (кроме констант) и получать к ним доступ через свойства. Изменяемые статические переменные тоже часто являются плохой идеей.
Комментарии:
1. Что ж, у меня не было выбора. Если я не сделал его статическим, это выдало мне ошибку, которая сделала программу неуправляемой. Это потому, что я использую их в main ().
2. В дополнение к моему ответу я также разделяю ту же рекомендацию.
3. @Stan вы могли бы создать новый объект типа Gui и получить доступ к свойству
4. @Stan: Лучший ответ не всегда тот, который просто быстрее всего отключает компилятор. Вам следует подумать о том, почему компилятор жалуется, и рассмотреть наилучший способ решения этой проблемы … который я предлагаю в данном случае, вероятно, не просто сделать переменную статической.
5. @Stan: Так что, возможно, графический интерфейс изначально не подходит для переменной. Вы вполне можете захотеть изменить представление вашего игрового состояния по сравнению с его моделью .
Ответ №2:
Если графический интерфейс и DrawPanel находятся в одном пакете, вы могли бы использовать
Gui.gamestate--
иначе вам придется объявить gamestate как общедоступный, а затем вызвать
Gui.gamestate--
Ответ №3:
Вы просто делаете это public
как:
public static int gamestate = 1;
и затем вы вызываете его статически:
Gui.gamestate
Комментарии:
1. Я получаю сообщение об ошибке.
Exception in thread "main" java.lang.IllegalArgumentException: adding container's parent to itself at java.awt.Container.checkAddToSelf(Unknown Source) at java.awt.Container.addImpl(Unknown Source) at javax.swing.AbstractButton.addImpl(Unknown Source) at java.awt.Container.add(Unknown Source) at collide.DrawPanel1.<init>(DrawPanel1.java:50) at collide.Gui.<init>(Gui.java:27) at collide.Gui.main(Gui.java:56)
2. @Stan кажется, что эта ошибка не зависит от другой, но компилятор только что обнаружил ее, поскольку другая была исправлена
Ответ №4:
Стандартный способ ООП передачи данных между классами — это использование методов получения / установки:
class Gui {
private int gameState;
public void setGameState(int gameState) {
this.gameState = gameState;
}
}
Конечно, вы можете использовать статическую переменную, но обычно это считается плохой практикой.
Комментарии:
1. Ну, это мой main(): ` public static void main(строка[] аргументов){ Gui game = new Gui(); //МЕНЮ ЗАПУСКА if(gamestate == 1){ game.startgo(); } //ФАКТИЧЕСКАЯ ИГРА if(gamestate == 0){ game.go(); } } ` и, если я сделаю GameState int нестатическим, это выдаст мне эту ошибку: невозможно создать статическую ссылку на нестатическое поле GameState
2. Да, но почему вы обязательно должны обращаться к нему из статического метода?
3. Ну, не обязательно, но я решил начать все сначала, я перепутал много кода.