2012-02-08 95 views
11

假設我有兩個類,A和B.A類被定義爲抽象類,而B擴展了這個抽象類,最後我測試了結果,兩個類都是同一個包的一部分。瞭解Java中抽象類的用途

public abstract class A { 

    protected abstract void method1(); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1() { 
     System.out.println("This is B's implementaiton of A's method"); 
    } 
} 

,現在當我測試他們:

B b = new B(); 
b.method1(); 
b.method2(); 

我得到預期輸出:

This is B's implementaiton of A's method 
This is Class A's method 

問題:

  • 什麼是@Override k的目的eyword,因爲如果我省略它, 仍然工作相同。
  • 如果我沒有實現抽象方法,我得到一個編譯錯誤。那麼與實現接口有什麼不同?
  • 此外,我也可以在B中實現method2()。然後輸出變成B中的用法。這是不是也覆蓋了父類的方法?那麼在A類中明確定義方法的目的是什麼?摘要
+2

有時是谷歌比要求或回答這裏更快:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino 2012-02-08 16:37:19

+5

谷歌被阻止在我們的學校 – 911TurboS 2012-02-08 16:42:12

+6

你的互聯網如何存在沒有沒有谷歌? – jondavidjohn 2012-02-08 16:50:13

回答

13

@Override

@覆蓋在Java 5引入(和Java 6中延伸一點點)。它只是提供信息。它說:「我想覆蓋父類或接口中已經存在的東西。

IDE就像Eclipse一樣,可以在沒有這樣的父級方法的情況下警告你(例如,如果你拼錯了名字)。方法將不會被調用(因爲拼寫錯誤的)。

不過不要擔心太多。

抽象類VS接口

一個抽象類允許你定義留下基本功能未定義的部分。接口不允許你o執行任何事情。除了每種情況下真正改變的部分外,您可以編程所有內容。所以當你需要它的時候,你會繼承和實現缺失的部分。

覆蓋兩種方法

是。在Java中,您可以覆蓋父類中未聲明爲final的所有方法。沒關係。如果你想讓它不可修改,你可以聲明它是最終的。舉例,如果你想聲明的順序你可以:

public abstract class Ordering<X> 
{ 
abstract boolean isLower(X a, X b); 
abstract boolean isEquals(X a, X b); 
    final boolean isGreater(X a, X b) { 
     return !isLower(a, b) && !isEquals(a, b); 
    } 
} 

當然也可能有意識重寫isGreater來實現它另一個更有效的方式(想象中那麼的昂貴的比較)。但有些情況下,當你想提供基本的已經實現的功能(然後是抽象類比接口更好的時候),或者當你想強制執行某些實現時(那麼當final關鍵字顯示有用時)。

+1

感謝您抽出寶貴時間來解釋這個想法 – 911TurboS 2012-02-08 16:51:31

+2

非常感謝!無論如何,通過查看示例,您將習慣於抽象/接口等。 Spring框架就是一個很好的例子。事實上,如果您瞭解設計模式:抽象類與模板方法非常接近,而接口涉及(在許多其他事物中)策略模式。模板通過繼承進行擴展,而策略通過組合進行擴展。再次說明:具有所有模板和組件的Spring框架就是一個很好的例子。你會發現與時間。 – helios 2012-02-08 16:56:14

4

抽象類允許你存儲基礎水平實現(繼承),同時還生產,保證繼承的類將執行自己的特定功能(接口)合同......

雖然永遠不會有抽象類的實例,你可以存儲繼承人之間共享的功能...

我一直認爲他們作爲接口,允許一定的方法基地級實現...

+1

抽象類爲+1「某些方法的基本級別實現的接口」 – helios 2012-02-08 16:44:36

+1

您的答案是讓我清楚地瞭解其差異的原因。 – 911TurboS 2012-02-08 16:47:11

17
  1. @Override不是一個關鍵字,它是一個可選的註釋,它可以幫助編譯器檢查是否確實重寫了一個方法。如果你說@Override但沒有方法來覆蓋,編譯器會告訴你,你可能犯了一個錯字。將method1重命名爲method12以查看效果。
  2. 接口不能有任何實現,而抽象類可以選擇性地爲其某些方法提供實現。另外,接口不能有數據成員。
  3. 將方法定義爲抽象意味着派生類必須提供實現。不宣佈它抽象說派生類可以提供自己的實現,但他們不需要。
+0

感謝您的回答 – 911TurboS 2012-02-08 16:42:32

+0

@ 911TurboS如果答案正確(箭頭向下符號下方的按鈕),您應該將答案標記爲已回答。 – Rohan 2012-02-08 16:45:46

+0

是的,但它不允許我說,它說等待2分鐘 – 911TurboS 2012-02-08 16:53:28

0

的實際使用進入畫面,當你有多個類實現和方法1被從方法2調用。在這種情況下,在執行method2之後,相應類中的method1將被執行。

public abstract class A { 

    protected abstract void method1(int val); 

    protected void method2() { 
     System.out.println("This is Class A's method"); 
     //Let us I calculated something here, may be sum of two ints 
     method1(//pass above calculated int); 
    } 
} 

public class B extends A { 

    @Override 
    protected void method1(int val) { 
     System.out.println("This is B's implementaiton of A's method"); 
     //Here you may do this class specific manipulation on val. 
    } 
} 

像在C類,你可以計算出一些常用操作。

2

抽象類和接口之間的主要區別是,接口只定義一個接口和抽象類也可以具有執行和字段/屬性。

抽象類可以被看作是IS-A關係(例如,馬是動物)。對於接口來說,它主要是一個類可以具有的某些功能(例如INavigable,ISortable)。

另外抽象方法不能實例化(無論是接口)。

重寫函數用於顯示函數具有基類實現。

同時多重繼承不可能/建議與類,因此最大。僅使用一個基類並從其他功能的接口繼承。

+0

謝謝這是非常有益的。 – 911TurboS 2012-02-08 16:45:01

1

什麼是@覆蓋關鍵字的目的,因爲如果我忽略它,它仍然 的工作原理相同。

可讀性。

如果我沒有實現抽象方法,我得到編譯錯誤。那麼與實現接口有什麼不同呢 ?

接口不允許您包含的代碼。

另外,我也可以在B中實現method2()。然後輸出更改爲 什麼是在B中使用。是不是這也覆蓋父類 方法。那麼明確定義類A中抽象方法 的目的是什麼?

是的,它是重寫父類的方法。您通常將方法定義爲抽象方法,以便爲孩子保留實現(必須實現它或抽象)。如果它不是抽象的,你必須實現它。

+0

完全符合我要求的答案:) – 911TurboS 2012-02-08 16:52:26

+1

接口確實允許您包含「代碼」,它們是客戶端如何與實現該接口的對象進行交互(接口)的聲明。它們可以用作參考類型,實體通過從任何抽象或具體實現中封裝客戶端來促進多態。變量可以在接口中聲明,但默認情況下(和定義)是靜態的,因爲永遠不會有接口的實例。您使用抽象方法來執行具體實現,這些實現或者是未知的,或者可能會在子實現之間發生變化 – 2012-02-08 16:54:40

+0

您是對的。我只是想恢復;) – m0skit0 2012-02-08 16:59:00

1

What is the purpose of @Override keyword

這是後來的Java此外,這是弱自我控制。它是註釋,即庫類,而不是關鍵字。

So what is the difference to implementing an interface?

小。 Iterface是一個所有方法都是抽象的類。而且,只允許一個父類,而它可以是多個接口。你也可以把成員放入課堂,但不能進入界面。

Then what is the purpose of explicitly Defining a method abstract in Class A?

你應該把它聲明摘要僅供如果它有沒有身體。 JVM需要知道所有後代都擁有它。

+0

感謝您的回答 – 911TurboS 2012-02-08 16:51:19