Vídeo: Curso de Java 64: Classes aninhadas: internas, locais e anônimas 2024
Aqui estão as grandes notícias! Em Java, você pode definir uma classe dentro de outra classe! Aqui, a classe
GameFrame
contém uma classe chamada
MyActionListener
.
importar java. awt. FlowLayout;
importar java. awt. evento. ActionEvent;
importar java. awt. evento. ActionListener;
importar java. util. Aleatória;
importar javax. balanço. JButton;
importar javax. balanço. JFrame;
importar javax. balanço. JLabel;
importar javax. balanço. JTextField;
class GameFrame estende o JFrame {
static static final long serialVersionUID = 1L;
int randomNumber = novo Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = novo JTextField (5);
Botão JButton = novo JButton ("Guess");
JLabel label = new JLabel (numGuesses + "adivinhações");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (novo FlowLayout ());
adicionar (textField);
adicionar (botão);
adicionar (rótulo);
botão. addActionListener (new MyActionListener () );
pack ();
setVisible (true);
}
classe MyActionListener implementa ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField . getText ();
se (Inteiro. ParseInt (textFieldText) == randomNumber) {
botão. setEnabled (falso);
textField. setText (textField. getText () + "Sim!");
textField. setEnabled (falso);
} else {
textField. setText ("");
textField. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "adivinha";
rótulo. setText (numGuesses + guessWord);
}
}
}
A classe
MyActionListener
acima é uma classe interna. Uma classe interna é muito parecida com qualquer outra classe. Mas dentro do código de uma classe interna, você pode se referir aos campos da classe anexa. Por exemplo, várias declarações dentro de
MyActionListener
usam o nome
textField
e
textField
são definidas na classe
GameFrame
.
Observe que o código acima usa a classe
MyActionListener
apenas uma vez. (O único uso está em uma chamada para o botão
. AddActionListener
.) Então, você realmente precisa de um nome para algo que é usado apenas uma vez? Não, você não. Você pode substituir toda a definição da classe interna dentro da chamada ao botão
.addActionListener
. Quando você faz isso, você tem uma classe interna anônima. É assim que funciona.
importar java. awt. FlowLayout;
importar java. awt. evento. ActionEvent;
importar java. awt. evento. ActionListener;
importar java. util. Aleatória;
importar javax. balanço. JButton;
importar javax. balanço. JFrame;
importar javax. balanço. JLabel;
importar javax. balanço. JTextField;
class GameFrame estende o JFrame {
static static final long serialVersionUID = 1L;
int randomNumber = novo Random (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = novo JTextField (5);
Botão JButton = novo JButton ("Guess");
JLabel label = new JLabel (numGuesses + "adivinhações");
public GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (novo FlowLayout ());
adicionar (textField);
adicionar (botão);
adicionar (rótulo);
botão. addActionListener (new ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField. getText ();
if (Inteiro. parseInt (textFieldText) = = randomNumber) botão {
setEnabled (false);
textField. setText (textField. getText () + "Sim!");
textField. setEnabled (false);
} else {< textField. SetText ("");
textField. RequestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "adivinha"; < label. SetText (numGuesses + guessWord);
}
}
);
pack (); setVisible (true);
}
}
As classes internas são boas para coisas como manipuladores de eventos, como o método
actionPerformed
. A coisa mais difícil sobre uma classe interna
anônima
é acompanhar os parênteses, as cintas franzidas e a indentação. Alguns conselhos humildes: comece por escrever código sem classes internas. Mais tarde, quando você se aborrecer com as classes comuns de Java, experimente mudar algumas de suas classes comuns em classes internas.