0

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

它们类似于本地类,只是它们没有名称。如果您只需要使用一次本地类,请使用它们

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

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");};
    };
}

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

4

2 回答 2

1

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

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

    MyInterface mi = new LocalClass();
}

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

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

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

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

有关本地类和匿名类之间区别的更多信息,请参阅 Java 语言规范,特别是14.3。本地类声明15.9.5。匿名类声明和相关部分。

于 2018-03-16T15:51:23.547 回答
0

本地类在这里定义为在中定义,而不是在方法中。您的示例仍然是一个匿名类。如果您正在学习,请注意,您实际上可以将声明替换为 lambda 表达式,如下所示:

MyInterface mi = () -> System.out.println("test");

此外,匿名类仅被描述为类似于本地类,这意味着前者不一定是后者的子集。

于 2018-03-16T15:42:59.343 回答