为什么第一种方式是正确的,但第二种不是呢?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
第二种方法:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
那我在哪里可以找到更多相关信息呢?
为什么第一种方式是正确的,但第二种不是呢?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
第二种方法:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
那我在哪里可以找到更多相关信息呢?
java.lang.Object
没有声明a
方法(2),而由类实例创建表达式new Object() { public void a() {} }
返回的匿名类有一个(1)。
使用Java 10的局部变量类型推断(var
)使第二个选项与第一个选项一样有效。
var object = new Object() {
public void a() {}
};
object.a();
Object
的引用。因此,只能在该引用上调用在 java.lang.Object
中定义的方法。java.lang.Object
。该匿名类具有附加的方法a()
,这就是为什么您可以调用它的原因。Java是静态类型语言。当你执行 object.a()
时,它会在 Object
类中查找方法 a
,但是该方法不存在,因此代码无法编译。
你可以使用反射获取 object
的方法,如下所示:
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
在一个
Object object
- 你刚刚声明了它的类型!)。它使用多态来确定应该调用哪个方法,但这与动态类型不同。关于动态和静态的一些争论可以在这里找到。 - MatthewRock别担心,你需要做一些修正。 这两种方法都可以访问类的私有成员。使用第一种方法,你不需要预先声明该方法。例如:
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
interface Object
{
public void a();
}
class demo {
public static void main(String[] args) {
Object object = new Object() {
public void a() {
System.out.println("Hello");
}
}; object.a();
}
}
希望它能有所帮助。
var
是在 Java 10 中引入的,不会在较低版本中提供。 - naschObject object =
是将其向下转型为Object
,而使用var
可以将object
赋予其实际正确的类型,也就是定义了a()
方法的类型。 - Hatted Roostervar
的作用。但除了问题中的第一种语法之外,我不知道其他方法可以获得匿名类型的静态引用(即使我知道也没有)。现在我知道var
可以用于此目的。更有趣的是,它允许从匿名类中进行多个方法调用。我觉得这很新奇和有趣! - ernest_ka()
方法的接口,并从 该接口 创建一个匿名对象,而不是使用Object
,这在不支持var
的低版本中也可以工作。例如,private interface HasA { public void a(); }
然后HasA object = new HasA() { public void a() { ... } };
。 - jpmc26