2010-06-29 46 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"); 
        } 
       }