一、定义
如果一个类定义在另一个类的内部,那么这个类就是内部类。
使用场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计的时候,就可以把这个事物设计成内部类:
public class person{
//内部类
public class heart{
}
}
分类:成员内部类、静态内部类、局部内部类、匿名内部类
二、成员内部类
成员内部类是类中的一个普通成员,类似与成员变量、成员方法
定义一个内部类:
public class Outer {
public class Inner{
//类有的东西都可以有
private String name;
public static void test(){} //JDK16开始支持定义静态成员
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
创建一个内部类对象:
Outer.Inner in = new Outer().new Inner();
内部类可以访问外部类的成员。
获取不同的age示例:
我们可以通过外部类名.this拿到外部类对象。
三、静态内部类
有static修饰的内部类,属于外部类自己持有
public class Outer{
//静态内部类
public static class Inner{
}
}
创建:
Outer.Inner in = new Outer.Inner();
静态内部类中访问外部类成员的特点:可以直接访问外部类的静态成员,不可以直接访问外部类的实例成员。
四、局部内部类
局部内部类是定义在方法中、代码块中、构造器等执行体中的。
五、匿名内部类
匿名内部类是一种特殊的局部内部类;不需要为这类声明名字。
格式:
new 类或接口(参数值){
类体(一般是方法重写)
};
有一种机制可以直接得到子类对象。
public class Test {
public static void main(String[] args) {
//原理:把匿名内部类编译成一个子类,然后立即创建一个子类对象
Animal a = new Animal(){
@Override
public void jiao(){
System.out.println("猫叫");
}
};
a.jiao();
}
}
abstract class Animal{
public abstract void jiao();
}
结果:
使用场景:通常作为一个参数传输给方法
注意观察下面go方法的使用:
public class Test2 {
public static void main(String[] args) {
//常见使用场景示例
write stu = new write() {
@Override
public void writting() {
System.out.println("学生写读后感");
}
};
go(stu);
go(new write() {
@Override
public void writting() {
System.out.println("老师写读后感");
}
});
}
public static void go(write w) {
System.out.println("--------开始写读后感--------");
w.writting();
}
//学生和老师都要写读后感
interface write {
void writting();
}
}