2010-06-29 65 views
3

有人可以給我看一個Java的抽象類的例子嗎?與真實世界的應用程序(而不是文本書樣本)的東西將是可取的。什麼是抽象類的目的/用途? (尋找真實世界的例子。)

謝謝!

+0

你是什麼意思的「實時示例」? – akf 2010-06-29 03:55:55

+0

@akf,我認爲他的意思是真實的世界。 – 2010-06-29 03:58:40

+0

@Mike Sherov:哈!我做了編輯,當我回來時,你的評論就在那裏。我同意你的解釋,並做了相應的編輯。不過,可能還是個騙局。 :) – 2010-06-29 04:00:58

回答

6

閱讀Abstract Methods and Classes上的本教程。

首先,聲明一個抽象類, GraphicObject,以提供構件 變量和是完全 通過所有的子類,如 當前位置和對moveTo 方法共享方法。 GraphicObject還聲明 抽象方法的方法,如 平局或調整,即必須 所有子類實現,但必須在 不同的方式實現。該 GraphicObject類可以看起來 這樣的:

abstract class GraphicObject { 
    int x, y; 
    ... 
    void moveTo(int newX, int newY) { 
     ... 
    } 
    abstract void draw(); 
    abstract void resize(); 
} 

每個非抽象子 GraphicObject,如圓和 矩形,必須提供 實現的平局和 調整大小方法:

class Circle extends GraphicObject { 
    void draw() { 
     ... 
    } 
    void resize() { 
     ... 
    } 
} 
class Rectangle extends GraphicObject { 
    void draw() { 
     ... 
    } 
    void resize() { 
     ... 
    } 
} 
+0

爲了在這個上構建一點,抽象類的一個方法(我們在這裏考慮'moveTo'),即使抽象類沒有代碼,也可以調用draw或resize。然後擴展類以他們自己的方式實現它們,但是'moveTo'方法對它們都是一樣的。通過這種方式,您可以將常用代碼保留在抽象類中,但仍然可以通過移動抽象方法中的部分行爲來讓它在不同的擴展類中表現不同,即孩子選擇如何實現。 – 2010-06-29 08:16:34

3

對於現實世界的例子,爲什麼不看java.util.AbstractCollection

2

對於一個抽象類的真實世界的例子,讓我們看看AbstractTableModelAbstractTableModel提供了一個TableModel接口的實現(用於JTable)。 TableModel定義了以下方法:

public boolean isCellEditable(int rowIndex, int columnIndex); 
public Class<?> getColumnClass(int columnIndex); 
public int getColumnCount(); 
public int getRowCount(); 
public Object getValueAt(int rowIndex, int columnIndex); 
public String getColumnName(int columnIndex); 
public void addTableModelListener(TableModelListener l); 
public void removeTableModelListener(TableModelListener l); 
public void setValueAt(Object aValue, int rowIndex, int columnIndex); 

AbstractTableModel提供了用於所有,但這三種方法(getRowCountgetColumnCount,和getValueAt)的默認實現,迫使exteding類至少提供的實施來定義大小和提供數據到表格。它還提供了一個很好的偵聽器默認處理方式,以及一系列便捷方法來將事件觸發給這些偵聽器。

+0

這是一個很好的。 – 2010-06-29 11:16:08

1

我覺得這個作爲一個共同的現實世界的例子:

這可能是一個有點遠離你的要求是什麼,但可以說,我們正在使用像Hibernate的ORM框架(無需真正擔心掉什麼那就是或者它的意思,只知道我們基本上將要插入/更新和從數據庫中檢索對象)。我們將要有一個唯一的數據庫訪問對象(DAO)來執行我們期望的數據庫操作,但是需要注意的是,所有的DAO都會執行一些類似的任務這是抽象類可以幫助我們解決的地方。我們可以聲明,概述我們可能需要我們所有的DAO的一些基本操作的AbstractBaseDao類:

public class AbstractBaseDao { 
    public void saveOrUpdate(Object o){ 
     //save or update object from database 
    } 

    public void loadAll(Class clazz){ 
     //Load all from database 
    } 

    public Object loadById(Class clazz, Long id){ 
     // Retrieve object by Id from database 
    } 

    // Additional common methods 
} 

所以再次它不是非常重要的方法是如何在這個例子中實現的,只要知道所有的DAO需要那些方法和抽象類使我們可以在類之間重用代碼。

現在我們BaseDao我們可以自由地爲每個表的具體和特定的DAO,至今仍是我們所期望的共同的功能:

public class PersonDao extends AbstractBaseDao{ 
    public List<People> listAllPersonsByLastName(String lastName){ 
     //Load people by last names from database 
    } 

    public List<People> listAllPersonsByBirthYear(Date date){ 
     //List people by birth year from database 
    } 
} 

現在PersonDao的可以執行任何特定的任務,我們不要浪費任何時間重寫我們已經編寫的代碼。代碼重用的一個很好的例子。

我認爲這是一個在行業中使用抽象類的非常常見的例子,所以我希望它能幫助您找到所需的東西。

+1

很好的例子,如果你使用泛型,效果會更好。 'public class AbstractBaseDao { [012,[...] public T loadById(Class clazz,Long id){[...]' – 2011-01-25 16:13:03

+0

我不理解你的例子 - 你的「AbstractBaseDao」不是抽象類。這與這個問題有什麼關係? 如果這只是一個錯字,它應該是一個抽象類 - 如果AbstractBaseDao中的所有方法都是具體的,爲什麼要使該類抽象? – SteveT 2012-07-16 21:02:10

2

在java編程語言中,abstract classes是那些僅用作父類或基類的。
派生子類以實現從抽象類(基類)繼承的方法。抽象類不直接實例化。首先擴展基類,然後實例化(創建對象)。抽象類本質上是通用的,並且實現了那些通常由具有通用實現的子類使用的方法。

例如

abstract class A { 
     public abstract abs_value(); 

     void show() 
        { 
        System.out.println("This is an abstract class"); 
        } 
       }