java 面向对象内部类


Java中的内部类是定义在另一个类中的类。它们可以访问外部类的私有成员,而不需要暴露这些成员给外部世界。

内部类可以分为以下四种类型:

  1. 成员内部类(Member Inner Class):定义在类的内部,并且与类的成员变量和方法具有相同的访问权限。
  2. 局部内部类(Local Inner Class):定义在方法或语句块的内部,仅在所定义的代码块中可见。
  3. 匿名内部类(Anonymous Inner Class):没有类名的内部类,通常用于创建实现某个接口或继承某个类的对象。
  4. 静态内部类(Static Inner Class):定义在类的内部,但是使用 static 关键字修饰,这意味着它可以像普通类一样被实例化。

内部类的语法格式如下:

class OuterClass {
    //...

    class InnerClass {
        //...
    }
}

在外部类中创建内部类的实例的语法如下:

OuterClass outerObject = new OuterClass();
OuterClass.InnerClass innerObject = outerObject.new InnerClass();

需要注意的是,内部类在编译后会生成一个单独的 .class 文件,文件名为 OuterClass$InnerClass.class,其中 $ 符号用来分隔外部类和内部类的名称。

在Java中,内部类具有以下特点:

  1. 内部类可以访问外部类的所有成员,包括私有成员。
  2. 外部类不能访问内部类的成员,除非创建了内部类的对象。
  3. 内部类可以被声明为 private、protected、public 或者 default。
  4. 内部类可以访问它所在方法中的 final 局部变量,但是这些变量必须声明为 final。
  5. 内部类可以被用来实现接口和继承类。
  6. 内部类可以被用来实现回调函数。

下面是一个例子,演示了如何在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);
        }
    }
}

在这个例子中,InnerClass 是一个成员内部类,它可以访问 OuterClass 中的私有成员 outerVar。在 outerMethod() 方法中,我们创建了 InnerClass 的一个实例 innerObj,并且调用了它的 innerMethod() 方法,该方法打印了 innerVar 和 outerVar 的值。需要注意的是,我们只能通过创建 InnerClass 的对象来访问 innerVar,因为 innerVar 是一个私有成员。

在Java中,内部类还可以用来实现回调函数。回调函数是一种常见的编程模式,它允许一个对象将某些事件委托给另一个对象处理。内部类可以被用来实现回调函数,因为它们可以访问外部类的成员,从而在回调时提供必要的数据和操作。

下面是一个使用内部类实现回调函数的例子:

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 MyClass {
    public static void main(String[] args) {
        Button button = new Button();
        button.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick() {
                System.out.println("Button clicked");
            }
        });
        button.click();
    }
}

在这个例子中,我们定义了一个 Button 类和一个 OnClickListener 接口。Button 类中有一个 setOnClickListener() 方法,该方法接受一个 OnClickListener 对象,并将其存储在 listener 变量中。click() 方法用于模拟按钮点击事件,并在回调时调用 OnClickListener 接口的 onClick() 方法。

在 main() 方法中,我们创建了一个 Button 对象,并使用匿名内部类的方式实现了 OnClickListener 接口。这个匿名内部类实现了 onClick() 方法,该方法在按钮被点击时输出一条消息。最后,我们调用了 button.click() 方法来触发按钮的点击事件,并在控制台输出了一条消息。

需要注意的是,这个例子中的 OnClickListener 接口和 Button 类都是嵌套在 MyClass 类中的。这种嵌套的方式可以用来组织代码,使其更易读和维护。


原文链接:codingdict.net