Java中的成员内部类是指定义在一个类的内部的类,它可以访问外部类的所有成员,包括私有成员,同时外部类不能访问内部类的成员,除非创建内部类的对象。
下面是一个示例代码:
public class OuterClass { private int outerVar = 10; public void outerMethod() { InnerClass innerObj = new InnerClass(); innerObj.innerMethod(); } class InnerClass { private int innerVar = 5; public void innerMethod() { System.out.println("Inner variable: " + innerVar); System.out.println("Outer variable: " + outerVar); } } }
在这个示例代码中,OuterClass是一个外部类,它包含一个成员变量outerVar和一个成员方法outerMethod。InnerClass是一个成员内部类,它包含一个成员变量innerVar和一个成员方法innerMethod。在outerMethod中,我们创建了InnerClass的一个实例innerObj,并且调用了它的innerMethod方法,该方法打印了innerVar和outerVar的值。需要注意的是,我们只能通过创建InnerClass的对象来访问innerVar,因为innerVar是一个私有成员。
成员内部类可以被声明为private、protected、public或者default。例如,如果我们将InnerClass声明为private,则只能在OuterClass中访问它。如果我们将InnerClass声明为public,则可以在任何地方访问它。
成员内部类也可以被用来实现接口和继承类,这在某些情况下可以很有用。另外,成员内部类还可以被用来实现回调函数,这是一种常见的编程模式,可以使程序更加灵活。
下面是一个使用成员内部类实现回调函数的示例代码:
public class Button { public interface OnClickListener { void onClick(); } private OnClickListener listener; public void setOnClickListener(OnClickListener listener) { this.listener = listener; } public void click() { if (listener != null) { listener.onClick(); } } public class ButtonPrinter implements OnClickListener { @Override public void onClick() { System.out.println("Button clicked"); } } } public class MyClass { public static void main(String[] args) { Button button = new Button(); Button.OnClickListener printer = button.new ButtonPrinter(); button.setOnClickListener(printer); button.click(); } }
在这个示例代码中,我们定义了一个Button类和一个OnClickListener接口,这和前面介绍匿名内部类实现回调函数的示例类似。不同的是,在Button类中定义了一个成员内部类ButtonPrinter,它实现了OnClickListener接口的onClick()方法。在main()方法中,我们创建了一个Button对象和一个ButtonPrinter对象,使用Button的new关键字来创建内部类的实例。然后我们将ButtonPrinter对象设置为Button对象的监听器,并且通过调用Button对象的click()方法来触发监听器的回调函数。
需要注意的是,在成员内部类中使用外部类的变量时,如果变量是非静态的,则需要使用外部类的实例来访问它。例如,在上面的示例中,我们在ButtonPrinter类中访问了Button类的listener变量时,使用了Button.this.listener的方式。如果listener是静态变量,则可以直接使用Button.listener的方式访问。
总之,成员内部类是Java中一种强大而灵活的语言特性,它可以用来实现回调函数、封装复杂逻辑、实现接口和继承类等功能。但需要注意的是,它也可能会导致代码复杂度增加,所以应该根据具体情况选择合适的方式来设计和实现程序。
原文链接:codingdict.net