内部类就是定义在一个类里面的类,里面的类可以理解为(寄生),外部类可以理解为(宿主)。
public class People{
public class Heart{
}
}
内部类的使用场景和作用
当一个事物的内部,还需要一个部分需要一个完整的结构时。它可以方便访问外部类的成员,包括私有成员。内部类还提供了更好的封装性,内部类本身就可以用private,protected等修饰,封装性可以做更多控制。
内部类的分类
静态内部类
静态内部类使用static关键字修饰,属于外部类本身。它的特点和使用与普通类是一样的,只是位置在类的里面而已。
public class Out{
public static class In{
}
}
静态内部类创建对象的格式:
外部类名.内部类名 对象名=new 外部类名.内部类构造器;
静态内部类中可以直接访问外部类的静态成员,因为外部类的静态成员只有一份可以被共享访问。但是静态内部类中不可以直接访问外部类的实例成员,必须用外部类的对象访问。
成员内部类
成员内部类无static修饰,是属于外部类的对象,在JDK16之前,成员内部类中不能定义静态成员,现在也可以定义了。
public class Out {
public class In {}
}
成员内部类创建对象:
外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
//因为是属于外部类对象,所以要先有外部类对象才行
成员内部类中可以直接访问外部类的静态成员,也可以直接访问外部类的实例成员,因为现有外部类对象才能有成员内部类。
局部内部类
局部内部类放在方法,代码块,构造器等中
public class Out{
public static void method(){
class In{
}
}
}
局部内部类可随意访问外部类的成员变量和方法,即使是私有的。
匿名内部类
本质上是一个没有名字的局部内部类,他可以方便的创建子类对象,最终目的是为了简化代码。
new 类|抽象类名|或者接口名() {
重写方法;
};
Employee a = new Employee() {
public void work() {
}
};
a. work();
匿名内部类产生的对象类型,相当于是当前new的那个的类型的子类类型
使用形式
// 为按钮绑定点击事件监听器。
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("登录一下~~");
}
});