java 面向对象成员内部类


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