Java基础之内部类

内部类的简介

内部类是定义在另一个类中的类。
内部类的使用场景

    内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。
    内部类可以对同一个包中的其他类隐藏起来。
    当想要定义一个回调函数且不想大量编写代码是时,使用匿名内部类比较便捷

下面我们看一个简单程序

package com.jay.innerClass;

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

/**
 * Created by xiang.wei on 2018/1/26
 * 描述:构造一个语音时钟
 * @author xiang.wei
 */
public class InnerClassTest {
    public static void main(String[] args) {
        TalkingClock talkingClock = new TalkingClock(1000, true);
        talkingClock.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
    }
}

class TalkingClock {
    /**
     * 发布通告的时间间隔
     */
    private int interval;
    /**
     * 开关铃声的标志
     */
    private boolean beep;

    public TalkingClock(int interval, boolean beep) {
        this.interval = interval;
        this.beep = beep;
    }
    public void start() {
        ActionListener listener = new TimePrinter();
        Timer timer = new Timer(interval, listener);
        timer.start();

    }

    public class TimePrinter implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("At the tone,the time is" + new Date());
            //说明2
            if (beep) {
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }
}



在说明2中,我们看到了内部类直接引用了外部类的been变量。这里他是如何能引用的呢?
我们将外围类对象的引用称为outer。(outer不是Java的关键字)
外围类的引用在构造器中设置。编译器修改了所有内部类的构造器。添加了一个外部类引用的参数。
如上例中,编译器为这个类生成了一个默认的构造器。其代码如下:

  public TimerPrint(TalkingClock clock){
    outer=clock
  }

当在start 方法中创建了TimerPrinter对象后,编译器就会将this引用传递给当前的语音时钟的构造器
ActionListener listener = new TimerPrinter(this)
内部类的特殊语法规则

    内部类中声明的所有静态域都必须是final,原因很简单。我们希望一个静态域只有一个实例,不过对于每个外部对象,
    会分别有一个单独的内部类实例。如果这个域不是final,它可能就不是唯一的。
    内部类中不能有static方法。Java语言规范对这个限制没有做任何解释。也可以允许有静态方法,但只能访问外部类的静态域和方法。

。。。。。。。。。。。。。。。。。

版权原因,完整文章,请参考如下:Java基础之内部类

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值