为什么第一种方法是正确的,但第二种方法却不正确?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
第二种方式:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
在哪里可以找到有关它的更多信息?
答案 0 :(得分:43)
java.lang.Object
没有声明(2)的a
方法,而the class instance creation expression new Object() { public void a() {} }
返回的匿名类具有(1)。
使用Java 10的local variable type inference(var
)使第二个选项与第一个选项一样有效。
var object = new Object() {
public void a() {}
};
object.a();
答案 1 :(得分:21)
在第二个选项中,将新对象分配给类型为Object
的引用。因此,只能在该引用上调用java.lang.Object
中定义的方法。
在第一个选项中,您基本上创建了扩展java.lang.Object
的匿名类的新对象。该匿名类具有附加方法a()
,这就是为什么您可以调用它的原因。
答案 2 :(得分:2)
Java是静态类型的。当您说object.a()
时,它正在寻找a
类中不存在的方法Object
。因此它无法编译。
您可以做的是使用反射获得object
的方法,如下所示:
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
这将打印
在
答案 3 :(得分:0)
别担心,您将需要进行一些更正 两种都是访问类的私有成员的方法。通过第一种方法,您不必预先声明method.ex:-
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
但是通过使用第二种方法,您将必须显式声明方法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();
}
}
我希望这会有所帮助。