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