繁体   English   中英

继承静态方法

[英]Inheriting static methods

编辑:没关系,我想通了。 由于该方法是静态的,因此它仅查看变量的编译时类型,而对其的实例化则没有影响。

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

这将打印“ Miss Hit Hit Hit”。 我懂 但是,如果我将sayIt()方法更改为静态方法:

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

现在,它会打印“命中小姐命中小姐”。

我不知道为什么会这样。 有什么线索吗?

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

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

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

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

静态方法取决于引用类型,而不取决于对象类型。 papa.sayIt(); 总是打印Miss因为编译器将其替换为Parent.sayIt(); 关于第一种情况,您实际上是在隐藏父方法而不是对其进行覆盖。

请参阅: 覆盖vs隐藏Java-困惑

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

选中此处,添加这两行并进行测试。

 Parent p = null;
        p.sayIt();

您没有看到NPE,它调用了您的静态方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM