
内部类一、概念1. 内部类定义在一个类内部的类。1 // 外部类2 class Outer{3 // 内部类4 class Inner{}5 }2. 内部类编译之后生成独立的 .class 文件命名外部类名$内部类名.class3. 内部类可以直接使用外部类私有成员从而不破坏外部类的封装性。4. 内部类的分类成员内部类、静态内部类、局部内部类、匿名内部类。二、内部类的分类1. 成员内部类类比于实例变量【了解】(1) 位置定义在类以内方法以外。(2) 成员内部类对象的创建必须依赖于外部类的对象而创建Outer o new Outer(); // 外部类的对象Outer.Inner i o.new Inner(); // 内部类的对象(3) 外部类的当前对象外部类类名.this◦ 外部类类名.this.属性名 → 访问外部类的属性◦ 外部类类名.this.成员方法名(参数); → 调用外部类的成员方法(4) 成员内部类中不能定义静态成员(静态属性和静态方法)2. 静态内部类类比于静态变量【了解】(1) 位置定义在类以内方法以外同时被 static 修饰(2) 静态内部类中可以定义实例变量也可以定义静态变量(3) 创建静态内部类的对象只需要依赖于外部类的类名即可Outer.Inner i new Outer.Inner();(4) 访问静态内部类的静态成员时可以直接通过 外部类类名.静态内部类类名 进行访问。◦ 外部类类名.静态内部类类名.静态属性名◦ 外部类类名.静态内部类类名.静态方法名(实参);(5) 静态内部类只能访问外部类的静态成员静态属性和静态的方法3. 局部内部类类比于局部变量(1) 位置定义在方法内部(2) 局部内部类对象的创建必须在定义它的方法内部创建并且在类的定义位置后面完成对象的创建(3) 局部内部类的方法中可以访问定义它的方法内部的局部变量但是要求局部变量必须被 final 修饰。注意JDK8.0及以上版本编译器编译时如果检测到局部变量被局部内部类中方法访问则默认为此局部变量前面加 final这种技术被称为语法糖。4. 匿名内部类是一个特殊的局部内部类(1) 匿名内部类的定义必须继承一个类或是实现一个接口(2) 基于一个匿名内部类只能创建该类的一个对象并且匿名内部类的定义和对象的创建一起完成。(3) 语法接口名 引用名 new 接口名(){// 接口中需要实现的方法};(4) 匿名内部类的优缺点a. 优点减小代码量让编程思路连贯。b. 缺点可读性低。案例1实现接口的匿名内部类1 interface IA{2 void m1();3 }4 public class Test{5 public static void main(String[] args){6 IA ia new IA(){7 public void m1(){}8 };9 }10 }案例2继承类的匿名内部类1 public class Test {2 public static void main(String[] args) {3 MyClass mc new MyClass(){4 public void method(){5 System.out.println(子类覆盖后的方法。。。);6 }7 };8 mc.method();9 }10 }1112 class MyClass{13 public void method(){14 System.out.println(父类中method方法/...);15 }16 }