目录
概述
- 内部类就是定义在一个类里面的类,可以理解为里面的类是寄生,外部的类是宿主
使用场景和作用
- 当一个事物的内部还有一个部分需要一个完整结构进行描述,而这个内部的完整结构又只为外部事物服务,那么内部这个完整结构就可以用内部类来设计
- 内部类通常可以方便访问外部类的成员,包括私有的成员
- 内部类提供更好的封装性,内部类本身就可以用private protected等修饰,封装性可以做更多控制
分类
静态内部类、成员内部类、局部内部类、匿名内部类
静态内部类
- 有static修饰,属于外部类本身
- 它的特点和使用和普通的类完全一样,类有的成分它都有,只不过它在一个类的里面而已
- 创建对象的格式:外部类名.内部类名 = new 外部类名.内部类构造器()
- 访问扩展
静态内部类中可以直接访问外部类的静态成员,外部类的静态成员只有一份,可以被共享访问
静态内部类中不可以直接访问外部类的实例成员,外部类的实例成员必须用外部类的对象间接访问
成员内部类(非静态)
- 无static修饰,属于对象
- JDK16之前,成员内部类中不可以定义静态成员,JDK16开始可以定义静态成员
- 创建对象的格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
- 访问扩展
成员内部类中可以直接访问外部类的静态成员,外部类的静态成员只有一份可以被共享
成员内部类中的实例方法可以直接访问外部类的实例成员,因为必须要先有外部类对象才能有成员内部类对象
- 面试题
代码参考
注意:在成员内部类中访问所在外部类对象,格式:外部类名.this
局部内部类
- 放在方法、代码块、构造器等执行体中
- 类文件名:外部类$N内部类.class
这些代码仅仅是便于理解,了解即可,实际开发很少用到局部内部类,写这种代码会被骂的噢~
匿名内部类(重点)
概述
- 本质上是一个没有名字的局部内部类,定义在方法中、代码块中等
- 作用:方便创建子类对象,最终目的为了简化代码编写
- 格式:
下面我画了一张图来解释匿名内部类是咋来的
- 特点总结:
匿名内部类是一个没有名字的内部类
匿名内部类写出来就会产生一个匿名内部类的对象
匿名内部类的对象类型相当于是当前new的那个类型的子类类型
上述代码中蓝色区域就相当于一个老虎对象
常见使用形式
- 匿名内部类作为方法的实际参数进行传输
案例需求:某个学校需要让老师、学生、运动员一起参加游泳比赛
首先要定义一个接口代表游泳,然后本来是要定义老师、学生、运动员实现类来实现游泳这个接口,但是我们可以直接定义匿名内部类来完成游泳
public class Test2 {
public static void main(String[] args) {
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("学生在游泳");
}
};
go(s);
System.out.println("-------------------");
Swimming t = new Swimming() {
@Override
public void swim() {
System.out.println("老师在游泳");
}
};
go(t);
System.out.println("-------------------");
Swimming y = new Swimming() {
@Override
public void swim() {
System.out.println("运动员在游泳");
}
};
go(y);
}
//学生、老师、运动员可以一起参加比赛
public static void go(Swimming s){
System.out.println("开始了!");
s.swim();
System.out.println("结束了!");
}
}
//前提是必须会游泳->接口
interface Swimming{
void swim();
}
在开发中代码也可以这样简化,以上面的案例为例,将蓝色部分直接替换为go中的s,这只是稍微简化了一点点,以后还可以简化为1行~以后再说
➡
真实使用场景
- 给按钮绑定点击功能
涉及到GUI图形化编程,先不用理解,下面图上代码就是写了一个登陆界面和登录按钮,但是登录按钮点击之后没有任何反应,所以我们就要用匿名内部类对它绑定一个点击的监听事件
以下代码中蓝色区域就是匿名内部类,调用addActionListener方法对btn这个按钮对象进行监听
重写的方法内部自己设计,我这边代码的意思就是点击按钮跳出一个窗口提示“你是猪!”
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* @Author: ttong
* @Description:GUI图形化编程理解匿名内部类使用场景
*/
public class Test3 {
public static void main(String[] args) {
//1.创建窗口
JFrame win = new JFrame("登录界面");
JPanel panel = new JPanel();//定义一个桌布
win.add(panel);//把桌布添加到桌子上
//2.创建一个按钮对象
JButton btn = new JButton("登录");
//注意:绑定点击功能
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(win,"你是猪!");
}
});
//3.把按钮对象添加到桌布展示
panel.add(btn);
//4.展示窗口
win.setSize(400,300);//设置宽和高,宽400高300
win.setLocationRelativeTo(null);//设置居中显示
win.setVisible(true);
}
}
总结:在开发中,匿名内部类不是我们主动去定义的,而是当有需求的时候才会写,使用匿名内部类可以使得代码简化