Java内部类(Inner
Class)是定义在另一个类内部的类,它是Java语言的一个重要特性。
内部类提供了更好的封装性和代码组织方式。
内部类的四种类型
1.成员内部类(Member
Class)
定义在外部类的成员位置,与实例变量和方法同级。
publicclassOuter{privateStringouterField="外部类字段";//成员内部类
classInner{privateStringinnerField="内部类字段";publicvoiddisplay(){System.out.println(outerField);//可以直接访问外部类私有成员
System.out.println(innerField);}}publicvoidcreateInner(){Innerinner=newInner();//在外部类内部创建内部类实例
inner.display();}}//使用示例
Outerouter=newOuter();Outer.Innerinner=outer.newInner();//通过外部类实例创建内部类
2.静态内部类(Static
Class)
使用static修饰的内部类,不依赖于外部类的实例。
publicclassOuter{privatestaticStringstaticField="静态字段";privateStringinstanceField="实例字段";//静态内部类
staticclassStaticInner{publicvoiddisplay(){System.out.println(staticField);//System.out.println(instanceField);
错误:不能访问实例成员
}publicstaticvoidstaticMethod(){System.out.println("静态内部类的静态方法");}}}//使用示例
Outer.StaticInnerstaticInner=newOuter.StaticInner();//不需要外部类实例
Outer.StaticInner.staticMethod();//直接调用静态方法
3.局部内部类(Local
Class)
定义在方法或代码块内部的类,作用域仅限于所在的方法或代码块。
publicclassOuter{privateStringouterField="外部类字段";publicvoidmethod(){finalStringlocalVar="局部变量";//JDK8+可以省略final
//局部内部类
classLocalInner{publicvoiddisplay(){System.out.println(outerField);System.out.println(localVar);//只能访问final或等效final的局部变量
}}LocalInnerinner=newLocalInner();inner.display();}//不能在方法外访问LocalInner
}4.Inner
Class)
没有名字的内部类,通常用于实现接口或继承类的一次性使用。
//接口
interfaceGreeting{voidgreet();}publicclassOuter{publicvoidcreateAnonymousClass(){//匿名内部类实现接口
Greetinggreeting=newGreeting(){privateStringmessage="Hello";@Overridepublicvoidgreet(){System.out.println(message);}};greeting.greet();}//匿名内部类继承类
publicvoidcreateThread(){Threadthread=newThread(){@Overridepublicvoidrun(){System.out.println("匿名线程运行中");}};thread.start();}}内部类的主要作用
1.
LinkedList中的Node内部类publicclassLinkedList<E>{privateNode<E>first;privatestaticclassNode<E>{//
静态内部类,隐藏实现细节Eitem;Node<E>next;Node<E>prev;Node(Node<E>prev,Eelement,Node<E>next){this.item=element;this.next=next;this.prev=prev;}}//
外部用户无法直接创建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("按钮被点击");}});//8+)
button.addActionListener(e->System.out.println("按钮被点击"));4.
访问外部类私有成员
publicclassDataStructure{privateint[]data={1,2,3,4,5};publicIteratorgetEvenIterator(){returnnewEvenIterator();//内部类可以访问私有数据
}privateclassEvenIteratorimplementsIterator<Integer>{privateintcurrentIndex=0;@OverridepublicbooleanhasNext(){returncurrentIndex<data.length;}@OverridepublicIntegernext(){intvalue=data[currentIndex];currentIndex+=2;//只返回偶数索引的元素
returnvalue;}}}内部类的特殊语法
1.
访问外部类引用
publicclassOuter{privateStringname="Outer";classInner{privateStringname="Inner";publicvoidprintNames(){System.out.println("内部类name:"
+name);//Inner
System.out.println("外部类name:"
+Outer.this.name);//Outer
}}}2.
继承内部类
classOuter{classInner{}}classExtendedOuterextendsOuter{classExtendedInnerextendsInner{publicExtendedInner(){ExtendedOuter.this.super();//特殊的super调用
}}}实际应用场景
1.
迭代器模式
publicclassCollection<T>{privateT[]elements;publicIterator<T>iterator(){returnnewCollectionIterator();}privateclassCollectionIteratorimplementsIterator<T>{privateintindex=0;@OverridepublicbooleanhasNext(){returnindex<elements.length;}@OverridepublicTnext(){returnelements[index++];}}}2.
Builder模式
publicclassComputer{privateStringCPU;privateStringRAM;privateComputer(Builderbuilder){this.CPU=builder.CPU;this.RAM=builder.RAM;}publicstaticclassBuilder{privateStringCPU;privateStringRAM;publicBuildersetCPU(StringCPU){this.CPU=CPU;returnthis;}publicBuildersetRAM(StringRAM){this.RAM=RAM;returnthis;}publicComputerbuild(){returnnewComputer(this);}}}//使用
Computercomputer=newComputer.Builder().setCPU("Inteli7"
).setRAM("16GB").build();总结
内部类是Java中强大的特性,它提供了:
- 更好的封装:隐藏实现细节
- 代码组织:逻辑相关的类放在一起
- 多重继承模拟:通过多个内部类实现
- 回调机制:事件处理和异步编程
- 访问特权:直接访问外部类私有成员
合理使用内部类可以使代码更加清晰、模块化,并提高可维护性。


