静态方法和多态性
static methods and polymorphism
我有一个简单的问题,但我找不到合适的答案。为什么下面的Java程序显示20?如果可能的话,我希望得到详细的答复。
class Something{
public int x;
public Something(){
x=aMethod();
}
public static int aMethod(){
return 20;
}
}
class SomethingElse extends Something{
public static int aMethod(){
return 40;
}
public static void main(String[] args){
SomethingElse m;
m=new SomethingElse();
System.out.println(m.x);
}
}
因为多态只适用于实例方法。
这里调用了static
方法aMethod
public Something(){
x=aMethod();
}
指的是在Something
中声明的aMethod
。
因为在classSomething
中声明了int x。当你制作 SomethingElse
对象时,你首先制作一个 Something
对象(必须设置 x,它使用 Something
中的 aMethod()
而不是 SomethingElse
(因为您正在创建一个 Something
))。这是因为 aMethod() 是静态的,多态性不适用于静态方法。然后,当您从 m 打印 x 时,您打印 20,因为您从未更改过 x 的值。
静态方法的继承与非静态方法不同。特别是 superclass 静态方法不会被 subclass 覆盖。静态方法调用的结果取决于调用它的对象 class。变量 x 是在创建 Something 对象期间创建的,因此调用 class (Something) 静态方法来确定其值。
考虑以下代码:
public static void main(String[] args){
SomethingElse se = new SomethingElse();
Something sg = se;
System.out.println(se.aMethod());
System.out.println(sg.aMethod());
}
它将正确打印 40、20,因为每个对象 class 调用自己的静态方法。 Java documentation 在隐藏静态方法部分描述了这种行为。
我有一个简单的问题,但我找不到合适的答案。为什么下面的Java程序显示20?如果可能的话,我希望得到详细的答复。
class Something{
public int x;
public Something(){
x=aMethod();
}
public static int aMethod(){
return 20;
}
}
class SomethingElse extends Something{
public static int aMethod(){
return 40;
}
public static void main(String[] args){
SomethingElse m;
m=new SomethingElse();
System.out.println(m.x);
}
}
因为多态只适用于实例方法。
这里调用了static
方法aMethod
public Something(){
x=aMethod();
}
指的是在Something
中声明的aMethod
。
因为在classSomething
中声明了int x。当你制作 SomethingElse
对象时,你首先制作一个 Something
对象(必须设置 x,它使用 Something
中的 aMethod()
而不是 SomethingElse
(因为您正在创建一个 Something
))。这是因为 aMethod() 是静态的,多态性不适用于静态方法。然后,当您从 m 打印 x 时,您打印 20,因为您从未更改过 x 的值。
静态方法的继承与非静态方法不同。特别是 superclass 静态方法不会被 subclass 覆盖。静态方法调用的结果取决于调用它的对象 class。变量 x 是在创建 Something 对象期间创建的,因此调用 class (Something) 静态方法来确定其值。
考虑以下代码:
public static void main(String[] args){
SomethingElse se = new SomethingElse();
Something sg = se;
System.out.println(se.aMethod());
System.out.println(sg.aMethod());
}
它将正确打印 40、20,因为每个对象 class 调用自己的静态方法。 Java documentation 在隐藏静态方法部分描述了这种行为。