抽象類是包含一個或多個抽象方法的類。抽象方法是一種聲明的方法,但不包含任何實現。抽象類可能不會被實例化,並且需要子類爲抽象方法提供實現。我們來看一個抽象類和抽象方法的例子。
假設我們通過創建一個以名爲Animal的基類開始的類層次結構來模擬動物的行爲。動物能夠做不同的事情,如飛行,挖掘和行走,但也有一些常見的操作,如進食和睡覺。一些常見的操作是由所有的動物執行的,但也以不同的方式進行。當以不同的方式執行操作時,它是抽象方法(迫使子類提供自定義實現)的理想選擇。讓我們來看看一個非常原始的動物基類,它定義了一種用於發出聲音的抽象方法(例如狗吠,牛mo或豬叮叮)。
public abstract class Animal
{
public void eat(Food food)
{
// do something with food....
}
public void sleep(int hours)
{
try
{
// 1000 milliseconds * 60 seconds * 60 minutes * hours
Thread.sleep (1000 * 60 * 60 * hours);
}
catch (InterruptedException ie) { /* ignore */ }
}
public abstract void makeNoise();
}
請注意,abstract關鍵字用於表示抽象方法和抽象類。現在,任何想要實例化的動物(如狗或牛)都必須實施makeNoise方法 - 否則無法創建該類的實例。讓我們看看擴展Animal類的Dog和Cow子類。
public Dog extends Animal
{
public void makeNoise() { System.out.println ("Bark! Bark!"); }
}
public Cow extends Animal
{
public void makeNoise() { System.out.println ("Moo! Moo!"); }
}
現在你可能會奇怪,爲什麼不聲明一個抽象類作爲接口,並有狗和牛實現的接口。當然你可以 - 但你也需要實施吃和睡的方法。通過使用抽象類,您可以繼承其他(非抽象)方法的實現。你不能用接口來實現 - 接口不能提供任何方法實現。
我會說你的例子更多地指出了一個接口的用法,而不是一個摘要。它是顯示接口用法的典型示例之一:可以繪製不同的形狀(正方形,圓形等)。 – PeterMmm 2011-05-15 07:33:58