Java 中的匿名内部类

Shikha Chaudhary 2023年10月12日
  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 中的匿名内部类通过提供可重用性和减少冗长,增加了语言的功能性和多功能性。

相关文章 - Java Class