视频: D10 01 内部类 创建内部类及链接到外部类 2024
这里有个大新闻!在Java中,您可以在另一个类中定义一个类!这里,
GameFrame
类包含一个名为
MyActionListener
的类。
import java。 AWT。 FlowLayout中;
import java。 AWT。事件。动作事件;
import java。 AWT。事件。 ActionListener的;
import java。 UTIL。随机;
import javax。摇摆。 JButton的;
import javax。摇摆。 JFrame的;
import javax。摇摆。 JLabel的;
import javax。摇摆。 JTextField的;
class GameFrame extends JFrame {
private static final long serialVersionUID = 1L; int randomNumber = new Random()。 nextInt(10)+ 1;
int numGuesses = 0;
JTextField textField = new JTextField(5);
<! - 2 - >
JLabel label = new JLabel(numGuesses +“guesses”); public GameFrame(){
setDefaultCloseOperation(JFrame。EXIT_ON_CLOSE); setLayout(new FlowLayout());
加(文本框);
加(按钮);
加(标签);
按钮。 addActionListener(
new MyActionListener()
);
@Override
public void actionPerformed(ActionEvent e){
String textFieldText =
textField
。的getText();
if(Integer。parseInt(textFieldText)== randomNumber){
按钮。的setEnabled(假); 的TextField。 setText(textField。getText()+“Yes!”); 的TextField。的setEnabled(假);
}其他{
textField。的setText( “”);
的TextField。 requestFocus()方法;
}
numGuesses ++;
字符串guessWord =(numGuesses == 1)?“guess”:“猜测”;
标签。 setText(numGuesses + guessWord);
}
}
}
上面的
MyActionListener
类是一个
内部类。内部类与其他类很相似。但是在内部类的代码中,可以引用封闭类的字段。例如,
MyActionListener
中的几个语句使用名称
textField ,并且在封闭的 GameFrame
类中定义
textField
。
请注意,上面的代码只使用
MyActionListener
类一次。 (唯一的用途是调用
按钮.addActionListener
。)所以,你真的需要一个名字的东西,只有一次使用?不,你不知道。您可以将呼叫中内部类的整个定义替换为
按钮。addActionListener方法
。当你这样做,你有一个
匿名内部类。
这是如何工作的。
import java。 AWT。 FlowLayout中;
import java。 AWT。事件。动作事件;
import java。 AWT。事件。 ActionListener的; import java。 UTIL。随机; import javax。摇摆。 JButton的;
import javax。摇摆。 JFrame的;
import javax。摇摆。 JLabel的;
import javax。摇摆。 JTextField的;
class GameFrame extends JFrame {
private static final long serialVersionUID = 1L; int randomNumber = new Random()。 nextInt(10)+ 1;
int numGuesses = 0;
JTextField textField = new JTextField(5); JButton button = new JButton(“Guess”);
JLabel label = new JLabel(numGuesses +“guesses”); public GameFrame(){
setDefaultCloseOperation(JFrame。EXIT_ON_CLOSE); setLayout(new FlowLayout());
加(文本框);
加(按钮);
加(标签);
按钮。 if(Integer.parseInt(textFieldText))= new ActionListener(){
@Override
public void actionPerformed(ActionEvent e){
String textFieldText = textField.getText()其他{
textField。setEnabled(false);
textField。setText(textField.getText()+“Yes!”);
textField。setText(“”);
textField。requestFocus();
}
numGuesses ++; String guessWord =(numGuesses == 1)?“guess”:“guesses”; < label.setText(numGuesses + guessWord);
}
}
);
包();
调用setVisible(真);
}
}
内部类对事件处理程序很有用,如
actionPerformed
方法。关于
匿名
内部类的最困难的事情是跟踪括号,花括号和缩进。有些谦卑的建议:先编写没有任何内部类的代码。后来,当你对普通的Java类感到厌烦的时候,通过改变一些普通的类到内部类来进行实验。