一、概念
1.内部类:定义在一个类内部的类
// 外部类 class Outer{ // 内部类 class Inner{} }2.内部类编译后会生成独立的.class文件,命名格式:外部类名:外部类名$内部类名.class
3.内部类可以直接使用外部类私有成员,不破坏外部类的封装性
4.内部类分为4类:成员内部类、静态内部类、局部内部类、匿名内部类
二、内部类的分类
1.成员内部类(类比实例变量)
(1)位置:类以内,方法以外
(2)创建对象:成员内部类对象依赖外部类对象创建
Outer o = new Outer(); // 外部类对象 Outer.Inner i = o.new Inner();// 内部类对象(3)访问外部类当前对象:外部类名.this.属性名/外部类名.this.成员方法(参数)
作用:访问外部类的属性、调用外部类成员方法
(4)限制:成员内部类不能定义静态属性、静态方法
2.静态内部类(类比静态变量)
(1)位置:类以内,方法以外,使用static修饰
(2)可以定义实例变量,也可以定义静态变量
(3)创建对象:只需要依赖外部类的类名即可
Outer.Inner i = new Outer.Inner();(4)访问静态内部类只能访问外部类的静态成员(静态属性、静态方法)
3.局部内部类(类比局部变量)
(1)位置:定义在方法内部
(2)创建对象:必须在定义它的方法内部创建,并且在类定义位置之后完成对象创建
(3)访问方法局部变量:局部内部类方法可以访问所在方法的局部变量;JDK8之前要求局部变量必须加final修饰
注意:JDK8.0及以上版本,编译器自动被局部内部类访问的局部变量参加final,这个特性叫语法糖
4.匿名内部类(特殊的局部内部类)
(1)定义要求:必须继承一个类或实现一个接口
(2)特点:一个匿名内部类只能创建该类的一个对象;定义和对象创建写在一起完成
(3)语法
接口名 引用名 = new 接口名(){ // 接口中需要实现的方法 };(4)优缺点
优点:减小代码量,代码逻辑连贯
缺点:可读性低
案例1:实现接口
interface IA{ void m1(); } public class Test{ public static void main(String[] args){ IA ia = new IA(){ public void m1(){} }; } }案例2:继承父类,重写方法
public class Test { public static void main(String[] args) { MyClass mc =new MyClass(){ public void method(){ System.out.println("子类重写后的方法..."); } }; mc.method(); } } class MyClass{ public void method(){ System.out.println("父类中method方法/..."); } }