创建对象时声明方法
Declaring a method when creating an object
为什么第一种方法正确,而第二种方法不正确?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
第二种方式:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
我在哪里可以找到更多相关信息?
在第二个选项中,您将新对象分配给 Object
类型的引用。因此,只能对该引用调用 java.lang.Object
中定义的方法。
并且在第一个选项中,您基本上创建了扩展 java.lang.Object
的匿名 class 的新对象。那个匿名 class 有额外的方法 a()
,这就是你可以调用它的原因。
java.lang.Object
has no a
methods declared (2), while the anonymous class returned by 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();
Java 是静态类型的。当您说 object.a()
时,它正在寻找 Object
class 中不存在的方法 a
。因此它不编译。
你可以做的是使用反射获取 object
的方法,如下所示:
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
这将打印
In a
别担心,您需要做一些更正
两者都是访问 class 的私有成员的方法。通过使用第一种方式,您不必预先声明 method.ex: -
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
但是如果使用第二种方式,您将必须显式声明方法 a();无论是在抽象 class 还是在界面中,您都可以覆盖它。像:-
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();
}
}
希望对您有所帮助。
为什么第一种方法正确,而第二种方法不正确?
第一种方式:
new Object() {
public void a() {
/*code*/
}
}.a();
第二种方式:
Object object = new Object() {
public void a() {
/*code*/
}
};
object.a();
我在哪里可以找到更多相关信息?
在第二个选项中,您将新对象分配给 Object
类型的引用。因此,只能对该引用调用 java.lang.Object
中定义的方法。
并且在第一个选项中,您基本上创建了扩展 java.lang.Object
的匿名 class 的新对象。那个匿名 class 有额外的方法 a()
,这就是你可以调用它的原因。
java.lang.Object
has no a
methods declared (2), while the anonymous class returned by 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();
Java 是静态类型的。当您说 object.a()
时,它正在寻找 Object
class 中不存在的方法 a
。因此它不编译。
你可以做的是使用反射获取 object
的方法,如下所示:
Object object = new Object() {
public void a() {
System.out.println("In a");
}
}
Method method = object.getClass().getDeclaredMethod("a");
method.invoke(object, null);
这将打印
In a
别担心,您需要做一些更正 两者都是访问 class 的私有成员的方法。通过使用第一种方式,您不必预先声明 method.ex: -
public class demo {
public static void main(String[] args) {
new Object() {
public void a() {
/*code*/
System.out.println("Hello");
}
}.a();
}
}
但是如果使用第二种方式,您将必须显式声明方法 a();无论是在抽象 class 还是在界面中,您都可以覆盖它。像:-
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();
}
}
希望对您有所帮助。