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 - 如何设置 Eclipse 以停止发生异常的行?

java - 组织.hibernate.HibernateException : save is not valid without active transaction

JAVA定义变量时的多重操作

java - 匿名类中的最终变量

java - 对匿名类与匿名内部类感到困惑

java - 静态方法中的匿名类,引用什么?

java - java中的继承并没有按照我预期的方式工作

java - 在 main 方法中实例化内部类

reactjs - 功能组件嵌套 vs. props

c++ - 类 - 从对象 vector 中删除特定对象