什么是 Java 内部类?它有什么作用?

📅 发布时间:2026/7/5 20:53:07 👁️ 浏览次数:
什么是 Java 内部类?它有什么作用?
Java内部类Inner Class是定义在另一个类内部的类它是Java语言的一个重要特性。内部类提供了更好的封装性和代码组织方式。内部类的四种类型1. 成员内部类Member Inner Class定义在外部类的成员位置与实例变量和方法同级。publicclassOuter{privateStringouterField外部类字段;// 成员内部类classInner{privateStringinnerField内部类字段;publicvoiddisplay(){System.out.println(outerField);// 可以直接访问外部类私有成员System.out.println(innerField);}}publicvoidcreateInner(){InnerinnernewInner();// 在外部类内部创建内部类实例inner.display();}}// 使用示例OuterouternewOuter();Outer.Innerinnerouter.newInner();// 通过外部类实例创建内部类2. 静态内部类Static Nested Class使用static修饰的内部类不依赖于外部类的实例。publicclassOuter{privatestaticStringstaticField静态字段;privateStringinstanceField实例字段;// 静态内部类staticclassStaticInner{publicvoiddisplay(){System.out.println(staticField);// 只能访问外部类的静态成员// System.out.println(instanceField); // 错误不能访问实例成员}publicstaticvoidstaticMethod(){System.out.println(静态内部类的静态方法);}}}// 使用示例Outer.StaticInnerstaticInnernewOuter.StaticInner();// 不需要外部类实例Outer.StaticInner.staticMethod();// 直接调用静态方法3. 局部内部类Local Inner Class定义在方法或代码块内部的类作用域仅限于所在的方法或代码块。publicclassOuter{privateStringouterField外部类字段;publicvoidmethod(){finalStringlocalVar局部变量;// JDK8可以省略final// 局部内部类classLocalInner{publicvoiddisplay(){System.out.println(outerField);System.out.println(localVar);// 只能访问final或等效final的局部变量}}LocalInnerinnernewLocalInner();inner.display();}// 不能在方法外访问LocalInner}4. 匿名内部类Anonymous Inner Class没有名字的内部类通常用于实现接口或继承类的一次性使用。// 接口interfaceGreeting{voidgreet();}publicclassOuter{publicvoidcreateAnonymousClass(){// 匿名内部类实现接口GreetinggreetingnewGreeting(){privateStringmessageHello;Overridepublicvoidgreet(){System.out.println(message);}};greeting.greet();}// 匿名内部类继承类publicvoidcreateThread(){ThreadthreadnewThread(){Overridepublicvoidrun(){System.out.println(匿名线程运行中);}};thread.start();}}内部类的主要作用1. 增强封装性// LinkedList中的Node内部类publicclassLinkedListE{privateNodeEfirst;privatestaticclassNodeE{// 静态内部类隐藏实现细节Eitem;NodeEnext;NodeEprev;Node(NodeEprev,Eelement,NodeEnext){this.itemelement;this.nextnext;this.prevprev;}}// 外部用户无法直接创建Node保证了数据结构的完整性}2. 实现多重继承Java不支持多继承但可以通过内部类模拟classAnimal{voideat(){System.out.println(动物吃);}}classMachine{voidwork(){System.out.println(机器工作);}}classRobot{privateclassAnimalInnerextendsAnimal{voideat(){System.out.println(机器人充电);}}privateclassMachineInnerextendsMachine{voidwork(){System.out.println(机器人工作);}}publicvoidbehaveLikeAnimal(){newAnimalInner().eat();}publicvoidbehaveLikeMachine(){newMachineInner().work();}}3. 回调机制和事件处理// GUI事件处理button.addActionListener(newActionListener(){// 匿名内部类OverridepublicvoidactionPerformed(ActionEvente){System.out.println(按钮被点击);}});// 使用Lambda表达式简化Java 8button.addActionListener(e-System.out.println(按钮被点击));4. 访问外部类私有成员publicclassDataStructure{privateint[]data{1,2,3,4,5};publicIteratorgetEvenIterator(){returnnewEvenIterator();// 内部类可以访问私有数据}privateclassEvenIteratorimplementsIteratorInteger{privateintcurrentIndex0;OverridepublicbooleanhasNext(){returncurrentIndexdata.length;}OverridepublicIntegernext(){intvaluedata[currentIndex];currentIndex2;// 只返回偶数索引的元素returnvalue;}}}内部类的特殊语法1. 访问外部类引用publicclassOuter{privateStringnameOuter;classInner{privateStringnameInner;publicvoidprintNames(){System.out.println(内部类name: name);// InnerSystem.out.println(外部类name: Outer.this.name);// Outer}}}2. 继承内部类classOuter{classInner{}}classExtendedOuterextendsOuter{classExtendedInnerextendsInner{publicExtendedInner(){ExtendedOuter.this.super();// 特殊的super调用}}}实际应用场景1. 迭代器模式publicclassCollectionT{privateT[]elements;publicIteratorTiterator(){returnnewCollectionIterator();}privateclassCollectionIteratorimplementsIteratorT{privateintindex0;OverridepublicbooleanhasNext(){returnindexelements.length;}OverridepublicTnext(){returnelements[index];}}}2. Builder模式publicclassComputer{privateStringCPU;privateStringRAM;privateComputer(Builderbuilder){this.CPUbuilder.CPU;this.RAMbuilder.RAM;}publicstaticclassBuilder{privateStringCPU;privateStringRAM;publicBuildersetCPU(StringCPU){this.CPUCPU;returnthis;}publicBuildersetRAM(StringRAM){this.RAMRAM;returnthis;}publicComputerbuild(){returnnewComputer(this);}}}// 使用ComputercomputernewComputer.Builder().setCPU(Intel i7).setRAM(16GB).build();总结内部类是Java中强大的特性它提供了更好的封装隐藏实现细节代码组织逻辑相关的类放在一起多重继承模拟通过多个内部类实现回调机制事件处理和异步编程访问特权直接访问外部类私有成员合理使用内部类可以使代码更加清晰、模块化并提高可维护性。