Java 继承静态方法

Java 继承静态方法,java,Java,编辑:没关系,我想出来了。由于该方法是静态的,因此它只查看变量的编译时类型,而实例化它并没有什么区别。 class Parent { void sayIt() { System.out.println("Miss "); } } class Child extends Parent { static void sayIt() { System.out.println("Hit "); } public static void

编辑:没关系,我想出来了。由于该方法是静态的,因此它只查看变量的编译时类型,而实例化它并没有什么区别。

class Parent {
    void sayIt() {
        System.out.println("Miss ");
    }
}
class Child extends Parent {
    static void sayIt() {
        System.out.println("Hit ");
    }
    public static void main(String args[]) {
        Parent papa = new Parent();
        papa.sayIt();
        Child kid = new Child();
        kid.sayIt();
        papa = kid;
        papa.sayIt();
        kid = (Child)papa;
        kid.sayIt();
    }
}
这张打印的是“未命中”。我知道怎么做。但是如果我将
sayIt()
方法更改为static:

class Parent {
    static void sayIt() {
        System.out.println("Miss ");
    }
}
class Child extends Parent {
    static void sayIt() {
        System.out.println("Hit ");
    }
    public static void main(String args[]) {
        Parent papa = new Parent();
        papa.sayIt();
        Child kid = new Child();
        kid.sayIt();
        papa = kid;
        papa.sayIt();
        kid = (Child)papa;
        kid.sayIt();
    }
现在它会打印“命中未命中”


我不明白为什么会发生这种事。有什么线索吗?

首先,问题不应该是继承静态方法。继承不适用于静态方法

您不必为访问静态方法创建实例

使用
Parent.sayIt()
-访问用Parent.java编写的静态方法


使用
Child.sayIt()
-访问用Child.java编写的静态方法

静态方法取决于引用类型而不是对象类型<代码>爸爸说它()始终打印
Miss
,因为编译器将用
Parent.sayIt()替换它。关于第一种情况,实际上是隐藏父方法,而不是覆盖它


请参阅:

Parent papa=new Parent()--表示父类,您有静态方法。当您尝试对引用调用静态方法时,它不会查看它所持有的对象

检查这里,添加这两行并测试它

 Parent p = null;
        p.sayIt();

你看不到NPE,它调用你的静态方法。

静态方法属于类,而不是实例。它们不会在派生类中继承。您无法继承静态方法,如果添加
@Override
符号,则会出现编译错误。