2014-09-06 96 views
0

执行此代码时应该打印什么? 我从here挑选的问题提供了答案,但我有点相信是错误的。首先静态函数调用已在静态的方式来完成,第二,当我们覆盖静态函数前一个不再可访问(没有新的内存分配)Java:重写静态函数

class Base { 
    public static void show() { 
     System.out.println("Base::show() called"); 
    } 
} 

class Derived extends Base { 
    public static void show() { 
     System.out.println("Derived::show() called"); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     Base b = new Derived();; 
     b.show(); 
    } 
} 
+5

'静态'方法永远不会'覆盖' – Braj 2014-09-06 20:34:18

+5

“_当我们执行这个代码时应该打印什么?_”你不能只是执行它并看到? – csmckelvey 2014-09-06 20:35:37

+0

检出[this](http://docs.oracle.com/javase/tutorial/java/IandI/override.html)由Oracle链接 – msrd0 2014-09-06 20:41:35

回答

0

static方法属于类本身和重写仅适用于实例方法。如果您在子类中再次定义相同的方法,则称为 重新定义 隐藏static方法。

static方法查找类调用它,这可以通过以下相同的代码进行验证:

Base b = null; 
b.show(); // Base::show() called 

它没有任何意义,通过对象调用static方法。

+1

实际上,它被称为“隐藏”。不是“重新定义”。请参阅http://docs.oracle.com/javase/tutorial/java/IandI/override.html和http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls -8.4.8 – 2014-09-06 20:39:08

+0

@JBNizet谢谢让我看看。 – Braj 2014-09-06 20:39:38

+0

@JBNizet感谢您纠正我。大部分时间我都阅读有关重新定义的书籍。可能是他们用错了名词。 – Braj 2014-09-06 20:41:47