美文网首页
Java内部类到底是什么玩意(二)

Java内部类到底是什么玩意(二)

作者: 赵志文学编程 | 来源:发表于2017-05-17 10:56 被阅读0次

前言

自己昨天挖的坑含泪都要填完,其实昨天自认为内部类讲的还不够透彻,因为只是说并没有拿出任何证据说明内部类持有了外部类的引用,还有私有变量是怎么获取的,这得怪我本身能力不够,javap的反编译信息看不懂,周末抽空让我把底层的大坑都补上吧。

正文

今天我们来讲局部内部类,匿名内部类和静态内部类。局部内部类声明在方法体内它能看得见外面却不能被方法体外面的东西看见,而且他的修饰符不能为public和private因为它只针对方法可见。最重要的一点就是它引用局部变量必须为final看例子(昨天的例子)

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.Timer;

public class TestInnerClass2 {
    public static void main(String[] args) {
        TimerClock2 clock = new TimerClock2(true);
        clock.start(false);
    }
}
class TimerClock2 {
    private boolean isClocked = false;
    public TimerClock2(boolean isClocked) {
        this.isClocked = isClocked;
    }
    public void start(final boolean isClocked) {
        class TimerPrinter implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!isClocked) {
                    Date date = new Date();
                    System.out.println(date);
                } else {
                    Toolkit.getDefaultToolkit().beep();// 会发出铃声
                }
            }
        }
        ActionListener listener = new TimerPrinter();
        Timer t = new Timer(1000, listener);// 定时器
        t.start();
    }
}

为什么要声明为final因为start方法结束后isClocked是不存在的,那么声明final变量就是为了拷贝一份到内部类自身的域里面,这样就解决两者声明周期不一致的问题。

匿名内部类so easy就是在父类或者接口扩展其功能的具体实现类或者子类,因为其本身是没有类名的所以其没有构造函数,而交给父类构造器解决(接口就没构造参数这一说法了)

public void start(final boolean isClocked) {
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (!isClocked) {
                    Date date = new Date();
                    System.out.println(date);
                } else {
                    Toolkit.getDefaultToolkit().beep();// 会发出铃声
                }
            }
        };
        Timer t = new Timer(1000, listener);// 定时器
        t.start();
    }

当然这玩意淫荡的地方不在这,有种我根本没见过的方式

    new ArrayList() {{add(1);add(2);add(3);}};

它运用了匿名内部类和实例初始化域(在构造器super()之后调用)

最后静态内部类用的不多,它就是独立于外部类,却又只被外部类使用,而并不是依赖外部类new出的对象具体就是直接Outer.Inner inner = new Outer.Inner ()。(不过我还没想好内部类的使用场景,这个坑估计是要等工作填了)

相关文章

  • Java内部类到底是什么玩意(二)

    前言 自己昨天挖的坑含泪都要填完,其实昨天自认为内部类讲的还不够透彻,因为只是说并没有拿出任何证据说明内部类持有了...

  • Java内部类到底是什么玩意(一)

    前言 最近为了复习基础学的东西比较杂,翻看Core Java了,看到内部类这一块感觉理解的和以前不一样。 正文 为...

  • Java 中的方法内部类

    Java 中的方法内部类 方法内部类就是内部类定义在外部类的方法中,方法内部类只在该方法的内部可见,即只在该方法内...

  • PHP转JAVA的记录

    Java 数组 内部类 内部类的创建:内部类可以对包内其他类隐藏想实现一个接口时, 不想新建类文件 内部类可以访问...

  • Java内部类

    Java内部类,简单来说就是将一个类定义在另一个类或者方法里面,主要分为成员内部类,局部内部类,匿名内部类和静态内...

  • 类的编译期与运行期

    非静态内部类 非静态内部类到底可以有静态属性吗? static成员变量,或者static final常量 非静态内...

  • java内部类

    一、内部类为什么存在 为什么要使用内部类 二、内部类的分类 java内部类的分类 三、为什么内部类中访问局部变量,...

  • Java内部类

    Java内部类 大纲: java内部类有什么特点?为什么需要内部类? 非静态内部类持有外部类的引用 内部类的分类。...

  • 内部类

    内部类可以分为:非静态内部类;静态内部类;匿名内部类。 一、内部类 首先要说,Java为什么要使用内部类?java...

  • Java静态内部类

    Java静态内部类 博客分类: java 两种内部类 Java的内部类有两种,一种是静态内部类,另一种是普通内部类...

网友评论

      本文标题:Java内部类到底是什么玩意(二)

      本文链接:https://www.haomeiwen.com/subject/dgorxxtx.html