2011年8月16日 星期二

private final 方法可以被覆蓋 (Override)

A 類別程式中, f() 及 g() 這二個方法, 因宣告為 private, 在繼承的關係中是不會被繼承, 所以根本沒覆蓋的討論, 下面程式範例, 編譯會過, 既使 B 類別程式中有相同宣告的 f() 及 g() 這二個方法

class A {

   // Identical to "private" alone:
   private final void f() {
     System.out.println("A.f()");
   }

   // Also automatically "final":
   private void g() {
     System.out.println("A.g()");
   }
}


class B extends A {
   private final void f() {
     System.out.println("B.f()");
   }

   private void g() {
     System.out.println("B.g()");
   }
}

在繼承關係中, 變數是沒有覆蓋 (Override) 的討論, 而是以 shadow 來討論, 以下範例程式, 編譯是會通過, 因沒有覆蓋討論, I 介面中的變數 KEY 既使宣告 final, A 類別一樣可以宣告同名的變數 KEY.

public interface I {
    public final String KEY = "a";
}

public class A implements I {
   public String KEY = "b";

   public String getKey() {
      return KEY;
   }
}

參考文章
1. Why can final constants in Java beoverriden ?
http://stackoverflow.com/questions/205239/why-can-final-constants-in-java-be-overriden

No Response to "private final 方法可以被覆蓋 (Override)"

張貼留言