2021年3月14日17点21分
JAVA自学课程笔记10:
可输入的加法计算文本框1:
TestTextField.java:
/*版本1的main函数过长,不美观*/
import java.awt.*;
import java.awt.event.*;
public class TestTextField{
public static void main(String[] args){
TextField tf1 = new TextField(30);
TextField tf2 = new TextField(30);
TextField tf3 = new TextField(30);
Button bn = new Button("=");
Label lb = new Label("+");
Frame f = new Frame("文本框相加示例");
f.setLayout(new FlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
MyMonitor aa = new MyMonitor();
bn.addActionListener(aa);
f.pack();
f.setVisible(true);
}
}
class MyMonitor implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
String str1 = TestTextField.tf1.getText();
String str2 = TestTextField.tf2.getText();
int num1 = Integer.parseInt(str1);
int num2 = Integer.parseInt(str2);
int num3 = num1 + num2;
String str3 = String.valueOf(num3);
TestTextField.tf3.setText(str3);
}
}
可输入的加法计算文本框2:
TestTextField.java:
/*对1程序美化修正且添加了关闭程序的功能*/
import java.awt.*;
import java.awt.event.*;
public class TestTextField{
public static void main(String[] args){
new newTextField().launch();
}
}
class newTextField{
public TextField tf1, tf2, tf3;
public void launch(){
tf1 = new TextField(30);
tf2 = new TextField(30);
tf3 = new TextField(30);
Button bn = new Button("=");
Label lb = new Label("+");
Frame f = new Frame("文本框相加示例");
f.setLayout(new FlowLayout());
f.add(tf1);
f.add(lb);
f.add(tf2);
f.add(bn);
f.add(tf3);
bn.addActionListener(new MyMonitor(this));
f.addWindowListener(new MyMonitor(this));
f.pack();
f.setVisible(true);
}
}
class MyMonitor extends WindowAdapter implements ActionListener{
private newTextField tf; //通过在B类中定义A类的属性,就可以达到在B类中访问A类成员的目的
public MyMonitor(newTextField tf){
this.tf = tf;
}
@Override
public void actionPerformed(ActionEvent e){
String str1 = tf.tf1.getText();
String str2 = tf.tf2.getText();
int num1 = Integer.parseInt(str1);
int num2 = Integer.parseInt(str2);
int num3 = num1 + num2;
String str3 = String.valueOf(num3);
tf.tf3.setText(str3);
}
@Override
public void windowClosing(WindowEvent e){
System.exit(-1);
}
}
内部类:
内部类的方法可以访问外部类的所有成员。
内部类可以直接当作外部类的成员。
外部类的方法不可以直接访问内部类的成员。
优点:
可以让一个类方便的访问另一个类的所有成员。
增加程序安全性,有效避免其他不相关外部类对该类的访问。
例如,上面的计算文本框程序中的一个MyMonitor类可以作为newTextField的内部类,同时nexTextField的“new MyMonitor(this)”语句中的this可以不要。
匿名类:
较不规范,没有逻辑性。
匿名类是一种特殊的内部类。
Test:
import java.awt.*;
import java.awt.event.*;
public class Test{
public static void main(String[] args){
Frame f = new Frame();
f.setSize(300, 300);
f.addWindowListener(
new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
System.exit(-1);
}
}
);
f.setVisible(true);
}
}
如果在一个方法内定义了一个匿名类,则该匿名类可以访问外部类的所有成员、包裹该匿名类的方法中的所有final类型局部变量。(非final类型的局部变量无法被匿名类访问。)
Test:
import java.awt.*;
import java.awt.event.*;
public class Test{
public static void main(String[] args){
final Frame f = new Frame(); //如果去掉final编译会报错
f.setSize(300, 300);
f.addWindowListener(
new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
f.setVisible(false); //匿名类只能调final类型局部变量
}
}
);
f.setVisible(true);
}
}
实现接口:
//其中A是接口。
new A(){
//实现接口方法的代码
};
//功能:生成一个实现了A接口的匿名类的对象。
实现抽象类:
//其中A是抽象类。
new A(){
//实现A中所有抽象方法的代码
//也可以添加自己的方法或属性代码
}
//功能:生成一个匿名类对象,该匿名类必须得实现A类的所有抽象方法,当然该匿名类也可以定义自己的属性和方法。
继承父类:
//其中A是类名。
new A(){
//重写了A类的方法代码
//也可以添加自己的方法或属性代码
}
//功能:生成一个A类的子类对象,该匿名类继承了A的所有非private成员。
如果一个类包含了很重要的逻辑,将来要经常修改,则这个类就不应当做匿名类来使用,匿名类会造成代码的混乱。