内部类定义
在一个类内部的类,称为内部类。
说明:内部类通常表示**"**整体与部分" 的关系
B 是 A 的一部分
B 单独存在没有实际意义
分类
| 类型 | 定义位置 |
|---|---|
| 成员内部类 | 类中,方法外 |
| 静态内部类 | 类中,方法外(static 修饰) |
| 局部内部类 | 方法中 |
| 匿名内部类 | 方法中,没有类名 |
成员内部类
可以被修饰符所修饰,例如:private、默认、protected、public、static(静态内部类)
创建对象方式
在外部类中编写方法,对外提供内部类的对象
java
class Outer {
class Inner {}
public Inner getInner() {
return new Inner();
}
}
直接创建格式
java
Outer.Inner inner = new Outer().new Inner();
静态内部类
创建对象方式
直接创建格式
java
Outer.Inner inner = new Outer.Inner();
访问规则
只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象
创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名 ();
调用非静态方法的格式:先创建对象,用对象调用
调用静态方法的格式:外部类名.内部类名.方法名 ();
局部内部类
访问规则
外界是无法直接使用,需要在方法内部创建对象并使用。
该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
匿名内部类
本质
是隐藏了名字的内部类
格式
new 类名或接口名(){
重写方法
}
new Swim() {
@Override
public void swim() {
System.out.println("游泳");
}
};
等价过程
去掉
class这个"没有名字的类"实现
Swim接口必须重写接口中所有抽象方法
同时创建了该类的对象
使用场景
当方法的参数是接口或者类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码
java
public static void main(String[] args) {
method(new Swim() {
@Override
public void swim() {
System.out.println("自由泳");
}
});
}
public static void method(Swim s) {
s.swim();
}