关于匿名类的主题,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 Declarations和 15.9.5. Anonymous Class Declarations以及相关部分。
关于java - Java中的匿名成员类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49324600/