一、内部类概念
a) 核心概念
内部类:在一个类的内部,定义了一个完整的类。
代码结构演示:
//外部类 class Outer{ //内部类 class Inner(){ } }
b) 编译文件特点
内部类编译之后会生成独立的.class文件,命名规则:
外部类的类名$内部类的类名.class
c) 访问特点
内部类可以直接访问外部类的成员;通常将内部类作为外部类的组件构成。
d) 内部类四大分类
成员内部类、静态内部类、局部内部类、匿名内部类
二、成员内部类(类比:实例变量)
a) 定义位置
定义在类以内、方法以外
b) 对象创建方式
成员内部类对象依赖于外部类对象创建,不能单独创建。
//1.先创建外部类对象 Outer o = new Outer(); //2.通过外部类对象创建成员内部类对象 Outer.Inner i = o.new Inner();
c) 访问权限
成员内部类可以直接访问外部类的属性和方法(私有的方法和属性也可以访问)。
d) 外部类精准调用语法
外部类类名.this:代表当前外部类的对象
-
外部类类名.this.属性:访问外部类的属性
-
外部类类名.this.成员方法(实参):访问外部类的成员方法
e) 语法限制
成员内部类不能定义静态成员(静态属性、静态的方法、静态代码块)。
三、静态内部类(类比:静态变量)【了解】
a) 定义位置
定义在类以内,方法以外,同时被 static 修饰。
b) 对象创建方式
静态内部类的对象,只需要依赖于外部类的类名即可,无需创建外部类对象。
Outer.Inner i = new Outer.Inner();
c) 静态成员访问方式
访问静态内部类的静态成员时,可以直接通过 外部类类名.静态内部类类名 进行访问。
-
外部类类名.静态内部类类名.静态属性
-
外部类类名.静态内部类类名.静态方法名(实参);
d) 访问限制
静态内部类只能访问外部类的静态成员(静态属性和静态的方法),无法访问外部类实例成员。
四、局部内部类(类比:局部变量)
a) 定义位置
定义在方法内部。
b) 对象创建规则
局部内部类对象的创建,必须在定义它的方法内部创建,并且在类的定义位置后面完成对象的创建。
c) 局部变量访问规则
局部内部类的方法中可以访问定义它的方法内部的局部变量,但是要求局部变量必须被 final 修饰。
重点注意(JDK8新特性语法糖):
JDK8.0及以上版本,编译器编译时,如果监测到局部变量被局部内部类方法访问,则默认为此局部变量添加final 修饰,无需手动书写,这种技术被称为语法糖。
五、匿名内部类(特殊的局部内部类)
匿名内部类是一个特殊的局部内部类,日常开发使用频率最高。
a) 定义前提
匿名内部类的定义必须继承一个类或是实现一个接口。
b) 核心特点
基于一个匿名内部类只能创建该类的一个对象,并且匿名内部类的定义和对象的创建同步完成。
标准语法(接口场景最常用):
接口名 引用名 = new 接口名(){ //重写接口中所有抽象方法 };
c) 匿名内部类优缺点
优点:
减小代码量,让编程思路连贯,无需单独定义实现类。
缺点:
没有类名,代码可读性较低,不适合复杂逻辑开发。
总结
-
内部类分为:成员内部类、静态内部类、局部内部类、匿名内部类,四类特性各不相同;
-
成员内部类依赖外部对象、不能定义静态成员;静态内部类依托类名、仅能访问静态资源;
-
局部内部类位于方法内,JDK8 自动隐式 final 语法糖;
-
匿名内部类简化代码,是开发中最常用的内部类形式。

557

被折叠的 条评论
为什么被折叠?



