Video: [Thực hành Lập trình Hướng đối tượng] Bài 3.2 - Cài đặt lớp DoanThang (Đoạn thẳng) 2025
Đây là tin tức lớn! Trong Java, bạn có thể định nghĩa một lớp bên trong của lớp khác! Ở đây, lớp
GameFrame
chứa một lớp có tên là
MyActionListener
.
nhập khẩu java. awt. FlowLayout;
nhập khẩu java. awt. biến cố. ActionEvent;
nhập khẩu java. awt. biến cố. ActionListener;
nhập khẩu java. util. Ngẫu nhiên;
nhập javax. lung lay. JButton;
nhập khẩu javax. lung lay. JFrame;
nhập javax. lung lay. JLabel;
nhập javax. lung lay. JTextField;
Lớp GameFrame mở rộng JFrame {
private static final long serialVersionUID = 1L;
int randomNumber = new Ngẫu nhiên (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = new JTextField (5);
nút JButton = new JButton ("Đoán");
JLabel label = new JLabel (numGuesses + "guesses");
GameFrame công khai () {
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout (FlowLayout mới ());
Thêm (textField);
Thêm (nút);
thêm (nhãn);
. addActionListener (mới MyActionListener () );
gói ();
setVisible (đúng);
}
lớp MyActionListener thực hiện ActionListener {
@Override
public void actionPerformed (ActionEvent e) {
Chuỗi textFieldText = textField . getText ();
if (Integer. ParseInt (textFieldText) == randomNumber) (
nút. setEnabled (sai);
textField. setText (textField. getText () + "Có!");
textField. setEnabled (sai);
} else {
textField. setText ("");
textField. requestFocus ();
}
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses";
nhãn. setText (numGuesses + guessWord);
}
}
}
Lớp
MyActionListener
ở trên là lớp bên trong. Một lớp bên trong giống như bất kỳ lớp khác. Nhưng trong mã lớp bên trong, bạn có thể tham khảo các trường của lớp bao trùm. Ví dụ, một số câu lệnh bên trong
MyActionListener
sử dụng tên
textField
và
textField
được định nghĩa trong lớp
GameFrame kèm theo.
Lưu ý rằng mã trên sử dụng lớp
MyActionListener
chỉ một lần. (Việc sử dụng duy nhất là trong một cuộc gọi đến nút
addActionListener
.) Vì vậy, bạn có thực sự cần một cái tên cho cái gì đó chỉ được sử dụng một lần? Không, bạn không. Bạn có thể thay thế toàn bộ định nghĩa của lớp trong bên trong cuộc gọi đến nút
.addActionListener
. Khi bạn thực hiện việc này, bạn có
lớp bên trong vô danh. Đây là cách hoạt động. nhập khẩu java. awt. FlowLayout;
nhập khẩu java. awt. biến cố. ActionEvent;
nhập khẩu java. awt. biến cố. ActionListener;
nhập khẩu java. util. Ngẫu nhiên;
nhập javax. lung lay. JButton;
nhập javax. lung lay. JFrame;
nhập javax. lung lay. JLabel;
nhập javax. lung lay. JTextField;
Lớp GameFrame mở rộng JFrame {
private static final long serialVersionUID = 1L;
int randomNumber = new Ngẫu nhiên (). nextInt (10) + 1;
int numGuesses = 0;
JTextField textField = new JTextField (5);
nút JButton = new JButton ("Đoán");
JLabel label = new JLabel (numGuesses + "guesses");
GameFrame công khai () {
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
setLayout (FlowLayout mới ());
Thêm (textField);
Thêm (nút);
thêm (nhãn);
. addActionListener (new ActionListener () {
@Override public void actionPerformed (ActionEvent e) {
Chuỗi textFieldText = textField. getText ();
nếu (Số nguyên parseInt (textFieldText) = = textField setEnabled (false);
textField setText (textField.getText () + "Có!");
textField.setEnabled (false);
} khác {
numGuesses ++;
String guessWord = (numGuesses == 1)? "Guess": "guesses";
textField.setText (" setText (numGuesses + guessWord);
}
}
); Gói
();
setVisible (đúng);
}
}
Các lớp bên trong tốt cho những thứ như trình xử lý sự kiện, chẳng hạn như phương thức actionPerformed
. Điều khó nhất về
vô danh
lớp bên trong là theo dõi dấu ngoặc đơn, dấu ngoặc nhọn, và dấu đầu dòng Một số lời khuyên khiêm tốn: bắt đầu bằng cách viết mã mà không có lớp bên trong. Sau đó, khi bạn trở nên chán với các lớp Java thông thường, thử nghiệm bằng cách thay đổi một số lớp học thông thường của bạn thành các lớp bên trong.