Java 为什么允许调用引用类实例的静态方法?

Java 为什么允许调用引用类实例的静态方法?,java,inheritance,static,subclass,superclass,Java,Inheritance,Static,Subclass,Superclass,假设我有两个类 父类: 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

假设我有两个类

父类:

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();
}
}
子类:

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
)决定调用哪个方法


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

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


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

更改
ParentClass pc=new ChildClass()
to
ChildClass pc=new ChildClass()&查看发生了什么。子类中的静态方法仅隐藏父静态方法。静态MethodsAnge
ParentClass pc=new ChildClass()中没有方法重写
to
ChildClass pc=new ChildClass()&查看发生了什么。子类中的静态方法仅隐藏父静态方法。静态方法中没有方法重写EAH静态方法中没有方法重写,但请您进一步解释pc实例的行为,以及为什么它引用父方法,甚至指向子类?Thanks@AhmadAlsanie
pc
的静态(编译时)类型是
ParentClass
。因此
pc.getInstance()
相当于
ParentClass.getInstance()。即使
pc
为空,这也会起作用。这就是静态方法调用的行为。是的,我理解:)但我的问题是为什么!为什么它被设计成这样?@AhmadAlsanie,因为静态方法不绑定到类的任何实例。因此,在调用静态方法时,类实例的动态类型并不重要。您应该询问,为什么您甚至可以通过引用类的实例来调用静态方法。我发现这种语法没有什么意义。是的,我想说的是为什么允许调用引用类实例的静态方法?是的,静态方法没有方法重写,但是你能解释一下pc实例的行为吗?为什么它引用父方法,甚至指向儿童班?Thanks@AhmadAlsanie
pc
的静态(编译时)类型是
ParentClass
。因此
pc.getInstance()
相当于
ParentClass.getInstance()。即使
pc
为空,这也会起作用。这就是静态方法调用的行为。是的,我理解:)但我的问题是为什么!为什么它被设计成这样?@AhmadAlsanie,因为静态方法不绑定到类的任何实例。因此,在调用静态方法时,类实例的动态类型并不重要。您应该询问,为什么您甚至可以通过引用类的实例来调用静态方法。我发现这种语法没有什么意义。是的,我想说的是为什么允许调用一个引用类实例的静态方法?