什么是内部类?
写在一个类里面的类
什么时候用到内部类?
当B类是A类的一部分,且B类单独存在时没有意义
例如: 汽车的发动机,ArrayList的迭代器,人的心脏等等
内部类的分类
(1)成员内部类
成员内部类的代码如何书写
写在成员位置的,属于外部类的成员
成员内部类可以被一些修饰符所修饰,比如private,默认,public,protected,static等
在成员内部类里面,JDK16之前不能定义静态变量,JDK16以后才可以定义静态变量
如何创建成员内部类的对象
方式一:在外部类中编写方法,对外提供内部类的对象(一般用private修饰的内部类,使用这种方法)
方式二: 直接创建
外部类名.内部类名 对象名= 外部类对象.内部类对象;
范例: Outer.Inner oi = new Outer().new Inner();
内部类的成员变量与外部类成员变量重名时,在内部类如何访问外部类的成员变量?
System.out.println(Outer.this.变量名);
(2)静态内部类
静态内部类也是成员内部类的一种,静态内部类只能访问外部类中的静态变量和静态方法, 如果想要访问非静态的需要创建对象.
创建静态内部类对象的格式: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
调用非静态方法的格式: 先创建对象, 用对象调用
调用静态方法的格式: 外部类名.内部类名.方法名();
(3)局部内部类
1. 将内部类定义在方法里面就叫做局部内部类, 类似于方法里面的局部变量.
2. 外界是无法直接使用, 需要在方法内部创建对象并使用.
3. 该类可以直接访问外部类的成员, 也可以访问方法内的局部变量.
(4)匿名内部类
1. 什么是匿名内部类
匿名内部类本质上就是隐藏了名字的内部类, 可以写在成员位置, 也可以写在局部位置.
2. 格式:
new 类名或者接口名(){
重写方法;
};
举例:
new Inter(){
public void show(){
}
};
3. 格式的细节
包含了继承或实现, 方法重写, 创建对象.
整体就是一个类的子类对象或者接口的实现类对象
4. 使用场景
当方法的参数是接口或者类的时候,
以接口为例, 可以传递这个接口的实现类对象,
如果实现类只要使用一次, 就可以用匿名内部类简化代码.