《java與模式》中有句話不對:靜態辦法無法有子類繼承
來源:互聯網
上載者:User
非常抱歉,這句話沒什麼意義,而且容易誤解。已經有好幾個讀者指出這一點,我已經在網站上的勘誤表中改正了。下面針對這個問題加以說明。
(1)一個Java類靜態方法當然可以由子類繼承。比如
class Base
{
public static void someMethod()
{
System.out.println("in static method");
}
}
class Derived extends Base
{}
class Client
{
public static void main(String[] args)
{
Derived.someMethod();
Derived d = new Derived();
d.someMethod();
}
}
運行Client會列印出兩行“in static method”,這說明靜態方法確實被子類所繼承。
(2)書中原文想要說的是:“靜態方法不能被子類override,因此不支援多態性。”一個Java方法不能被子類override,也不支援多態性,並不奇怪。構造方法就是如此。TIJ說構造方法是隱含的靜態方法,我同意這個說法。
舉一個例子:
class Base
{
public static void someMethod()
{
System.out.println("in static method of Base");
}
}
class Derived extends Base
{
public static void someMethod()
{
System.out.println("in static method of Derived");
}
}
class Client
{
public static void main(String[] args)
{
Derived.someMethod();
Derived d = new Derived();
d.someMethod();
Base o = new Derived();
o.someMethod();
}
}
執行時會列印出
in static method of Derived
in static method of Derived
in static method of Base
顯然,到底執行哪一個靜態方法,是由變數的明顯類型決定的,而不是由對象的真實類型決定。這不是多態性的。