Java成员内部类和匿名内部类的用法(附带实例)
在 Java 中,内部类是指在一个类的内部定义另一个类。它们存在于嵌套关系中,外部类包含内部类,内部类可以访问外部类的成员,包括私有成员,同时也能在一定程度上实现类的封装。
内部类的一个重要特点是,它可以访问外部类的私有成员,这样可以方便地进行类之间的交互。此外,内部类还可以实现更好的封装,因为它可以隐藏在外部类中,只暴露给外部类需要使用的部分,从而避免了外部类的混乱和不必要的暴露。
Java 中的内部类可以分为四种类型:成员内部类、静态内部类、方法内部类和匿名内部类:
在 Java 中,内部类的定义方式和使用方法略有不同。对于成员内部类和静态内部类,可以直接在外部类的成员位置进行定义,并且通过外部类的实例来创建内部类的对象。对于方法内部类,它只能在方法内部定义,并且只能在方法内部使用。至于匿名内部类,它通常用于创建接口的实例或者继承自抽象类的匿名类。
本文重点介绍成员内部类和匿名内部类。
下面是一个示例代码来演示成员内部类的用法:
通常情况下,匿名内部类用于创建接口的实例或者继承自抽象类的匿名类。它的语法相对简洁,适用于只需要临时使用一次的情况。
使用匿名内部类的示例代码如下:
上述程序运行结果如下:
内部类的一个重要特点是,它可以访问外部类的私有成员,这样可以方便地进行类之间的交互。此外,内部类还可以实现更好的封装,因为它可以隐藏在外部类中,只暴露给外部类需要使用的部分,从而避免了外部类的混乱和不必要的暴露。
Java 中的内部类可以分为四种类型:成员内部类、静态内部类、方法内部类和匿名内部类:
- 成员内部类是最常见的类型,它定义在外部类的成员位置,并且可以直接访问外部类的成员;
- 静态内部类定义在外部类的成员位置,但是使用 static 关键字修饰,只能访问外部类的静态成员;
- 方法内部类定义在外部类的方法内部,只能在方法内部使用;
- 匿名内部类是一种特殊的内部类,没有显式的类名,通常用于创建接口的实例或者继承自抽象类的匿名类。
在 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
- 代码第 ① 处定义了一个外部类 OuterClass,其中包含一个私有成员变量 outerData;
- 代码第 ② 处在 OuterClass 内部定义了一个成员内部类 InnerClass,它包含一个私有成员变量 innerData 和一个 display() 方法。这个方法用于输出外部类和内部类的数据;
- 代码第 ③ 处在 main 方法中创建了 OuterClass 的实例 outer;
- 代码第 ④ 处通过外部类的实例 outer 来创建成员内部类 InnerClass 的对象 inner。注意,成员内部类的创建方式是通过外部类的实例来创建的;
- 代码第 ⑤ 处调用 inner 对象的 display() 方法。
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
- 代码第 ① 处定义了一个名为 OuterClass 的类;
- 代码第 ② 处在 main 方法中创建了一个 OuterClass 的实例,以便后续使用;
- 代码第 ③ 处在 main 方法中使用匿名内部类创建了实现 InnerClass 接口的对象 inner。这里使用了匿名内部类的语法;
- 代码第 ④ 处在匿名内部类中定义了一个私有的成员变量 innerData,并初始化为 5;
- 代码第 ⑤ 处匿名内部类还实现了 InnerClass 接口的 display() 方法,并在这个方法中打印了外部类的静态成员变量 outerData 和内部类的私有成员变量 innerData;
- 代码第 ⑥ 处调用 inner 对象的 display() 方法,从而输出外部类和内部类的数据;
- 代码第 ⑦ 处在外部类中定义了一个接口 InnerClass,该接口只有一个抽象方法 display();
- 代码第 ⑧ 处在接口 InnerClass 中定义了一个抽象方法 display(),该方法将在匿名内部类中被实现。