首页 > 代码库 > 持有对方的引用&&内部类

持有对方的引用&&内部类

现在来做个很简单的东西,就是做一个做加法的图形界面

然后现在先是一个不用持有对方引用的写法:

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,表明这个类专门只给包装类访问。

持有对方的引用&&内部类