Java 中的匿名内部类

Shikha Chaudhary 2023年10月12日 Java Java Class
  1. Java 中的匿名内部类
  2. Java 中匿名内部类的变量和成员
  3. 在 Java 中创建匿名内部类
  4. Java 中不同类型的匿名内部类
  5. Java 中匿名内部类的优点
  6. 结论
Java 中的匿名内部类

本文讨论 Java 中的 Anonymous Inner 类及其用途。

Java 中的匿名内部类

匿名这个词的意思是 - 未知的名字。Java 匿名内部类也是如此。

没有名称且我们只需要为其创建单个对象的内部类称为 Java 匿名内部类。当我们必须做一些额外的事情(例如从类或接口重载方法)时必须创建对象的实例时,它很有用。

我们可以通过使用 Java 匿名内部类来做到这一点,而无需创建该类的子类。

换句话说,一个没有名字的类被称为 Java 匿名内部类。通常,每当我们创建一个新类时,它都有一个名称。

因此,Java 匿名内部类不用于创建新类。相反,我们用于覆盖类或接口的方法。

它们在图形编程中也很有用,我们为侦听器接口编写实现类。

Java 匿名内部类的语法类似于构造函数的调用,只是类定义也存在于代码块中。

语法:

Demo d = new Demo() {
  public void demo_method() {
    // definition
  }
};

这里,demo 指的是一个抽象/具体的类或一个接口。为了更好地理解匿名内部类的概念,让我们看看它与常规 Java 类有何不同。

  • 我们可以使用普通类实现任意数量的接口,但匿名内部类一次只能实现一个接口。
  • 一个常规类可以扩展另一个类并同时实现多个接口。而另一方面,匿名内部类一次只能做这些事情中的一件。
  • 构造函数的名称与类的名称相同。这意味着我们可以在常规类中编写任意数量的构造函数,但对于匿名内部类则不然。

要了解有关 Java 内部类的更多信息,请参阅此文档

Java 中匿名内部类的变量和成员

匿名内部类也像 Java 中的任何本地类一样捕获变量。对局部变量的访问与封闭类相同。

封闭类的成员可由匿名类访问。但是,它不能访问那些不是 final 的局部变量(即使是那些存在于其封闭范围内的变量)。

此外,如果我们在匿名类中声明任何类型,它会隐藏在该范围内具有相同名称的其他声明。匿名内部类也有一些限制。

  • 匿名内部类不允许声明静态初始化器或成员接口。
  • 如果静态成员是常量变量,它们可以是匿名类的一部分。

它得出的结论是,我们可以在匿名类中声明一个字段、额外的方法、实例初始化程序和本地类。

在 Java 中创建匿名内部类

我们可以使用两种主要方法来创建匿名内部类。这些包括使用:

  • 一个类(抽象或具体)
  • 一个界面

让我们一一看看。

在 Java 中使用类创建匿名内部类

首先,看下面的例子。

abstract class Demo {
  abstract void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      void demo() {
        System.out.println("This is a demo of an anonymous inner class using  class.");
      }
    };
    d.demo();
  }
}

输出:

This is a demo of an anonymous inner class using class.

在这里,创建了一个类,其名称由编译器决定。该类扩展了 Demo 类并实现了 demo() 方法。

匿名类的对象是 d。它是匿名类型 Demo 类的引用变量。请注意,我们将其保存为 AnonymousDemo.java 以进行编译。

下面的代码是编译器如何生成内部类。

import java.io.PrintStream;
static class AnonymousDemo$1 extends Demo {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is a demo of an anonymous inner class using class.");
  }
}

在 Java 中使用接口创建匿名内部类

在上一节中,我们使用了一个类。但是在这里,我们将使用匿名内部类的接口。让我们通过一个例子来理解这一点。

interface Demonstration {
  void demo();
}
class AnonymousDemo {
  public static void main(String args[]) {
    Demonstration d = new Demonstration() {
      public void demo() {
        System.out.println("This is an example of an anonymous inner class using an interface.");
      }
    };
    d.demo();
  }
}

输出:

This is an example of an Anonymous inner class using an interface.

在这里,创建了一个类,其名称由编译器决定。这个类实现了接口 Demonstration 并给出了 demo() 方法的实现。

匿名类的对象是 d。它是 Demonstration 类型的引用变量。请注意,我们将其保存为 AnonymousDemo.java 以进行编译。

下面的代码是编译器如何生成内部类。

import java.io.PrintStream;
static class AnonymousDemo$1 implements Demonstration {
  AnonymousDemo$1() {}
  void demo() {
    System.out.println("This is an example of an anonymous inner class using an interface.");
  }
}

Java 中不同类型的匿名内部类

匿名内部类根据声明和行为分为 3 种类型。

  • 扩展类的匿名内部类。
  • 实现接口的匿名内部类。
  • 匿名内部类在方法/构造函数参数中定义。

让我们一一讨论这三种类型。

在 Java 中扩展类的匿名内部类

我们可以通过扩展一个 Thread 类来创建一个线程,我们也可以有一个匿名的内部类来扩展一个类。

我们在这里使用 new 关键字来创建一个引用父类类型的对象。看下面的例子。

class Demo {
  public void example() {
    System.out.println("Types of Anonymous classes");
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d1 = new Demo();
    d1.example();
    Demo d2 = new Demo() {
      @Override
      public void example() {
        System.out.println("Type - 1");
      }
    };
    d2.example();
  }
}

输出:

Types of Anonymous classes
Type - 1

在 Java 中实现接口的匿名内部类

我们可以通过实现 Runnable 接口来创建线程,匿名内部类也可以实现接口。我们使用 new 关键字来创建一个引用接口类型的匿名内部类对象。

interface Demo {
  public void demo();
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Demo d = new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 2");
      }
    };
    d.demo();
    System.out.println(d.getClass().getName());
  }
}

输出:

Type - 2
AnonymousDemo$1

Java 中方法/构造函数参数中的匿名内部类

方法或构造函数参数中的匿名内部类可用于 GUI(图形用户界面)应用程序。在这里,我们使用匿名内部类作为参数并将其传递给方法或构造函数。

这是一个例子。

abstract class Demo {
  public abstract void demo();
}
class Example {
  public void example(Demo d) {
    d.demo();
  }
}
public class AnonymousDemo {
  public static void main(String args[]) {
    Example e = new Example();
    e.example(new Demo() {
      @Override
      public void demo() {
        System.out.println("Type - 3");
      }
    });
  }
}

输出:

Type - 3

Java 中匿名内部类的优点

匿名内部类关闭了方法的局部变量,这是对内部类的额外优势。此外,这些类减少了冗长并提供了可重用性。

此外,这些类可以帮助开发人员,因为他们不必自己为每个类查找名称。我们可以同时使用匿名内部类声明和实例化一个类。

总的来说,匿名内部类是 Java 的优势之一。

要了解有关 Java 中匿名内部类的更多信息,请参阅此文档

结论

在本文中,我们讨论了 Java 匿名内部类。我们看到了常规类和匿名内部类之间的区别。

我们还讨论了 Java 匿名内部类的用法和优点。此外,我们通过代码和示例了解了实现和语法。我们甚至了解了各种类型的 Java 匿名内部类。

总之,Java 中的匿名内部类通过提供可重用性和减少冗长,增加了语言的功能性和多功能性。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe

相关文章 - Java Class