為什么Java里面的靜態方法不能是抽象的?
問題是為什么Java里面不能定義一個抽象的靜態方法?例如:
abstract class foo {abstract void bar( ); // <-- this is okabstract static void bar2(); //<-- this isn't why?
}
回答一
因為抽象的意思是”不實現任何功能“,而靜態的意思是”無論你有沒有一個對象實例,都要這個功能“,所以說它們邏輯上就是矛盾的。
回答二
抽象這個符號表示這個方法一定要在子類里面覆寫
在Java里面靜態成員(域和方法)不能被子類覆寫(這不一定是絕對成立在別的面向對象的語言中,像SmallTalk)一個靜態成員可能被隱藏起來,但是和覆寫在本質上是不同的。
因為靜態成員不能在子類里面被覆寫,abstrac就不可能修飾它們了
順便說一下,其他語言支持靜態繼承,就像實例繼承那樣。從語法的角度來看,這些語言通常要求類名被包括在語句里面。例如Java里面,假如你在寫A類的代碼,這些語句都是等價的(如果methodA() 是一個靜態的方法,并且沒有任何實例對象也具有有相同的簽名):
ClassA.methodA();
methodA();
在SmallTalk里面,類名不是可選的,所以這個語法是(注意:SmallTalk不用.去分割主語和動詞的,而是用它作為中止符號)
ClassA methodA.
因為這個類名是必須的,所以可以通過遍歷這個類的層次結構去決定這個類的正確版本。值得一提的是,我會偶然錯過靜態繼承,并且我剛開始使用Java時,就因為缺少靜態繼承而痛苦。另外,SmallTalk是鴨子類型的(因此是不支持契約編程的)。因此它沒有對類成員的抽象修飾符。
文章翻譯自Stack Overflow:https://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java