Java四种内部类的简单理解

Java四种内部类的简单理解
Java四种内部类的简单理解在Java中内部类是一个非常重要的特性它允许我们在一个类的内部定义另一个类。本文将详细介绍四种内部类局部内部类、匿名内部类、成员内部类和静态内部类。一、什么是内部类内部类Inner Class是指定义在另一个类内部的类。根据定义位置和修饰符的不同内部类可以分为四种类型局部内部类匿名内部类成员内部类静态内部类二、局部内部类Local Inner Class定义与语法局部内部类是定义在外部类的局部位置如方法或代码块中的类并且有类名。classOuter{// 外部类publicvoidmethod(){classInner{// 局部内部类// 类体}}}核心特点访问外部类成员可以直接访问外部类的所有成员包括私有的不能添加访问修饰符因为它的地位是一个局部变量局部变量不允许使用修饰符但可以用final修饰作用域限制仅仅在定义它的方法或代码块中有效访问方式内部类访问外部类直接访问外部类访问内部类必须在作用域内创建对象后再访问命名冲突当重名时遵循就近原则如需访问外部类成员使用外部类名.this.成员完整示例packageInnerClass_;publicclassLocalInnerClass01{publicstaticvoidmain(String[]args){LouterlouternewLouter();louter.Lf01();}}classLouter{privateintLn16;// 外部类成员变量privatevoidsay(){System.out.println(外部类的私有say方法被调用);}publicvoidLf01(){// 定义局部内部类classLInner01{privateintLn18;// 与外部类同名publicvoidsay01(){// 访问内部类自己的成员System.out.println(内部Ln1 Ln1);// 直接访问外部类的私有方法say();// 访问外部类的同名成员System.out.println(外部Ln1 Louter.this.Ln1);}}// 在作用域内创建内部类对象并调用LInner01lInner01newLInner01();lInner01.say01();}}三、匿名内部类Anonymous Inner Class定义与语法匿名内部类是没有名字的内部类它的语法比较特殊直接在new关键字后面定义类体new类/接口(参数列表){// 类体}核心特点本质既是内部类也是一个对象实例使用场景当一个类只需要使用一次时使用匿名内部类可以简化开发接口实现匿名内部类可以实现接口参数列表为空因为接口没有构造器类继承可以继承普通类或抽象类参数列表根据父类构造器决定编译类型与运行类型编译类型等号左边的类型运行类型系统底层自动生成的匿名类使用示例1. 接口实现classAnon{publicvoidAn1(){// 使用匿名内部类实现接口OUounewOU(){OverridepublicvoidOOO(){System.out.println(狗叫!!!);}};ou.OOO();}}interfaceOU{voidOOO();}2. 抽象类继承classAnon{publicvoidAn1(){// 匿名内部类实现抽象类的方法Anon01anon01newAnon01(){Overridevoidcry(){System.out.println(cry!!!);}};anon01.cry();}}abstractclassAnon01{abstractvoidcry();}3. 快速调用链式调用classAnon{publicvoidAn1(){// 创建匿名内部类并直接调用方法newOU(){OverridepublicvoidOOO(){System.out.println(快速调用);}}.OOO();}}重要说明访问权限可以直接访问外部类的所有成员包括私有的修饰符限制不能添加访问修饰符地位是局部变量作用域仅在定义它的方法或代码块中命名冲突遵循就近原则如需访问外部类成员使用外部类名.this.成员四、成员内部类Member Inner Class定义与语法成员内部类是定义在外部类的成员位置并且没有static修饰classOuter{classInner{// 成员内部类// 类体}}核心特点访问外部类成员可以直接访问外部类的所有成员包括私有的可以添加修饰符可以添加任意访问修饰符public、protected、默认、private因为它是外部类的成员作用域与外部类的成员一样为整个类体访问方式成员内部类访问外部类直接访问外部类访问成员内部类创建对象再访问外部其他类访问成员内部类需要通过外部类实例命名冲突遵循就近原则使用外部类名.this.成员访问外部类成员完整示例classOuterM01{privateinta10;privateStringnamennn;// 成员内部类classInnerM01{privateintaM1666;// 内部类属性publicvoidsay(){// 直接访问外部类的私有成员System.out.println(a a name name);}}// 外部类方法访问内部类publicvoidt1(){// 创建内部类对象并访问其属性System.out.println(newInnerM01().aM1);}}五、静态内部类Static Inner Class定义与语法静态内部类是定义在外部类的成员位置并使用static修饰classOuter{staticclassInner{// 静态内部类// 类体}}核心特点访问限制只能直接访问外部类的静态成员包括私有的不能直接访问非静态成员可以添加修饰符可以添加任意访问修饰符作用域为整个类体访问方式静态内部类访问外部类直接访问所有静态成员外部类访问静态内部类创建对象再访问外部其他类访问静态内部类使用外部类名.内部类名方式命名冲突遵循就近原则使用外部类名.成员访问外部类成员完整示例classOuter{privatestaticintstaticVar100;privateintnonStaticVar200;staticclassInner{publicvoiddisplay(){// 可以访问外部类的静态成员System.out.println(静态变量: staticVar);// 不能直接访问非静态成员否则编译错误// System.out.println(nonStaticVar); // 错误}}}// 外部其他类访问静态内部类publicclassTest{publicstaticvoidmain(String[]args){// 直接通过外部类引用创建静态内部类对象Outer.InnerinnernewOuter.Inner();inner.display();}}六、四种内部类对比总结特性局部内部类匿名内部类成员内部类静态内部类定义位置方法/代码块中方法/代码块中成员位置成员位置是否有名有无有有能否用修饰符只能用final不能均可均可能否访问外部类非静态成员可以可以可以不能作用域方法/代码块方法/代码块整个类体整个类体外部其他类访问不能不能通过外部类实例通过外部类引用典型使用场景方法内部逻辑封装单次使用的类需要访问外部类实例工具类或工厂模式七、实战建议1. 何时使用内部类局部内部类当需要在方法内部封装逻辑且该类只在此方法中使用时匿名内部类当需要创建一个类的实例并立即使用时特别是事件监听器成员内部类当内部类与外部类有紧密联系且需要访问外部类实例的成员时静态内部类当内部类不需要访问外部类实例的成员且作为外部类的静态成员更合理时2. 注意事项静态内部类不能访问外部类的非静态成员内部类可以访问外部类的私有成员增强了封装性外部类不能直接访问内部类的私有成员需要通过对象引用内部类中定义的变量名与外部类重名时要使用外部类名.this.变量名区分