zoukankan      html  css  js  c++  java
  • 持有对方的引用&&内部类

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

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

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

  • 相关阅读:
    PHP htmlspecialchars和htmlspecialchars_decode(函数)
    使用CURL抓取淘宝页面
    PHP 自定义字符串中的变量名解析
    Notepad++前端开发常用插件介绍
    使用phpExcel实现Excel数据的导入导出(完全步骤)
    moment.js 日期包装类 (说明示例)
    php函数前面加&符号 和 变量前面加&符号的意义
    window 查看端口/杀进程
    eureka 去除注册中心保护机制
    mysql 表关联更新另一张表的数据
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6938286.html
Copyright © 2011-2022 走看看