2013-10-28 49 views
0

编辑:没关系,我想通了。由于该方法是静态的,因此它仅查看变量的编译时类型,并且它的实例化没有任何区别。继承静态方法

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()方法静态:

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

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

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

+0

静态方法属于类,而不是实例。它们不在派生类中继承。 –

+0

你不能继承静态方法,如果你添加'@ Override'符号,你会得到一个编译错误。 – happymeal

回答

0

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

您不需要创建访问静态方法的实例。

使用Parent.sayIt() - 用于访问写入Parent.java

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

0

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

请参见:Overriding vs Hiding Java - Confused

0

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

请点击这里,添加这两行并进行测试。

Parent p = null; 
     p.sayIt(); 

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