Java 静态方法与覆盖
Java static methods vs overriding
正在尝试处理一本关于方法覆盖的书中的示例。
该代码有两个 classes Veggies 和 Pumpkin.The 我唯一的困惑是,如果 pumpkin 的对象被分配给 myveggie 对象,为什么它调用 veggies class 的方法,因为对象来自派生class。
我确定这与静态方法有关,但我可以得到更清晰的想法。
class Veggies {
public static void staticMethod(){
System.out.println("Veggies static method");
}
public void instancemethod(){
System.out.println("Veggies instance method");
}
}
public class Pumpkin extends Veggies{
public static void staticMethod(){
System.out.println("Pumpkin static method");
}
@Override
public void instancemethod(){
System.out.println("Pumpkin instance method");
}
public static void main(String[] args) {
Pumpkin myPumpkin=new Pumpkin();
Veggies myveggie=myPumpkin;
myveggie.staticMethod();
myveggie.instancemethod();
}
}
作为这个问题:
- Why doesn't Java allow overriding of static methods?
说明,在Java.
中不能覆盖静态方法
您的示例中的代码是通过实例调用静态方法的。这是不好的做法。
实际发生的是变量的静态类型(不是引用!)在编译时解析为 class。在这种情况下,class 是 Veggies
。然后编译器插入对那个class的静态方法的调用;即 Veggies.staticMethod()
.
这令人困惑...因为看起来您应该 分派到与引用关联的静态方法。但这不是 Java 的工作方式。
这就是为什么这是不好的做法,也是为什么很多 IDE 会警告您的原因。
正在尝试处理一本关于方法覆盖的书中的示例。 该代码有两个 classes Veggies 和 Pumpkin.The 我唯一的困惑是,如果 pumpkin 的对象被分配给 myveggie 对象,为什么它调用 veggies class 的方法,因为对象来自派生class。 我确定这与静态方法有关,但我可以得到更清晰的想法。
class Veggies {
public static void staticMethod(){
System.out.println("Veggies static method");
}
public void instancemethod(){
System.out.println("Veggies instance method");
}
}
public class Pumpkin extends Veggies{
public static void staticMethod(){
System.out.println("Pumpkin static method");
}
@Override
public void instancemethod(){
System.out.println("Pumpkin instance method");
}
public static void main(String[] args) {
Pumpkin myPumpkin=new Pumpkin();
Veggies myveggie=myPumpkin;
myveggie.staticMethod();
myveggie.instancemethod();
}
}
作为这个问题:
- Why doesn't Java allow overriding of static methods?
说明,在Java.
中不能覆盖静态方法您的示例中的代码是通过实例调用静态方法的。这是不好的做法。
实际发生的是变量的静态类型(不是引用!)在编译时解析为 class。在这种情况下,class 是 Veggies
。然后编译器插入对那个class的静态方法的调用;即 Veggies.staticMethod()
.
这令人困惑...因为看起来您应该 分派到与引用关联的静态方法。但这不是 Java 的工作方式。
这就是为什么这是不好的做法,也是为什么很多 IDE 会警告您的原因。