2013-07-01 191 views

回答

41

在Java中,你可以在一個抽象類的靜態方法:

abstract class Foo { 
    static void bar() { } 
} 

這是允許的,因爲這種方法可以直接調用,即使你沒有抽象類的一個實例:

Foo.bar(); 

但是,出於同樣的原因,你不能聲明靜態方法是抽象的。通常情況下,編譯器可以保證抽象方法在調用任何時候都會有一個真正的實現,因爲你不能創建一個抽象類的實例。但是由於可以直接調用靜態方法,因此將其抽象化可以調用未定義的方法。

abstract class Foo { 
    abstract static void bar(); 
} 

// Calling a method with no body! 
Foo.bar(); 

在接口中,所有的方法都是implicitly abstract。這就是接口無法聲明靜態方法的原因。 (沒有任何體系結構的原因,爲什麼一個接口不能有一個靜態的方法,但我懷疑JLS的作者認爲這會鼓勵濫用接口)

+11

注意:從java 8開始,您可以在接口中聲明靜態方法和默認方法 – user2243357

17

如果你在談論java,答案是是的但是你需要定義靜態方法。你不能創建一個抽象的靜態方法。你可以創建的非抽象靜態方法是

原因是您不需要訪問靜態方法的對象實例,因此您需要使用某種功能來定義該方法。

所以你不能擁有,

abstract class AbstractClassExample{ 
    abstract static void method(); 


} 

但你可以有,

abstract class AbstractClassExample{ 

    static void method(){} 
} 

希望這有助於...

2

是的,當然你也可以定義抽象的靜態方法類。 您可以通過使用抽象類或使用擴展抽象類的子類調用該靜態方法。還可以通過子類實例/對象調用靜態方法。 說明下面的例子進一步測試。

//Parent class 
public abstract class TestAbstractClass { 
    static void testStaticMethod(){ 
     System.out.println("In Parent class static method"); 
    } 
} 

//child class 
public class ChildClass extends TestAbstractClass { 
    public static void main(String[] args) { 
     TestAbstractClass parentObj = new ChildClass(); 
     parentObj .testStaticMethod(); 
     ChildClass childObj = new ChildClass(); 
     childObj.testStaticMethod(); 
     TestAbstractClass.testStaticMethod(); 
     childClass.testStaticMethod(); 
    } 
} 
1

這裏有一個簡單的方法explanation.Abstract必須實現later.We知道靜態方法不能被重寫,因爲靜態方法不屬於任何特定實例,而它屬於類所不同的實施抽象方法是靜態的,在不同的類中是違反直覺的。

相關問題