java_内部类

使用内部类的原因:

1.内部类可以对同一个包中的其它类隐藏

2.内部类方法可以访问定义这些方法的作用域中的数据,包括私有数据(内部类的对象会有一个隐式引用,指向实例化这个对象的外部类对象,通过这个引用(指针),内部类可以访问外部对象的全部状态,权限等于this,这个是默认的,编译器会修改所有内部类的构造器,添加一个对应外部类引用的参数,当构建内部类对象时,就会吧this指针传进来)

值得注意的点:

1.内部类中声明的所有静态字段必须是final类型,并初始化编译一个常量。

2.内部类不能有static方法。

就是内部类最好不要有静态的成员。

package demo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Instant;
import java.time.*;

/**
 * <p> TODU </P>
 *
 * @author yeager
 * @Version V1.1.1.0
 * @date 2023/11/30 9:47
 */
public class InnerClassDemo {
    //定义一个内部类
    static class TalkingClock
    {
        private  int interval;
        private  boolean beep;
        private String name;
        public TalkingClock(int interval, boolean beep)
        {
            this.interval = interval;
            this.beep = beep;
        }

        public  void start()
        {
            this.name = "Hello world";
            var listener = new TimePrinter();//this
            var timer = new Timer(interval, listener);
            timer.start();
        }
        //在时间这个内部类里再构造一个时间打印的内部类
        public class  TimePrinter implements ActionListener
        {
            //两种构造方法,其实就是告诉我们再构建内部类对象的时候,会将他的外部类的对象的引用传进来
            //这样内部类里就可以访问外部类的属性(也就是外部类对象的状态)
            public TimePrinter(TalkingClock clock)
            {
                var out = clock;
                System.out.println(out.name);
            }

            public TimePrinter()
            {
                System.out.println(TalkingClock.this.name);
                //或者直接name  也可以找
                System.out.println(name);
            }

            public void printMsg(String str)
            {
                System.out.println(str);
            }
            @Override
            public void actionPerformed(ActionEvent e) {
                    System.out.println("At the tone, the time is" +
                            Instant.ofEpochMilli(e.getWhen()));
                    if(beep) Toolkit.getDefaultToolkit().beep();
            }
        }
    }

    public static void main(String [] args)
    {
        var clock = new TalkingClock(1000,true);
        clock.start();

        //我在想  我能不能在outer的外面直接构造他的内部类的对象呢
        var timePrinter = clock.new TimePrinter();
        //var的类型是
        TalkingClock.TimePrinter timerPrinte = clock.new TimePrinter(clock);
        timePrinter.printMsg("我不是白菜");
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值