目录
[2.1 成员内部类(了解)](#2.1 成员内部类(了解))
[2.2 静态内部类(了解)](#2.2 静态内部类(了解))
[2.3 局部内部类(了解)](#2.3 局部内部类(了解))
[2.4 匿名内部类(重要)](#2.4 匿名内部类(重要))
一.内部类
定义: 在一个类的内部,再定义另一个类,里面这个类就叫内部类 ,外层的类叫外部类。
**使用场景:**一个类表示的事物是另一个类的一部分,且单独存在没有意义。
二.内部类的分类
- 成员内部类(普通内部类)
- 静态内部类(嵌套类)
- 局部内部类(方法内)
- 匿名内部类(最常用)
2.1 成员内部类(了解)
(1)注意:
- 成员内部类写在成员位置的,属于外部类的成员
- 成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等
- 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
(2)写法:
java
public class Outer {
private String msg = "外部类私有字段";
// 成员内部类
public class Inner {
public void show() {
// 直接访问外部类 private
System.out.println(msg);
}
}
}
(3)获取成员内部类对象的两种方式:
方式一:当成员内部类被private修饰时。
在外部类编写方法,对外提供内部类对象
方式二:当成员内部类被非私有修饰时,直接创建对象。
Outer.Inner oi = new Outer().new Inner();
(4)当内部类成员变量和外部类成员变量重名时,需要用 外部类名.this.变量名 调用外部类的属性。
在内部类的内存中会用 外部类.this 保存外部类的地址:

2.2 静态内部类(了解)
(1)注意:
- 静态内部类也是成员内部类中的一种
- 静态内部类只能访问 外部类中的静态变量和静态方法
- 如果在静态内部类中,想要访问外部类非静态的内容,需要先创建外部类的对象
(2)创建静态内部类的对象:
外部类名.内部类名 对象名=new 外部类名.内部类名();
Outer.Inner oi = new Outer.Inner();
(3)调用静态内部类中非静态方法的格式:
**非静态方法:**先创建对象,用对象调用
(4)调用静态内部类中静态方法的格式:
**静态方法:**外部类名.内部类名.方法名();
2.3 局部内部类(了解)
- 将内部类定义在方法里面 就叫做局部内部类,类似于方法里面的局部变量。
- 外界是无法直接使用,需要在方法内部创建对象并使用。
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
2.4 匿名内部类(重要)
1. 什么是匿名内部类?
隐藏了名字的内部类,可以写在成员位置,也可以写在局部位置。
2. 匿名内部类的格式?
new 类名或接口名() {
重写方法;
};
java
Animal a = new Animal() {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
};
interface Animal {
void eat();
}
解释:创建了一个没有名字的类,这个类实现了 Animal 接口,然后马上创建这个类的对象。
3. 匿名内部类等价于
定义一个没有名字的java类 + 实现接口/继承类 + 重写方法 +创建对象
4.使用场景
如果实现类只使用一次,就可以用匿名内部类简化代码
5.注意
接口本身不能new,我们写的new Animal(),不是直接创建接口对象,而是创建了一个实现接口的匿名类对象。