2012-02-07 34 views
0

由於Super Class對象不能在主函數中實例化,abstract class在類名前面指定。但是,如果在SuperClass之前使用abstract關鍵字, -riding方法或不使用。有人可以解釋嗎?Super Class方法在超越方法之前的抽象關鍵字

這是下面的例子,請檢查註釋部分。

abstract class Figure 
{ 
    int dim1; 
    int dim2; 

    Figure() 
    { 
     dim1=-1; 
     dim2=-1; 
    } 

    Figure(int p,int q) 
    { 
     dim1=p; 
     dim2=q; 
    } 

    abstract void Area() //This line is working without abstract for me. 
    { 
     System.out.println("The area is undefined."); 
    } 
} 

class Rectangle extends Figure 
{ 
    int vol; 
    Rectangle() 
    { 
     super(); 
    } 

    Rectangle(int p,int q) 
    { 
     super(p,q); 
    } 

    void Area() 
    { 
     vol=dim1*dim2; 
     System.out.println("The area of the rectangle is: "+vol); 
    } 
} 

class Triangle extends Figure 
{ 
    int vol; 
    Triangle() 
    { 
     super(); 
    } 

    Triangle(int p,int q) 
    { 
     super(p,q); 
    } 

    void Area() 
    { 
     vol=dim1*dim2/2; 
     System.out.println("The area of the rectangle is: "+vol); 
    } 
} 


public class Area 
{ 
    public static void main(String[] args) 
    { 

     Rectangle r=new Rectangle(10,20); 
     Triangle t=new Triangle(6,10); 
     Figure fref; 

     fref=r; 
     r.Area(); 
     fref=t; 
     t.Area(); 

    } 

} 

回答

1
abstract void Area(); 

abstract意味着它在它的派生類的身體將被定義。

如果你嘗試爲它定義一個主體,它會是編譯器時間錯誤。

所以,作爲一個經驗法則:

抽象類可以有兩種方法:用身體和身體沒有。 body的方法不能以abstract關鍵字作爲前綴。然而,沒有body的方法必須以abstract關鍵字爲前綴。

2

隨着abstract改性劑,這是無效的代碼 - 你不能在聲明它的點指定的抽象方法的機構。它應該只是:

abstract void Area(); 

(這就是撇開違反命名約定等)

抽象方法的全部意義在於子類提供實際的實現,通常是因爲抽象類本身並不知道如何去做。如果你可以在抽象類中提供一個實現,可以考慮把它作爲一個普通的方法來代替,如果他們願意,它可以被子類覆蓋。

請注意,它是可能有抽象類沒有抽象方法,但它是相對不尋常的。

請參閱section 8.4.3.1 of the Java Language Specification"abstract" part of the Java tutorial瞭解更多信息。

+0

這個人問爲什麼要讓這個類抽象,當你已經至少使其一個方法抽象時。這是因爲你不能用抽象方法實例化一個類,因此不能用類級抽象實例化類。 – 2012-02-07 15:29:41

+0

@AndreiBodnarescu:如果你已經完全理解OP的問題,那你比我做得更好:) – 2012-02-07 15:32:39

0

標記一個方法抽象意味着該類定義了該方法,但沒有實現它。它強制具體的子類提供該方法的實現。

要麼你提供了一個實現,並且該方法可能不是抽象的,或者你不提供一個,並且該方法必須是抽象的(因此該類也必須是)。

閱讀Java tutorial

0

它與類型合同有關。

首先,你可以製作一個沒有抽象方法的抽象類。這個sais「這個clas不能被實例化,你必須擴展它然後實例化那個類(只要這個類不是抽象的)。

然後,你可以使一個方法抽象化。這是「我不會給這個方法的任何實現,我想強迫任何擴展這個類的人爲這個方法提供一個實現」。

現在,由於抽象方法在聲明它們的類中沒有實現,所以當你使一個方法抽象時,編譯器迫使你把它的類也抽象出來,因爲當你直接實例化那個類時沒有意義它至少有一個沒有實現的方法(抽象方法)。

0
  1. 一個類可以有抽象和非抽象方法

  2. 如果你在類中聲明,即使一個抽象方法,你必須讓你的抽象類。 (注意:抽象方法意味着只有方法聲明沒有任何正文。) 在你的情況下,你必須選擇以下兩個選項之一:a)聲明你的方法爲:abstract void area(); b)從你的方法和類中刪除抽象關鍵字)

  3. 如果一個類是抽象的,它必須被另一個抽象類或具體類擴展。 在你的情況下,你正在做的三角形和矩形的形式正在擴大圖。

  4. 所有抽象方法必須由繼承樹中的第一個具體類實現。具體的類意味着你可以實例化的類。因此,如果你的抽象類中有抽象方法(比如abstract void area();),那麼你必須在你的具體類(這裏是矩形和三角形)中實現它(提供主體)。

作爲一個經驗法則: 如果你的超類不是抽象的,那麼你必須要麼重寫它的方法在子類與否的選項。 但在抽象類的情況下,你必須在你的第一個具體類中重寫它,否則編譯器會給你一個錯誤。