Java中的匿名成员类

时间:2018-03-16 15:39:32

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

关于Anonymous类的主题,Oracle文档说明了......

  

它们就像本地类,除了它们没有名称。如果您只需要使用本地课程,请使用它们

现在,鉴于本地类是(据我所知)在方法(或其他一些本地构造)中定义的类,如下所示......(其中' MyInterface'是一个带抽象的接口& #39;测试方法)

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

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

2 个答案:

答案 0 :(得分:1)

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

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

    MyInterface mi = new LocalClass();
}

在我看来,你几乎不需要当地的课程。我想我只试过用过一次,只有在我掌握了实际需要的东西时才快速重构它。

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

此外,当您实际拥有类定义时,您还可以定义和调用在接口或超类中未定义的方法。在Java 10之前和var的引入之前,匿名类是不可能的。

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

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

答案 1 :(得分:0)

本地类定义为here,因为它是在中定义的,而不是在方法中定义的。您的示例仍然是匿名类。如果您正在学习过程中,请注意,您实际上可以使用lambda表达式替换声明,如下所示:

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

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