Java静态方法与覆盖[重复]

Posted

技术标签:

【中文标题】Java静态方法与覆盖[重复]【英文标题】:Java static methods vs overriding [duplicate] 【发布时间】:2018-08-15 16:36:51 【问题描述】:

试图从一本关于方法覆盖的书中研究一个例子。 该代码有两个类 Veggies 和 Pumpkin。我唯一的困惑是如果将南瓜的对象分配给 myveggie 对象,为什么它调用 veggies 类的方法,因为该对象来自派生类。 我确信这与静态方法有关,但我可以得到更清晰的想法。

 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();

        
    

【问题讨论】:

任何理智的 IDE 都会警告您将静态方法调用为实例方法。 静态方法是相对于类而不是实例的方法。在我看来,你永远不应该在实例上调用静态方法(即我会将myveggie.staticMethod() 替换为Veggies.staticMethod()),这很令人困惑 我认为内部类有问题,如果将它们分成两个不同的类,它会正常工作 对不起,这似乎是一个内部类。我编辑了它。 我得到了答案,仇恨者可以继续投票。 【参考方案1】:

作为这个问题:

Why doesn't Java allow overriding of static methods?

说明,Java 中不能覆盖静态方法。

您在示例中拥有的是通过实例调用静态方法的代码。这是不好的做法。

实际发生的是变量的静态类型(不是引用!)在编译时被解析为一个类。在这种情况下,类是Veggies。然后编译器插入对该类的静态方法的调用;即Veggies.staticMethod()

这令人困惑......因为看起来您应该分派到与引用关联的静态方法。但这不是 Java 的工作方式。

这就是为什么这是不好的做法,以及为什么很多 IDE 会警告你。

【讨论】:

所以尽管有对象引用,但它仍然基本上解析为 Veggies.staticMethod()? @Bissisingh 就是这样,如果你调用一个静态方法,决定调用哪个方法是由变量的类型而不是所引用的对象的类型来定义的。

以上是关于Java静态方法与覆盖[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java继承方法隐藏(覆盖)

Java中的覆盖和隐藏以及final关键字

java基础 静态 static 问在多态中,子类静态方法覆盖父类静态方法时,父类引用调用的是哪个方法?

java 静态方法可以重载吗重写呢

java方法的重写与重载

java覆盖和隐藏