第
Java面向对象之内部类的几类使用场景
Java内部类是一种特殊的类,它定义在另一个类的内部。内部类提供了许多有用的特性,包括访问外部类的私有成员、隐藏实现细节以及实现回调接口等。以下是Java内部类的一些常用场景及其举例说明:
当某个类需要一个对象来执行其方法时,通常可以使用回调接口。这时,内部类可以作为一个匿名实现类,简化代码。
在这个例子中,ActionListener是一个回调接口,Button类通过ActionListener来执行某个动作。在MAIn类中,我们使用了一个匿名内部类来实现ActionListener接口。
interfaceActionListener{
voidactionPerformed();
classButton{
privateActionListenerlistener;
publicvoidsetActionListener(ActionListenerlistener){
this.listener=listener;
publicvoidclick(){
if(listener!=null){
listener.actionPerformed();
publicclassMain{
publicstaticvoidmain(String[]args){
Buttonbutton=newButton();
button.setActionListener(newActionListener(){
@Override
publicvoidactionPerformed(){
System.out.println(Buttonclicked!);
});
button.click();
访问外部类的私有成员
内部类可以访问外部类的私有成员,这使得内部类成为了一种封装和隐藏实现细节的有效手段。在这个例子中,Inner类可以访问Outer类的私有成员secret。
classOuter{
privateintsecret=42;
classInner{
voidrevealSecret(){
System.out.println(Thesecretis:+secret);
publicInnergetInner(){
returnnewInner();
publicclassMain{
publicstaticvoidmain(String[]args){
Outerouter=newOuter();
Outer.Innerinner=outer.getInner();
inner.revealSecret();//输出Thesecretis:42
实现多继承
Java不支持多继承,但内部类可以帮助我们实现类似的效果。
interfaceA{
voidmethodA();
interfaceB{
voidmethodB();
classMyClassimplementsA{
privateclassInnerBimplementsB{
@Override
publicvoidmethodB(){
System.out.println(MethodBfromInnerB);
privateInnerBinnerB=newInnerB();
@Override
publicvoidmethodA(){
System.out.println(MethodAfromMyClass);
publicvoidmethodB(){
innerB.methodB();
publicclassMain{
publicstaticvoidmain(String[]args){
MyClassmyClass=newMyClass();
myClass.methodA();//输出MethodAfromMyClass
myClass.methodB();//输出MethodBfromInnerB
在这个例子中,MyClass实现了接口A,并通过内部类InnerB实