2012-08-25 46 views
0

爲什麼當我們將方法聲明爲靜態基類以及派生類並進行向上轉換時,它會調用基類方法。對靜態方法有上傳效果嗎?

class Base 
{ 
    static void show(){ 
     System.out.println("Base class...."); 
    } 
} 
class Derive extends Base 
{ 
    static void show(){ 
     System.out.println("Drive class...."); 
    }//method hidding..... 

    public static void main(String[] args) 
    { 
     Base b= new Derive(); 
      b.show();   
    } 
} 
+1

你不能覆蓋靜態方法。 – mre

回答

2

你叫Base.show,而不是Derive.show。方法隱藏不是重寫。

§8.4.8.2. of the Java Language Specification給出了證明正是這裏發生的一個例子:

是隱藏可以通過使用其類型的引用調用的類(static)方法是實際包含方法的聲明的類。在這方面,隱藏static方法不同於重寫實例方法。的例子:

class Super { 
    static String greeting() { return "Goodnight"; } 
    String name() { return "Richard"; } 
} 
class Sub extends Super { 
    static String greeting() { return "Hello"; } 
    String name() { return "Dick"; } 
} 
class Test { 
    public static void main(String[] args) { 
     Super s = new Sub(); 
     System.out.println(s.greeting() + ", " + s.name()); 
    } 
} 

產生輸出:

Goodnight, Dick

因爲問候的調用使用的s,即Super類型,要弄清楚,在編譯時,調用哪一個類方法,而name的調用使用s的類別,即Sub,以在運行時找出要調用哪個實例方法。

6

有幾個問題這裏提一下:

  • 靜態方法是不能繼承的,而不是由子類覆蓋
  • 靜態方法不需要實例被調用,他們需要一類

所以,基本上,呼籲b.show();實際上意味着調用Base.show();

+0

好吧,我明白了。感謝幫助.. –

1

上面的答案只是一個完成。最好是通過類的方法調用類方法,而不是通過實例變量:Base.show()而不是b.show()來明確該方法是靜態方法。當你隱藏一個方法而不是覆蓋它的時候,這對你的情況特別有用。