一.什么是内部类
定义在A类里面的类叫做内部类
A类叫做外部类
与外部和内部类无关的类叫做外部其他类
such as : 在一个A类内部定义B类,B类就叫内部类
public class outer{ public class Inner{ } }
二.什么时候用到内部类:
such as :ArrayList类 的迭代器、汽车的发动器.......
三、内部类的访问特点
-
在内部类中可以访问外部类的所有成员,包括私有的
-
外部类要访问内部类的成员,必须创建对象
-
内部类是外部类的一部分,内部类单独出现没有意义
四、内部类的分类
-
成员内部类(了解)
-
静态内部类(了解)
-
局部内部类(了解)
-
匿名内部类(重点)
五、成员内部类(了解)
1.编写注意点
-
写在成员位置的,属于外部类的成员
-
成员内部类可以被一些修饰符修饰。如:private、默认不写、protected、public、static等
-
jdk16以前不能在其中定义静态变量,jdk16开始才可以定义
2.如何创建成员内部类对象
-
在外部类中编写方法,对外提供内部类对象(当内部类私有使用)
public class Outer{ String name; private class Inner{ 语句; } public Inner getInstance(){ return new Inner(); } } 以上例子:在外部类Outer中包含私有的内部类Inner。 通过getInstance方法,可以在测试类中直接获取内部类Inner对象
-
直接创建
外部类名.内部类名 对象名 = new 外部类名().new 内部类名() Outer.Inner oi = new Outer().new Inner()
3.内部类和外部类成员变量重名时,在内部类如何获取
在内部类中,会有一个隐藏的成员变量this,用于记录外部类的地址值
System.out.println(外部类名.this.变量名); System.out.println(Outer.this.a);
六、静态内部类(了解)
1.注意事项
-
静态内部类也是成员内部类一种,用static修饰
-
静态内部类只能访问外部类中的静态变量和静态方法,如果访问非静态的需要创建外部类对象
2.创建静态内部类对象
外部类名.内部类名 对象名 = new 外部类名.内部类名(); Outer.Inner oi = new Outer.Inner();
3.获取内部类中的非静态方法
创建对象后通过对象调用 对象名.方法名(); 实例: Outer.Inner oi = new Outer.Inner(); oi.show1();
4.调用内部类的静态方法
可以通过类名调用 外部类名.内部类名.方法名(); 实例: Outer.Inner.show2();
七、局部内部类(了解)
注意事项
-
将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
-
外界无法直接使用,须在方法内部创建对象使用
-
该类可以直接访问外部类成员,也可以访问方法内的局部变量
代码解析
public class Outer{ int b = 20; public void show(){ int a = 10; //局部内部类 class Inner{ int age; public void method(){ //可以直接打印外部类的成员和所在方法内的局部成员 System.out.println(a); System.out.println(b); } } //创建局部内部类对象 Inner i = new Inner(); i.age; i.method(); } }
八、匿名内部类(重点)
1.什么是匿名内部类
隐藏了名字的内部类,可以写在成员位置,也可以在局部位置
2.格式
new 接口名(存在实现关系)/类名(存在继承关系)(){ 重写方法; };
3.格式的细节
-
包含了继承或实现,方法重写,创建对象
-
实际上,匿名内部类创建的是一个对象;一个存在继承/实现关系的类的对象,且这个类没有名字
4.使用场景
当方法的参数是接口或者类时。
以接口为例。通过接口的多态,我们可以传递这个接口的实现类对象
如果该实现类只出现一次,就可以使用匿名内部类简化 代码。
例:
5.弹幕
-
有点像匿名函数的立即执行形式,就是类名的本质其实是刚给这个代码块起了一个别名,我们之后就可以用类名代替代码块;而这里我们选择直接使用代码块,而不创建类文件
-
匿名类就是可以直接通过new 类名或者接口名,使用里面的方法(❌ 不全对)
-
比如你一个类写计算方法并且方法里调用接口的一个计算方法(方法参数是你自己定义接口) 这时候外部调用计算方法,往参数传入 匿名内部类(new 接口)计算逻辑由匿名内部类代码定义
作者的话:
都说匿名内部类比较重要,学过之后听抽象的。能听懂,但是不太明白具体干啥使。直到使用场景就会明白很多,这个知识点也准备多刷几遍