继承静态方法

时间:2013-10-28 07:47:03

标签: java

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

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

现在打印出“Hit Miss Hit Miss”。

我无法弄清楚为什么会发生这种情况。有线索吗?

3 个答案:

答案 0 :(得分:0)

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

您无需创建用于访问静态方法的实例。

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

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

答案 1 :(得分:0)

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

请参阅:Overriding vs Hiding Java - Confused

答案 2 :(得分:0)

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

点击此处,添加这两行并进行测试。

 Parent p = null;
        p.sayIt();

你没有看到NPE,它会调用你的静态方法。