Override Static Method in Java
1 minute read
今天被問到關於java static method可不可以繼承或是override的問題,於是來探討一番。
先列出幾個問題:
- static method 可不可以繼承?
- 存不存在 abstract static method ?
- 可以 override static method嗎?
以下我們就來探解釋一下java的行為
關於第一個問題,答案是可以的,static method繼承不會有什麼問題,對於subclass而言,就是繼承了父母的一個method罷了
然而在回答第二個問題前,要先解釋一下,如果你今天寫一個 abstract method,代表的是你希望這個class會有人繼承,並且override這個method。那問題來了,剛剛討論過static method可以繼承,但能不能override呢?咦這不正是我們的第三個問題嗎?
所以先來回答第三個問題,subclass 可以 override static method嗎?簡短的答案是不行。 要了解為什麼,得先搞清楚什麼是override,override就是改寫parent的method,並且是一種runtime polymorphism,絕非compile time可以完成(Ref: Geeksforgeeks )
所以即使你寫出如下的程式碼︰
public class Child extends Parent
{
public static void foo() {
System.out.println("child static foo");
}
public static void main(String[] args) {
Parent a = new Parent();
Parent b = new Child();
Parent.foo();
Child.foo();
a.foo();
b.foo();
}
}
class Parent {
public static void foo() {
System.out.println("parent static foo");
}
}
好像成功override了foo(),但事實上這是hidding . (Ref : Stack Overflow) 還有一說是這樣的設計是自我矛盾的,參見Stack Overflow
最後請你猜猜看上面那段程式碼執行的結果吧! 由此例子可以知道compile time與runtime time決定的不同
答案是:
parent static foo
child static foo
parent static foo
parent static foo