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

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

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

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

时间: 2024-10-17 05:51:59

持有对方的引用&&内部类的相关文章

SpringContextHolder 静态持有SpringContext的引用

import java.util.Map; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; /** * *以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候中取出ApplicaitonContext. * @author zhuh */ public class Spri

OC基础15:内存管理和自动引用计数

1.什么是ARC? (1).ARC全名为Automatic Reference Counting,即是自动引用计数,会自动统计内存中对象的引用数,并在适当时候自动释放对象: (2).在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不用写retain. release和autorelease三个关键字: (3).在使用ARC之前,需要手动管理内存计数,这种机制称为MRC,即是手动引用计数 (Manual Referecen Counting): (4).ARC是Objective-

java制作简单的坦克大战

坦克大战是我们小时候玩红白机时代的经典游戏,看到有不少小伙伴都使用各种语言实现了一下,手痒痒,也使用java做的一个比较简单的坦克大战,主要面向于学过Java的人群,与学了一段时间的人,有利于面向对象思想的提高,推荐给大家. 详情请参照注释,这里就不多废话了,实现一下儿时的经典而已. Blood.java ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 3

Android 常用开源框架源码解析 系列 (九)dagger2 呆哥兔 依赖注入库

一.前言 依赖注入定义 目标类中所依赖的其他的类的初始化过程,不是通过手动编码的方式创建的. 是将其他的类已经初始化好的实例自动注入的目标类中. "依赖注入"也是面向对象编程的 设计模式 -----组合的配套使用 作用 :降低程序的耦合,耦合就是因为类之间的依赖关系所引起的 产生场景:在一个对象里去创建另一个对象的实例 问题:过多的类,对象之间的依赖会造成代码难以维护. 不符合开闭原则的对象的引用写法:错误示例: public class ClassA { classB b ; pub

Java虚拟机:如何判定哪些对象可回收?

版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! 在堆内存中存放着Java程序中几乎所有的对象实例,堆内存的容量是有限的,Java虚拟机会对堆内存进行管理,回收已经"死去"的对象(即不可能再被任何途径使用的对象),释放内存.垃圾收集器在对堆内存进行回收前,首先要做的第一件事就是确定这些对象中哪些还存活着,哪些已经死去.Java虚拟机是如何判断对象是否可以被回收的呢? 引用计数算法        引用计数算法的原理是这样的:给对象添加一个引用计数器,每当有一个地方引用它时,计

Facebook 的 iOS 内存泄漏监测自动化实践

内存是移动设备上的共享资源,如果一个 App 无法正确地进行内存管理的话,将会导致内存消耗殆尽,闪退以及性能的严重下降. Facebook 的 iOS 版本的许多功能模块共用了同一份内存空间,如果其中的某一个模块消耗了特别多的内存资源的话,将会对整个 App 造成严重影响.举个栗子,当某个功能模块不小心造成了内存泄漏的时候,这个情况就很有可能会发生. 在 Facebook,我们有非常多的工程师同时在一个代码仓库下进行并行开发.内存泄漏是在开发过程中难以避免会遇见的问题.当内存泄漏发生时,我们就需

php多态简单示例

<?php //多态由不同的人执行而产生不同的结果: //一个人通过不同的状态执行同一种动作,产生不同的结果也可称为多态 //多态的原理,就是类都写好了,不要去修改它,只要在类外的的调用参数的更改 //借口规范了子类的动作 interface Computer{ public function version();//这个方法表示采用什么方法 public function work(); //怎么运行的 } //实现借口,一个笔记本类一个台式机类 class NoteComputer impl

Hibernate—— 一对多 和 多对多关联关系映射(xml和注解)总结(转载)

One to Many 映射关系 多对一单向外键关联(XML/Annotation) 一对多单向外键关联(XML/Annotation) 懒加载和积极加载 一对多双向外键关联(XML/Annotation) Many to Many 映射关系 多对多单向外键关联(XML/Annotation) 多对多双向外键关联(XML/Annotation) set的inverse元素详解 问题小结 关联关系的优缺点 多对一单向外键关联关系 注意多对一关联是多方持有一方的引用.看一个例子,去淘宝购物,那么一个

解构ffmpeg(二)

通过比较DirectShow和ffmpeg两者的FilterGraph,分析ffmpeg的FilterGraph运作. 首先FilterGraph是一个图,图由点和边构成.在FilterGraph中的点就是Filter.在DirectShow中,没有边对象,Filter的连接依赖Pin组件以及IPin接口,一对InputPin和OutputPin构成一条边.每个Filter可以有至少一个Pin,即每个点有至少一条边,(排除只有一个点的图,和没有邻接边的点的情况).构成连接的InputPin和Ou