java - Java中的匿名成员类

标签 java inner-classes anonymous-inner-class local-class

关于匿名类的主题,Oracle 文档指出...

They are like local classes except that they do not have a name. Use them if you need to use a local class only once

现在,鉴于本地类(据我所知)是在方法(或其他本地构造)中定义的类,如下所示...(其中“MyInterface”是具有抽象“测试”方法的接口(interface))

public void localTest(){
    MyInterface mi = new MyInterface(){
        @Override
        public void test(){System.out.println("test");};
    };
}

上面的内容没问题,并且符合上面的定义,但是,我还可以定义以下内容...

class MyClass{

    MyInterface mi = new MyInterface(){
        @Override
        public void test(){System.out.println("test");};
    };
}

这不在方法内,因此不是“本地”类,因此不属于上述定义范围。有没有什么地方我可以阅读有关这些类型的匿名类(如果愿意的话,可以是匿名成员类)。如果不是定义的匿名类,那么它们到底是什么?

最佳答案

您显示的两个示例都是匿名类。真正的本地类是方法(或其他代码块)中的类定义,具有实际名称(因此,不是匿名的)。根据您的示例,等效的本地类将是:

public void localTest(){
    class LocalClass implements MyInterface {
        @Override
        public void test(){
            System.out.println("test");
        }
    }

    MyInterface mi = new LocalClass();
}

在我看来,你几乎不需要本地类(class)。我想我只尝试过使用它一次,只有当我掌握了我真正需要的东西时才快速重构它。

本地类和匿名类之间最重要的区别是,您可以在同一方法中重用本地类(即在同一方法中创建多个实例;无需诉诸循环或 lambda)。

此外,由于您实际上有类定义,因此您还可以定义和调用接口(interface)或父类(super class)中未定义的方法。在 Java 10 和引入 var 之前,匿名类无法做到这一点。

其他细微差别是本地类可以是抽象的或最终的,本地类可以扩展(或被扩展)其他本地类,而匿名类不是最终的,不能是抽象的,但匿名类不能被扩展其他类。

有关本地类和匿名类之间差异的更多信息,请参阅 Java 语言规范,特别是 14.3. Local Class Declarations15.9.5. Anonymous Class Declarations以及相关部分。

关于java - Java中的匿名成员类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324600/

相关文章:

java - 看不到 JPanel

java - javac生成的名称中的$$是什么意思?

java - 具有覆盖内部方法参数的类实例

java - 这个实现会被称为匿名类吗?

java - 这两个内部类对象有何不同?

java - 访问匿名内部类中的非最终值

java - 尝试使用 javapns 向 Apple 推送通知服务发送通知

java - Autowiring 不起作用

java - Olingo (OData 4) 如何为entityType创建注释?

java - Android + MySQL 使用 com.mysql.jdbc.Driver