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