Βίντεο: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024
Εδώ είναι μεγάλα νέα! Στην Java, μπορείτε να ορίσετε μια τάξη μέσα σε μια άλλη κλάση! Εδώ, η κλάση
GameFrame
περιέχει μια κλάση που ονομάζεται
MyActionListener
.
εισαγωγή java. awt. FlowLayout;
εισαγωγή java. awt. Εκδήλωση. ActionEvent;
εισαγωγή java. awt. Εκδήλωση. ActionListener;
εισαγωγή java. χρήσιμο. Τυχαίος;
εισαγωγή javax. κούνια. JButton;
εισαγωγή javax. κούνια. JFrame;
εισαγωγή javax. κούνια. JLabel;
εισαγωγή javax. κούνια. JTextField;
κατηγορία GameFrame επεκτείνει το JFrame {
ιδιωτική στατική τελική μακρά serialVersionUID = 1L;
int randomNumber = νέα Τυχαία (). nextInt (10) + 1.
int numGuesses = 0;
JTextField textField = νέο JTextField (5);
Κουμπί JButton = νέο JButton ("Guess");
JLabel ετικέτα = νέο JLabel (numGuesses + "εικασίες");
δημόσιο GameFrame () {
setDefaultCloseOperation (JFrame EXIT_ON_CLOSE);
setLayout (νέο FlowLayout ());
προσθήκη (textField);
προσθήκη (κουμπί);
προσθήκη (ετικέτα);
. addActionListener (νέο MyActionListener () );
πακέτο ();
setVisible (true);
}
Η κλάση MyActionListener υλοποιεί το ActionListener {
@Override
δημόσια άκυρη ενέργειαΕπεξεργασμένο (ActionEvent e) {
String textFieldText = textField . getText ();
αν (ακέραιος parseInt (textFieldText) == randomNumber) {
κουμπί. setEnabled (false);
textField. setText (textField. getText () + "Ναι!");
textField. setEnabled (false);
} αλλιώς {
textField. setText ("");
textField. requestFocus ();
}
numGuesses ++;
Ετικέτα συμβολοσειράς = (numGuesses == 1); "εικασία": "εικασίες";
. setText (numGuesses + guessword);
}
}
}
Η παραπάνω κλάση
MyActionListener
είναι μια εσωτερική κλάση. Μια εσωτερική τάξη μοιάζει πολύ με οποιαδήποτε άλλη τάξη. Αλλά μέσα στον κώδικα της εσωτερικής τάξης, μπορείτε να ανατρέξετε στα πεδία της κατηγορίας που περικλείει. Για παράδειγμα, μερικές δηλώσεις μέσα στο
MyActionListener
χρησιμοποιούν το όνομα
textField
και
textField
ορίζεται στην κατηγορία
GameFrame
.
Παρατηρήστε ότι ο παραπάνω κωδικός χρησιμοποιεί μόνο μία φορά την κλάση
MyActionListener
. (Η μόνη χρήση είναι σε μια κλήση στο κουμπί
addActionListener
.) Έτσι, χρειάζεστε πραγματικά ένα όνομα για κάτι που χρησιμοποιείται μόνο μία φορά; Όχι, δεν το κάνετε. Μπορείτε να αντικαταστήσετε ολόκληρο τον ορισμό της εσωτερικής κλάσης εντός της κλήσης με το κουμπί
.addActionListener
. Όταν το κάνετε αυτό, έχετε μια ανώνυμη εσωτερική τάξη. Έτσι λειτουργεί.
εισαγωγή java. awt. FlowLayout;
εισαγωγή java. awt. Εκδήλωση. ActionEvent;
εισαγωγή java. awt. Εκδήλωση. ActionListener;
εισαγωγή java. χρήσιμο. Τυχαίος;
εισαγωγή javax. κούνια. JButton;
εισαγωγή javax. κούνια. JFrame;
εισαγωγή javax. κούνια. JLabel;
εισαγωγή javax. κούνια. JTextField;
κατηγορία GameFrame επεκτείνει το JFrame {
ιδιωτική στατική τελική μακρά serialVersionUID = 1L;
int randomNumber = νέα Τυχαία (). nextInt (10) + 1.
int numGuesses = 0;
JTextField textField = νέο JTextField (5);
κουμπί JButton = νέο JButton ("Guess");
JLabel ετικέτα = νέο JLabel (numGuesses + "εικασίες");
δημόσιο GameFrame () {
setDefaultCloseOperation (JFrame EXIT_ON_CLOSE);
setLayout (νέο FlowLayout ());
προσθήκη (textField);
προσθήκη (κουμπί);
προσθήκη (ετικέτα);
. addActionListener (νέο ActionListener () {
@Override
δημόσια άκυρη ενέργειαΕπεξεργασμένη (ActionEvent e) { String textFieldText = textField. = randomNumber) κουμπί <
setEnabled (ψευδές)
textField.setText (textField.getText () + "Ναι!")
numGuesses ++;
String guessWord = (numGuesses == 1); "μαντέψει": "εικασίες", < ετικέτα. SetText (numGuesses + guessword),
}
}
);
πακέτο ();
setVisible (true);
}
}
Οι εσωτερικές κλάσεις είναι καλές για πράγματα όπως επεμβάσεις συμβάντων, όπως η μέθοδος
actionPerformed
. Το πιο δύσκολο πράγμα για μια εσωτερική τάξη ανώνυμα
είναι η παρακολούθηση των παρενθέσεων, των σγουρών και των εσοχών Κάποια ταπεινή συμβουλή: ξεκινήστε γράφοντας κώδικα χωρίς εσωτερικές τάξεις. Αργότερα, όταν βαρεθείτε με τις συνήθεις τάξεις Java, πείραμα με την αλλαγή κάποιων από τις συνήθεις σας κλάσεις σε εσωτερικές τάξεις.