使用内部类的原因:
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("我不是白菜");
}
}