持有对方的引用&&内部类
现在来做个很简单的东西,就是做一个做加法的图形界面
然后现在先是一个不用持有对方引用的写法:
import java.awt.*; import java.awt.event.*; public class TFMath { public static void main(String[] args) { new TFFrame().launchFrame(); } } class TFFrame extends Frame { TextField num1,num2,num3; public void launchFrame() { num1 = new TextField(10);//宽度为10的文本框 num2 = new TextField(10); num3 = new TextField(15); Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本 Button butEqual = new Button("="); butEqual.addActionListener(new MyMonitor(num1,num2,num3)); setLayout(new FlowLayout()); add(num1); add(labPlus); add(num2); add(butEqual); add(num3); pack(); setVisible(true); } } class MyMonitor implements ActionListener { TextField num1,num2,num3; public MyMonitor(TextField num1,TextField num2,TextField num3) {//创造一个构造方法来获得三个文本框的信息(引用) this.num1 = num1; this.num2 = num2; this.num3 = num3; } public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(num1.getText()); int n2 = Integer.parseInt(num2.getText()); num3.setText(""+ (n1+n2)); } }
持有引用类的:
import java.awt.*; import java.awt.event.*; public class TFMath { public static void main(String[] args) { new TFFrame().launchFrame(); } } class TFFrame extends Frame { TextField num1,num2,num3; public void launchFrame() { num1 = new TextField(10);//宽度为10的文本框 num2 = new TextField(10); num3 = new TextField(15); Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本 Button butEqual = new Button("="); butEqual.addActionListener(new MyMonitor(this));//把自己这个对象交给监视器 setLayout(new FlowLayout()); add(num1); add(labPlus); add(num2); add(butEqual); add(num3); pack(); setVisible(true); } } class MyMonitor implements ActionListener { TFFrame tff = null;//直接持有框架这个类的引用 public MyMonitor(TFFrame tff) { this.tff = tff; } public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(tff.num1.getText()); int n2 = Integer.parseInt(tff.num2.getText()); tff.num3.setText(""+ (n1+n2)); } }
这是个非常好的处理方式。像是有一个大管家管着所有的事。
但是我们还有一个更简洁的方法:
import java.awt.*; import java.awt.event.*; public class TFMath2 { public static void main(String[] args) { new TFFrame().launchFrame(); } } class TFFrame extends Frame { TextField num1,num2,num3; public void launchFrame() { num1 = new TextField(10);//宽度为10的文本框 num2 = new TextField(10); num3 = new TextField(15); Label labPlus = new Label("+");//加号这其实就是个静态文本,这个类就是个静态的文本 Button butEqual = new Button("="); butEqual.addActionListener(new MyMonitor()); setLayout(new FlowLayout()); add(num1); add(labPlus); add(num2); add(butEqual); add(num3); pack(); setVisible(true); } private class MyMonitor implements ActionListener { //内部类 public void actionPerformed(ActionEvent e) { int n1 = Integer.parseInt(num1.getText());//可以方便地访问TFFrame的成员变量 int n2 = Integer.parseInt(num2.getText()); num3.setText(""+ (n1+n2)); } } }
内部类的第一个巨大的好处就是,在内部类里面可以非常畅通地访问外部的那个包装类的成员变量。
再来就是可以避免被其他类访问。你说你这个frame或者button别人访问有意义,但你现在时monitor,是textfield的monitor,别人访问来作甚!所以内部类还可以防止别人访问。你也可以再内部类前面加一个private,表明这个类专门只给包装类访问。