java 内部类

一、内部类的说明

1、在类的内部再构建一个类,则类内部构建的这个累即为内部类

2、内部类可以访问外部类的private属性和方法

复制代码
class TalkingClock {
    private int interval;
    private boolean beep;

    public TalkingClock(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }

    public void start() {
        TimePrimter listener = new TimePrimter();
        Timer timer = new Timer(interval, listener);
        timer.start();
    }

    public class TimePrimter implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            System.out.println("At the tone, time is " + Instant.ofEpochMilli(actionEvent.getWhen()));
            if (beep) Toolkit.getDefaultToolkit();
        }
    }
}
View Code
复制代码

如上的if (beep) Toolkit.getDefaultToolkit(); 这里的beep就属于外部类TalkingClock的属性

3、有时候我们可能会遇到临时变量跟外部类的变量冲突的时候我们要显示的指明是外部类的参数,那么应该指明:TalkingClock.this.beep  类似这种的方式:OutClass.this.outparam

上述的例子如果要显示指明beep属于外部类:if (TalkingClock.this.beep) Toolkit.getDefaultToolkit();

4、内部类不能有静态的方法,但是可以有静态的属性并且该属性必须为final;否则编译不通过

 

二、局部的内部类

如一中所示的例子,只有在start的时候有访问到类TimePrimter, 那么我们可以把类直接放到start内,这样子除了start函数能够访问到该类之外其他的地方都访问不到

复制代码
    public void start() {
        class TimePrimter implements ActionListener {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println("At the tone, time is " + Instant.ofEpochMilli(actionEvent.getWhen()));
                if (TalkingClock.this.beep) Toolkit.getDefaultToolkit();
            }
        }

        TimePrimter listener = new TimePrimter();
        Timer timer = new Timer(interval, listener);
        timer.start();
    }
View Code
复制代码

局部的内部类跟普通的内部类访问外部类的成员变量和函数的规则也是差不多一样的,但是局部内部类跟lambda一样可以捕获局部变量,并且规则跟lambda一样局部变量是可以设置为final即该局部变量不再做改变

 

三、匿名内部类

如二中所述,在start中该类的构建只用到了一次,那么我们在进行创建的时候可以直接创建为匿名的类

复制代码
    public void start() {
        ActionListener listener = new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                System.out.println("At the tone, time is " + Instant.ofEpochMilli(actionEvent.getWhen()));
                if (TalkingClock.this.beep) Toolkit.getDefaultToolkit();
            }
        };
        Timer timer = new Timer(interval, listener);
        timer.start();
    }
View Code
复制代码

如上的格式所示,直接new ActionListener() 后面跟{ methods and params}

 

四、静态内部类

当不需要外部类的引用,只是为了把该类隐藏在另一个类的内部

特性:1、内部类不需要访问外围类的对象;2、静态的内部类可以有静态的字段和方法;3、接口的声明中,内部类自动是static和public

 

posted @   LCAC  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示