【问题标题】:why is it allowed to call a static method with a reference to an instance of the class? [duplicate]为什么允许引用类的实例来调用静态方法? [复制]
【发布时间】:2016-01-11 14:11:42
【问题描述】:

假设我有 2 个班级。

父类:

public class ParentClass {
    public static void getInstance(){
        System.out.println("Parent method");
    }

}

子类:

public class ChildClass extends ParentClass {
    public static void getInstance(){
        System.out.println("child method");
    }
public static void main(String args[]){
    ParentClass pc=new ChildClass();
    pc.getInstance();
}
}

正如您在上面注意到的那样,两个类都有一个名为 getInstance() 的静态方法,在 java 和许多其他语言中,如果有一个继承的方法并且您在子类中有相同的方法,那么执行的方法是子类中的一个类。

问题是:为什么pc.getInstance();会调用父类中的方法?是的,没有覆盖静态方法的方法,但是任何人都可以解释更多 pc 实例的奇怪行为以及为什么它引用父方法,即使它指向子类? 为什么允许引用类的实例来调用静态方法?

谢谢

【问题讨论】:

  • ParentClass pc=new ChildClass(); 更改为 ChildClass pc=new ChildClass(); 看看会发生什么。
  • 子类中的静态方法只隐藏了父类的静态方法。静态方法中没有方法覆盖

标签: java inheritance static subclass superclass


【解决方案1】:

静态方法没有方法覆盖。用于调用该方法的实例的静态类型(在您的示例中为ParentClass)决定了调用哪个方法。

除此之外,使用实例引用来调用静态方法是不好的做法。您应该使用ClassName.methodName() 来执行静态方法。

【讨论】:

  • 是的,静态方法没有方法覆盖,但您能否解释更多 pc 实例的行为以及为什么它引用父方法,即使它指向子类?谢谢
  • @AhmadAlsanie pc 的静态(编译时)类型是 ParentClass。因此pc.getInstance(); 等价于ParentClass.getInstance();。即使pc 为空,这也会起作用。这就是静态方法调用的行为。
  • 是的,我明白 :) 但我的问题是为什么!为什么它被设计成这样?
  • @AhmadAlsanie 因为静态方法不绑定到类的任何实例。因此,在调用静态方法时,类实例的动态类型并不重要。你应该问为什么你甚至可以通过引用类的实例来调用静态方法。我发现这种语法没有什么意义。
  • 是的,我想说的是为什么允许通过引用类的实例来调用静态方法?
猜你喜欢
  • 2023-04-05
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 2011-12-11
  • 2012-10-01
  • 2013-09-15
  • 2020-04-20
  • 2013-05-30
相关资源
最近更新 更多