首页 > 编程笔记 > Java笔记 阅读:38

Java成员内部类和匿名内部类的用法(附带实例)

在 Java 中,内部类是指在一个类的内部定义另一个类。它们存在于嵌套关系中,外部类包含内部类,内部类可以访问外部类的成员,包括私有成员,同时也能在一定程度上实现类的封装。

内部类的一个重要特点是,它可以访问外部类的私有成员,这样可以方便地进行类之间的交互。此外,内部类还可以实现更好的封装,因为它可以隐藏在外部类中,只暴露给外部类需要使用的部分,从而避免了外部类的混乱和不必要的暴露。

Java 中的内部类可以分为四种类型:成员内部类、静态内部类、方法内部类和匿名内部类:
在 Java 中,内部类的定义方式和使用方法略有不同。对于成员内部类和静态内部类,可以直接在外部类的成员位置进行定义,并且通过外部类的实例来创建内部类的对象。对于方法内部类,它只能在方法内部定义,并且只能在方法内部使用。至于匿名内部类,它通常用于创建接口的实例或者继承自抽象类的匿名类。

本文重点介绍成员内部类和匿名内部类。

Java成员内部类

成员内部类是定义在另一个类内部的类,它与外部类之间存在一种包含关系。成员内部类可以访问外部类的所有成员,包括私有成员,这使得它们在设计复杂系统时非常有用。

下面是一个示例代码来演示成员内部类的用法:
public class OuterClass {  // ①
    private int outerData = 10; // 成员变量

    // 成员内部类
    class InnerClass { // ②
        private int innerData = 5;

        public void display() {
            System.out.println("OuterData: " + outerData);
            System.out.println("InnerData: " + innerData);
        }
    }

    public static void main(String[] args) {
        OuterClass outer = new OuterClass(); // ③ 创建外部类对象
        OuterClass.InnerClass inner = outer.new InnerClass(); //④ 创建内部类对象
        inner.display(); // ⑤ 调用内部类的 display 方法
    }
}
程序运行结果如下:

OuterData: 10
InnerData: 5

代码解释如下:

Java匿名内部类

匿名内部类是一种特殊的内部类,它没有显式的类名,在定义的同时直接创建类的实例。

通常情况下,匿名内部类用于创建接口的实例或者继承自抽象类的匿名类。它的语法相对简洁,适用于只需要临时使用一次的情况。

使用匿名内部类的示例代码如下:
public class OuterClass { // ①
    private static int outerData = 10;

    public static void main(String[] args) {
        OuterClass outer = new OuterClass(); // ②
        // 使用匿名内部类创建 InnerClass 的对象
        InnerClass inner = new InnerClass() { // ③
            private int innerData = 5; // ④

            @Override
            public void display() { // ⑤
                System.out.println("OuterData: " + outerData);
                System.out.println("InnerData: " + innerData);
            }
        };
        inner.display(); // ⑥
    }
}

// 定义 InnerClass 为接口,用于创建匿名内部类对象
interface InnerClass { // ⑦
    void display(); // ⑧
}
这段代码演示了使用匿名内部类实现一个接口,并在匿名内部类中访问外部类的静态成员变量和内部类的私有成员变量。匿名内部类是一种临时实现接口或继承抽象类的便捷方式,并且可以在创建实例的同时定义类的实现逻辑,非常灵活方便。

上述程序运行结果如下:

OuterData: 10
InnerData: 5

代码解释如下:

相关文章