有人可以给我看一下Java中抽象类的例子吗?具有真实世界应用程序(而不是教科书样本)的东西将是更可取的。
谢谢!
答案 0 :(得分:6)
在Abstract Methods and Classes上阅读本教程。
首先,您声明一个抽象类, GraphicObject,提供成员 完全变量和方法 所有子类共享,例如 当前的位置和举动 方法。 GraphicObject也声明了 方法的抽象方法,例如 绘制或调整大小,需要 由所有子类实现但必须 以不同的方式实施。该 GraphicObject类可以看起来像什么 像这样:
abstract class GraphicObject {
int x, y;
...
void moveTo(int newX, int newY) {
...
}
abstract void draw();
abstract void resize();
}
每个非抽象的子类 GraphicObject,例如Circle和 矩形,必须提供 实现用于绘制和 调整方法:
class Circle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
class Rectangle extends GraphicObject {
void draw() {
...
}
void resize() {
...
}
}
答案 1 :(得分:3)
对于一个真实的例子,为什么不看java.util.AbstractCollection
?
答案 2 :(得分:2)
对于抽象类的真实示例,让我们看一下AbstractTableModel
。 AbstractTableModel
提供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
为除三种方法(getRowCount
,getColumnCount
和getValueAt
)之外的所有方法提供了默认实现,迫使exteding类至少提供实现定义大小并向表提供数据。它还提供了对侦听器的良好默认处理,以及向这些侦听器触发事件的一系列便捷方法。
答案 3 :(得分:2)
在java编程语言中,abstract classes
是仅作为父类或基类使用的语言
派生子类以实现从抽象类(基类)继承的方法。抽象类不直接实例化。首先扩展基类,然后实例化(创建对象)。抽象类本质上是通用的,并且实现了具有通用实现的子类通常使用的那些方法。
e.g。
abstract class A {
public abstract abs_value();
void show()
{
System.out.println("This is an abstract class");
}
}
答案 4 :(得分:1)
我认为这是一个常见的现实世界的例子:
这可能会远离您的要求,但我们可以说我们正在使用像Hibernate这样的ORM框架(不需要真正担心它是什么或意味着什么,只知道我们基本上会插入/更新和从数据库中检索对象)。
对于我们要插入的每个表,我们将有一个唯一的数据库访问对象(DAO)来执行我们所需的数据库操作集,但重要的是要注意所有DAO将执行一些类似的任务,所以这是抽象类可以来救援的地方。我们可以声明一个AbstractBaseDao类,它概述了我们所有DAO可能需要的一些基本操作:
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可以执行任何特定任务,我们不会浪费任何时候重写我们已经写过的代码。代码重用的一个很好的例子。
我认为这是在行业中使用抽象类的一个非常常见的例子,所以我希望它有助于你所寻找的东西。