Video: Function program in java example 2025
Her er store nyheder! I Java kan du definere en klasse inde i en anden klasse! Her indeholder klassen
GameFrame
en klasse med navnet
MyActionListener
.
importer java. AWT. FlowLayout;
importer java. AWT. begivenhed. ActionEvent;
importer java. AWT. begivenhed. ActionListener;
importer java. util. Tilfældig;
importer javax. svinge. JButton;
import javax. svinge. JFrame;
importer javax. svinge. JLabel;
importer javax. svinge. JTextField;
class GameFrame udvider JFrame {
privat statisk endelig lang serialVersionUID = 1L;
int randomNumber = ny tilfældig (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nyt JTextField (5);
JButton-knap = ny JButton ("Guess");
JLabel label = nyt JLabel (numGuesses + "guesses");
offentlig GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (ny FlowLayout ());
tilføje (tekstfeltet);
tilføje (knap);
tilføje (mærke);
-knappen. addActionListener (ny MyActionListener () );
pakke ();
setVisible (sand);
}
klasse MyActionListener implementerer ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField . Gettext ();
hvis (Integer. ParseInt (textFieldText) == randomNumber) {
knappen. setEnabled (falsk);
tekstfeltet. setText (textField. getText () + "Yes!");
tekstfeltet. setEnabled (falsk);
} ellers {
textField. setText ("");
tekstfeltet. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Gæt": "gæt";
etiket. setText (numGuesses + guessWord);
}
}
}
Klassen
MyActionListener
ovenfor er en indre klasse. En indre klasse er meget som enhver anden klasse. Men inden for en indre klasses kode kan du henvise til de vedhæftende klasses felter. For eksempel bruges flere sætninger inden for
MyActionListener
navnet
textField
, og
textField
er defineret i den vedhæftede
GameFrame
klasse.
Bemærk, at koden ovenfor kun bruger en
MyActionListener
-klasse. (Den eneste brug er i et opkald til
knappen. AddActionListener
.) Så har du virkelig brug for et navn til noget, der kun bruges en gang? Nej, det gør du ikke. Du kan erstatte hele definitionen af den indre klasse inde i opkaldet til
knappen.addActionListener
. Når du gør dette, har du en anonym indre klasse. Sådan fungerer det.
importer java. AWT. FlowLayout;
importer java. AWT. begivenhed. ActionEvent;
importer java. AWT. begivenhed. ActionListener;
importer java. util. Tilfældig;
importer javax. svinge. JButton;
importer javax. svinge. JFrame;
importer javax. svinge. JLabel;
importer javax. svinge. JTextField;
class GameFrame udvider JFrame {
privat statisk endelig lang serialVersionUID = 1L;
int randomNumber = ny tilfældig (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = nyt JTextField (5);
JButton-knap = ny JButton ("Guess");
JLabel label = nyt JLabel (numGuesses + "guesses");
offentlig GameFrame () {
setDefaultCloseOperation (JFrame. EXIT_ON_CLOSE);
setLayout (ny FlowLayout ());
tilføje (tekstfeltet);
tilføje (knap);
tilføje (mærke);
-knappen. addActionListener (new ActionListener () {
@Override
public void actionPerformed (ActionEvent e) {
String textFieldText = textField. getText ();
hvis (Integer. parseInt (textFieldText) = = randomNumber) {
-knappen. setEnabled (false);
textField. setText (textField. getText () + "Yes!");
textField. setEnabled (false);
} andet {< textField. SetTxt ("");
textField. RequestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Gætte": "gæt"; < label. SetText (numGuesses + guessWord);
}
}
);
pakke (); setVisible (sand);
}
}
Indre klasser er gode for ting som hændelseshåndtere, som f.eks.
actionPerformed
metoden. Det sværeste ved en
anonyme
indre klasse holder styr på parenteserne, de krøllebøjler og indrykket. Nogle ydmyge råd: Start med at skrive kode uden nogen indre klasser. Senere, når du bliver keder dig til almindelige Java-klasser, eksperimentere ved at ændre nogle af dine almindelige klasser i indre klasser.