2014-02-16 105 views
0

你可以在抽象類中聲明抽象變量類型嗎?當我把這行代碼放入時,我收到了一個錯誤。我可以聲明一個變量,它是final的,而不是final的,但我不確定我是否應該能夠聲明一個抽象的變量。界面和抽象類之間的真正優勢是什麼?一個變量可以在抽象的Java類中抽象出來嗎?

Error Code: 

     abstract int myScore = 100; <-- Causes an error 

代碼:

public abstract class GraphicObject { 
     int home = 100; 
     String myString = ""; 
     final int score = 0; 

     abstract void draw(); 
     abstract void meMethod1(); 
     abstract void meMethod2(); 

     int meMethod3() { 
      return 0; 
     } 
    } 
+4

「抽象」字段對您來說意味着什麼? 「抽象」方法對你意味着什麼? –

+0

你想要達到什麼? –

回答

2

爲什麼它應該是抽象的,如果你不能實現變量? 抽象方法僅意味着它們必須在代碼中進一步實現(通過擴展抽象類的類)。 對於變量,因爲它們保持相同類型,所以不會變成任何變量。 myscore將永遠是一個整數。

您可以通過擴展抽象類的類來對武術的思考超越myScore的價值。

2

抽象方法是沒有正文的方法。這是因爲它意味着在所有具體(非抽象)子類中被覆蓋,並且由於多態性,抽象存根永遠不會被調用。

鑑於上述情況,並且由於不存在多態性的字段(或一種覆蓋在所有字段),一個抽象字段就沒有意義。

如果你想要做的是有一個字段,它的默認值是每個子類中不同的,那麼你可以指定每個類的構造函數(S)的默認值。爲了做到這一點,您不需要將其抽象化。

+0

我注意到你可以創建一個抽象類的變量。 myAbstractClass myAbstract = null;這樣做的確切目的是什麼?我可以訪問變量和方法,但是我需要調用一個空方法,比如meMethod1()。 –

+0

您可以創建抽象類的*變量*,但不能創建對象!如果您嘗試從空引用調用任何方法,您將會收到'NullPointerException'。 –

+0

聲明一個抽象類的變量的目的是,你可以在其中存儲的子類的任何對象 - 只要子類不是抽象的,因此你有它的一個實際的對象。 –

1

你不能在Java中聲明一個抽象的變量。

如果你想在聲明一個超一流的,必須由它的子類來設置一個變量,你可以定義一個抽象的方法來設置這個值...

例如:

public abstract class Foo { 

    Object obj; 

    public Foo() { 
     init(); 
    } 

    protected void init() { 
     obj = getObjInitVal(); 
    } 

    abstract protected Object getObjInitVal(); 

} 


public class Bar extends Foo { 

    @Override 
    protected Object getObjInitVal() { 
     return new Object(); 
    } 

}