迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java 中的匿名内部类

作者:迹忆客 最近更新:2023/10/10 浏览次数:

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


Java 中的匿名内部类

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

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

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

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

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

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

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

语法:

Demo d = new Demo()
{
public void demo_method()
{

//definition

}
};

这里,demo 指的是一个抽象/具体的类或一个接口。为了更好地理解匿名内部类的概念,让我们看看它与常规 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 中的匿名内部类通过提供可重用性和减少冗长,增加了语言的功能性和多功能性。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

如何在 Java 中延迟几秒钟的时间

发布时间:2023/12/17 浏览次数:217 分类:Java

本篇文章主要介绍如何在 Java 中制造程序延迟。本教程介绍了如何在 Java 中制造程序延时,并列举了一些示例代码来了解它。

如何在 Java 中把 Hashmap 转换为 JSON 对象

发布时间:2023/12/17 浏览次数:187 分类:Java

它描述了允许我们将哈希图转换为简单的 JSON 对象的方法。本文介绍了在 Java 中把 Hashmap 转换为 JSON 对象的方法。我们将看到关于创建一个 hashmap,然后将其转换为 JSON 对象的详细例子。

如何在 Java 中按值排序 Map

发布时间:2023/12/17 浏览次数:171 分类:Java

本文介绍了如何在 Java 中按值对 Map 进行排序。本教程介绍了如何在 Java 中按值对 Map 进行排序,并列出了一些示例代码来理解它。

如何在 Java 中打印 HashMap

发布时间:2023/12/17 浏览次数:192 分类:Java

本帖介绍了如何在 Java 中打印 HashMap。本教程介绍了如何在 Java 中打印 HashMap 元素,还列举了一些示例代码来理解这个主题。

在 Java 中更新 Hashmap 的值

发布时间:2023/12/17 浏览次数:146 分类:Java

本文介绍了如何在 Java 中更新 HashMap 中的一个值。本文介绍了如何在 Java 中使用 HashMap 类中包含的两个方法-put() 和 replace() 更新 HashMap 中的值。

Java 中的 hashmap 和 map 之间的区别

发布时间:2023/12/17 浏览次数:79 分类:Java

本文介绍了 Java 中的 hashmap 和 map 接口之间的区别。本教程介绍了 Java 中 Map 和 HashMap 之间的主要区别。在 Java 中,Map 是用于以键值对存储数据的接口,

在 Java 中获取用户主目录

发布时间:2023/12/17 浏览次数:218 分类:Java

这篇文章向你展示了如何在 Java 中获取用户主目录。本教程介绍了如何在 Java 中获取用户主目录,并列出了一些示例代码以指导你完成该主题。

Java 中 size 和 length 的区别

发布时间:2023/12/17 浏览次数:179 分类:Java

这篇文章教你如何知道 Java 中大小和长度之间的区别。本教程介绍了 Java 中大小和长度之间的区别。我们还列出了一些示例代码以帮助你理解该主题。

Java 中的互斥锁

发布时间:2023/12/17 浏览次数:111 分类:Java

了解有关 Java 中互斥锁的一切,在计算机科学领域,互斥或互斥被称为并发控制的属性。每台计算机都使用称为线程的最小程序指令序列。有一次,计算机在一个线程上工作。为了更好地理解,

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便