2012-07-24 81 views
0

可能重複:
Can we override static method in Java?爲什麼我們不能覆蓋靜態方法在派生類中

我們不能重寫基類的靜態方法。

其實我想是這樣的:

// Base class 
public class StaticExampleImpl { 
    protected String name="overriding"; 
    public static void display(){ 
     System.out.println("static method display : base class"); 
    } 
} 

然後派生類如下:

//derived class 
public class StaticDemo extends StaticExampleImpl { 
    // cannot override the static methods... 
    //@Override 
    public static void display(){ 
     System.out.println("child!!! static method display"); 
    } 
    public static void main(String[] args) { 
     StaticDemo d=new StaticDemo(); 
     d.display(); // derived class display is called rather than Base class. 
    } 
} 

所以,當我取消對@Override方法,它提供了錯誤的「靜態方法不能被覆蓋「。但與評論它工作正常。所以,當我們創建對象並用這些實例調用靜態方法時,這些工作就很好。那麼區別是什麼呢??

+0

你試圖做的事情根本沒有意義。爲什麼你想要另一個與現有名稱相同的靜態方法?只需要創建一個新名字。 – 2012-07-24 11:29:46

回答

5

因爲靜態方法沒有被繼承。

當您取消註釋@Override這意味着您要重寫 靜態方法,這是不可能這就是爲什麼你得到一個 錯誤。

但是當你評論//@Override這意味着你正在聲明一個新的子類 方法。

+0

不,它被繼承,對於上面的ex,評論子類的顯示,然後在主要函數中調用d.display(),甚至可以工作 – Lakshmi 2012-07-24 11:25:37

+0

@lakshmi靜態不在Java中繼承。相反,在類中聲明的靜態成員是(受到「訪問」限制的)直接在派生類的名稱空間中可見,除非它們被派生類中的聲明「隱藏」。 – 2012-07-24 11:35:40

0

靜態方法不能被繼承。如果你想調用'基類'類的靜態方法,你必須明確地調用StaticExampleImpl.display()

+0

您可以通過它的子類訪問靜態方法,因爲它**會繼承**。 – 2012-07-24 11:28:38

1

靜態方法不屬於某個類的實例,它屬於實際的類。

當您致電d.display();時,您確實在調用StaticDemo d引用的靜態方法的靜態方法。

如果你這樣做:

StaticExampleImpl d2 = new StaticDemo();d2.display(),你會發現,它調用基類的顯示器。

但是,不要這樣做。它會導致代碼混淆,並且不好的實現繼承的方式不好。

0

靜態方法綁定到類,他們不能被繼承這就是爲什麼你不能在派生類中有基類靜態方法。

0

如果您試圖重寫靜態方法,那麼您的設計可能有問題。

OOP和多態性可以讓你做到以下幾點:

public class MyClass1 { 

    public String toString() { return "MyClass1 Instance"; } 

} 

public class MyClass2 extends MyClass1 { 

    @Override 
    public String toString() { return "MyClass1 Instance"; } 

} 

public void printSomething(MyClass1 myclass1){ 
     System.out.println(myclass1); 
} 

內printSomething,toString方法,其將被稱爲是在運行時類型MyClass1的的一個:當你通過內部printSomething實例它的編譯類型將爲MyClass1,但其運行時類型將爲MyClass2

很明顯,要使用多態,需要對象實例,其中實際運行時類型可能與編譯類型不同。然而,靜態方法不屬於任何對象實例,而是屬於類。你爲什麼不向我們解釋你想要達到的目標?

0

下面的代碼:

StaticExampleImpl one = new StaticExampleImpl(); 
StaticDemo two = new StaticDemo(); 
StaticExampleImpl three = two; 

one.display(); 
two.display(); 
three.display(); 

將產生以下輸出:

static method display : base class 
child!!! static method display 
static method display : base class 

正如你所看到的,方法沒有得到繼承。這就是爲什麼他們被稱爲「靜態方法」:它們是靜態調用的,而不是動態的,就像實例方法那樣。調用靜態方法時,類的編譯時類型是非常重要的,而不是運行時類型。

這也是爲什麼你不應該通過對象實例調用靜態方法。總是打電話給他們這樣的:

StaticExampleImpl.display(); 
StaticDemo.display(); 

這完全帶走,可能(會)拿出當人們期待繼承這些方法工作的混亂。

0

java中的任何靜態塊,可能是靜態變量,當類加載時會加載方法。你可能知道Java中的類加載器。所以事情是靜態塊(方法,變量或任何東西是靜態的)被加載一次。所以你實際上不能覆蓋任何靜態塊。

評論@Override意味着你正在編寫另一個靜態方法在子類中,但不只是重寫基類方法。

1

Overriding取決於類的一個實例。 polymorphism是你可以繼承一個類,實現這些對象的對象對於在超類中定義的方法(和子類中的overridden)具有不同的行爲。 static方法不屬於類的實例,因此該概念不適用。

相關問題