关于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");};
};
}
这不是一种方法,因此不是“本地”。因此,并不属于上述定义。有没有我可以阅读这些类型的匿名类(如果你愿意,匿名成员类)。如果没有定义的匿名类,它们究竟是什么?
答案 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 Declarations和15.9.5. Anonymous Class Declarations及相关章节。
答案 1 :(得分:0)
本地类定义为here,因为它是在块中定义的,而不是在方法中定义的。您的示例仍然是匿名类。如果您正在学习过程中,请注意,您实际上可以使用lambda表达式替换声明,如下所示:
MyInterface mi = () -> System.out.println("test");
此外,匿名类仅被描述为类本地类,这意味着前者不一定是后者的子集。