目录
概述
类的五大成员
定义
使用场景
访问特点
分类
成员内部类
如何书写
如何创建对象
变量重名时,内部类访问变量的内存图
静态内部类
局部内部类
匿名内部类
概述
类的五大成员
属性、方法、构造方法、代码块、内部类
定义
在一个类里面再定义一个类,这个类就被称为内部类。
使用场景
内部类表示的事物是外部类的一部分,且内部类单独存在没有意义。
访问特点
内部类可以直接访问外部类的成员,包括私有成员。
外部类要访问内部类的成员,则必须创建对象。
分类
成员内部类
如何书写
- 写在成员位置的,属于外部类的成员
- 成员内部类可以被修饰符所修饰
- 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
如何创建对象
- 在外部类中编写方法,对外提供内部类的对象(在成员内部类被private修饰的情况下)
- 直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner();
变量重名时,内部类访问变量的内存图
public class Outer {private int a = 10;class Inner {private int a = 20;public void show() {int a = 30;System.out.println(Outer.this.a);System.out.println(this.a);System.out.println(a);}}
}public class Test {public static void main(String[] args) {Outer.Inner oi = new Outer().new Inner();oi.show();}
}
输出a:就近原则,所以输出值为30;
输出this.a: this指代方法的调用者,即内部类对象002地址中的值20;
输出Outer.this.a:在创建内部类对象的时候,除了有成员变量外,还会有一个隐含的外部类对象的地址,这个时候会首先找到002地址,再找到它的外部类对象001地址中的a值10。
静态内部类
-
实际上静态内部类就是成员内部类用static修饰符来修饰,是一种特殊的成员内部类
-
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的则需要创建外部类的对象 ,即:
Outer o = new Outer();
-
创建静态内部类对象的格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();
Outer.Inner oi = Outer.Inner();
- 调用静态方法的格式:外部类名.内部类名.方法名();
局部内部类
- 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
- 外界无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类中的成员,也可以访问方法内的局部变量
匿名内部类
- 匿名内部类本质上就是隐藏了名字的内部类。格式如下:
new 类名或者接口名() {重写方法;
};
- 实质上大括号包含的部分就是一个类,这个类继承了前面的类或者实现了前面的接口,加上new之后,整体就是一个类的子类对象或者接口的实现类对象。匿名内部类实际上包含了继承或实现、方法重写以及创建对象这几个过程
- 如果实现类只要使用一次,就可以使用匿名内部类简化代码