Видео: Уроки Java для начинающих | #13 - Создание класса и объекта 2024
Вот большие новости! В Java вы можете определить класс внутри другого класса! Здесь класс
GameFrame
содержит класс с именем
MyActionListener
.
импорт java. АВТ. FlowLayout;
импорт java. АВТ. мероприятие. ActionEvent;
импорт java. АВТ. мероприятие. ActionListener;
импорт java. Util. Случайные;
импорт javax. свинг. JButton;
импорт javax. свинг. JFrame;
импорт javax. свинг. JLabel;
импорт javax. свинг. JTextField;
класс GameFrame расширяет JFrame {
частный статический окончательный длинный serialVersionUID = 1L;
int randomNumber = new Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = новый JTextField (5);
Кнопка JButton = новый JButton («Угадай»);
JLabel label = новый JLabel (numGuesses + "догадки");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (новый FlowLayout ());
Добавить (TextField);
добавить (кнопка);
Добавить (ярлык); Кнопка
. addActionListener (новый MyActionListener () );
упаковка ();
SetVisible (истина);
}
класс MyActionListener реализует ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField . GetText ();
if (Integer. ParseInt (textFieldText) == randomNumber) {
. setEnabled (ложь);
TextField. setText (textField. getText () + «Да!»);
TextField. setEnabled (ложь);
} else {
textField. SetText ("");
TextField. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses";
этикетка. setText (numGuesses + guessWord);
}
}
}
Класс
MyActionListener
- это внутренний класс. Внутренний класс очень похож на любой другой класс. Но внутри кода внутреннего класса вы можете обратиться к полям охватывающего класса. Например, несколько операторов внутри
MyActionListener
используют имя
textField
, а
textField
определяется в классе
GameFrame
.
Обратите внимание, что приведенный выше код использует класс
MyActionListener
только один раз. (Единственное использование - в вызове кнопки
. AddActionListener
.) Итак, вам действительно нужно имя для того, что используется только один раз? Нет, нет. Вы можете заменить все определение внутреннего класса внутри вызова на кнопку
.addActionListener
. Когда вы это сделаете, у вас есть анонимный внутренний класс. Вот как это работает.
импорт java. АВТ. FlowLayout;
импорт java. АВТ. мероприятие. ActionEvent;
импорт java. АВТ. мероприятие. ActionListener;
импорт java. Util. Случайные;
импорт javax. свинг. JButton;
импорт javax. свинг. JFrame;
импорт javax. свинг. JLabel;
импорт javax. свинг. JTextField;
класс GameFrame расширяет JFrame {
частный статический окончательный длинный serialVersionUID = 1L;
int randomNumber = new Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = новый JTextField (5);
Кнопка JButton = новый JButton («Угадай»);
JLabel label = новый JLabel (numGuesses + "догадки");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (новый FlowLayout ());
Добавить (TextField);
добавить (кнопка);
Добавить (ярлык); Кнопка
. addActionListener (new ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField. getText ();
if (Integer. parseInt (textFieldText) = = randomNumber) {
кнопка setEnabled (false);
textField. setText (textField. getText () + "Yes!");
textField. setEnabled (false);
} else { textField. SetText ("");
textField. RequestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses"; < label.TextText (numGuesses + guessWord);
}
}
);
упаковка (); SetVisible (истина);
}
}
Внутренние классы хороши для таких вещей, как обработчики событий, такие как метод
actionPerformed
. Самое сложное в
анонимном
внутреннем классе - отслеживать круглые скобки, фигурные скобки и отступы. Некоторые скромные советы: начните с написания кода без каких-либо внутренних классов. Позже, когда вам становится скучно с обычными классами Java, экспериментируйте, изменив некоторые из ваших обычных классов на внутренние классы.