static修飾方法--向上轉型呼叫靜態方法的特別之處(反常規)
阿新 • • 發佈:2019-01-25
比較下面程式碼輸出結果(實際開發中不會遇到,只是在找工作時可能會遇到)
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 個錯誤