1. 程式人生 > >static修飾方法--向上轉型呼叫靜態方法的特別之處(反常規)

static修飾方法--向上轉型呼叫靜態方法的特別之處(反常規)

比較下面程式碼輸出結果(實際開發中不會遇到,只是在找工作時可能會遇到)

public  class StaticTest
{
    public static void main(String[] args)
    {
        Parent p = new Child();
        p.output();
    }
}

class Parent
{
    public  void output()
    {
        System.out.println("Parent");
    }
}

class Child extends Parent
{
    public
void output() { System.out.println("Child"); } }

輸出結果為:Child

public  class StaticTest
{
    public static void main(String[] args)
    {
        Parent p = new Child();
        p.output();
    }
}

class Parent
{
    public static void output()
    {
        System.out.println("Parent"
); } } class Child extends Parent { public static void output() { System.out.println("Child"); } }

輸出結果為:Parent

為什麼加static修飾方法後結果就變不一樣了呢?
Java教程中這樣解釋的:子類可以繼承父類的靜態方法,但是子類不能重寫父類的靜態方法。在這種情況下子類怎麼辦呢,子類隱藏(術語hidden)了父類的靜態方法,因為子類沒法重寫,所以當p是Parent引用型別時,呼叫的就是Parent類裡的output()方法,而不是Child類裡的output()方法,因為Child類裡沒有重寫output()方法,意思等價於Child類里根本沒有父類版本的output()方法(Child裡的output和Parent裡的output方法是不同的方法,這樣理解)。如下程式碼可以證明子類沒有重寫父類靜態方法(方法是加上@Override表示要重寫,但是會編譯報錯)。

public  class StaticTest
{
    public static void main(String[] args)
    {
        Parent p = new Child();
        p.output();
    }
}

class Parent
{
    public static void output()
    {
        System.out.println("Parent");
    }
}

class Child extends Parent
{
    //加上註解後編譯會報錯,證明子類沒有重寫父類方法,若去掉static,編譯不會報錯
    @Override
    public static  void output()
    {
        System.out.println("Child");
    }
}

編譯結果如下:

StaticTest.java:20: 錯誤: 方法不會覆蓋或實現超型別的方法
        @Override
        ^
1 個錯誤