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

  • 相关阅读:
    java.lang.ClassNotFoundException: org.apache.jsp.WEB_002dINF.views.login_jsp
    安装eclipse插件,很慢终于找到了解决的方法
    开发辅助网站---programcreek
    java--遇到NoSuchMethodError通用解决思路
    详解SpringBoot 添加对JSP的支持(附常见坑点)
    springboot 配置jsp支持
    JS前端取得并解析后台服务器返回的JSON数据的方法
    ajax接收json数据到js解析
    1 problem was encountered while building the effective model [FATAL] Non-parseable POM F:MavenRepositoryorgapachemavenpluginsmaven-resources-plugin2.6maven-resources-plugin-2.6.pom: start tag
    新装mvn建第一个项目报错org.apache.maven.plugins:maven-resources-plugin:2.6
  • 原文地址:https://www.cnblogs.com/wangshen31/p/6938286.html
Copyright © 2011-2022 走看看