内部类:成员内部类、 静态内部类、 局部内部类、 匿名内部类
1、内部类:在一个类的里面再定义一个类(B类表示的事物是A类的一部分,且B单独存在没有意义,比如汽车的发动机,ArrayList的迭代器,人的心脏等)
- package a01innerclass6;
-
- public class Car {
- private String carName;
- String carColor;
- int age;
-
- public void show() {
- Engine engine = new Engine();
- System.out.println(engine.engineName);
- }
- // 内部类的访问特点:
- // 内部类可以直接访问外部类的成员包括私有,外部类要访问内部类的成员,必须创建对象
- class Engine {
- String engineName;
- int engineAge;
-
- public void show() {
- System.out.println(engineName);
- System.out.println(carColor);
- System.out.println(carName);
- }
- }
-
- }
2、成员内部类:

获取成员内部类对象的两种方式:
方式一:外部类编写方法,对外提供内部类对象
方式二:直接创建
格式: Outer.Inner oi = new Outer().new Inner();
案例:
- package a01innerclass6;
-
- public class Outer {
- private int a = 10;
-
- class Inner {
- private int a = 20;
-
- public void show(){
- int a = 30;
- System.out.println(a); // 30
- System.out.println(this.a); // 20
- System.out.println(Outer.this.a); // 10
- }
- }
- }
-
-
- public static void main(String[] args) {
- Outer.Inner oi = new Outer().new Inner();
- oi.show();
- }
3、静态内部类
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象

- public class Outer {
- int a = 10;
- static int b = 20;
- // 静态内部类
- static class Inner {
- public void show1(){
- Outer o = new Outer();
- System.out.println(o.a);
- System.out.println(b); // 20
- System.out.println("非静态方法被调用了");
- }
-
- public static void show2(){
- System.out.println("静态方法被调用了");
- }
- }
- }
-
- public static void main(String[] args) {
-
- //创建静态内部类的对象
- //只要是静态的东西,都可以用类名点直接获取
- Outer.Inner oi = new Outer.Inner();
- oi.show1();
-
- //静态方法
- Outer.Inner.show2();
- }
4、局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
- 外界是无法直接使用,需要在方法内部创建对象并使用
该类可以直接访问外部类的成员,也可以访问方法内的局部变量
5、匿名内部类
本质上是隐藏了名字的内部类
new 类名或接口名() {
重写方法;
};
包含了继承或实现,方法重写,创建对象
整体就是一个类的子类对象或者接口的实现类对象
使用场景:
当方法的参数是接口或类时
以接口为例可以传递这个接口的实现类对象(实际上是利用接口的多态)
如果实现类只实现一次就可以使用内部类简化代码
