内部类
概述
什么是内部类
将⼀个类A定义在另⼀个类B⾥⾯,⾥⾯的那个类A就称为内部类, B则称为外部类。
成员内部类
成员内部类:
定义在类中⽅法外的类。定义格式:在描述事物时,若⼀个事物内部还包含其他事物,就可以使⽤内部类这种结构。⽐如,汽⻋类 Car 中包含发动机类 Engine ,这时, Engine就可以使⽤内部类来描述,定义在成员位置。
使用:
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,必须要建⽴内部类的对象。
//实例化外部类对象
InnerClassMember m = new InnerClassMember();
m.wai2();
//实例化内部类对象
InnerClassMember.Memberclass nei = m.new Memberclass();
内部类和外部类有同名成员变量
外部类的成员变量: 外部类.this.变量
内部类的成员变量: this.变量
局部内部类(包含:匿名内部类)[重点]
在方法内部定义类, 只在方法中有效
在局部内部类中, 使用局部变量, 必须是final的
JDK8 后, 局部变量事实上没有发生改变, 那么final可以省略
一次性的类, 只能用一次
不能使用权限修饰符
局部内部类, 需要类只使用一次, 优化 -> 匿名内部类
匿名内部类:是内部类的简化写法。它的本质是⼀个 带具体实现的父类或者父接口的 匿名的子类对象。
匿名内部类必须继承⼀个⽗类或者实现⼀个⽗接⼝。
public interface ToolMan {
public abstract void use();
}
public class UseTool {
public static void main(String[] args) {
/*匿名内部类 省略了中间的实现类--new ToolMan(){....}*/
showUse(new ToolMan() {
@Override
public void use() {
System.out.println("用了一次");
}
});
}
public static void showUse(ToolMan t){
t.use();
}
}
实现方式
接口名/抽象类名 对象名(m) = new 接口名/抽象类名(){.....@Override重写函数.....};
FlyAble f = new FlyAble() { public void fly() {System.out.println("我⻜了~~~");} };