抽象类: – 实时例子

最近在一次采访中我被问到一个非常笼统的问题“java中的抽象是什么”。我给出了定义,然后在摘要上引入了一些其他问题,如抽象方法和抽象方法与具体方法之间的区别等。最后,面试官要求给出一个实时的例子,当我应该使用或定义一个类作为抽象时。我感到困惑。我举了一些例子,但他不相信。

我用谷歌搜索,但没有找到真正的解决方案。

那么有人可以给我实时的例子,即当他在他/她的项目中将一个类定义为抽象时,为什么?

谢谢。

从这里发现的一个很好的实时例子: –

抽象类的具体示例是名为Animal的类。 你在现实生活中看到很多动物,但只有动物种类。 也就是说,你永远不会看到紫色和毛茸茸的东西,并说“这是一种动物,没有更具体的方法来定义它”。 相反,你会看到一只狗,一只猫或一只猪……所有的动物。 关键是,你永远不会看到一只动物走来走去,而不是更具体的东西(鸭子,猪等)。 Animal是抽象类,Duck / Pig / Cat都是派生自该基类的类。 动物可以提供称为“年龄”的function,为动物增加1年的生命。 它还可能提供一种名为“IsDead”的抽象方法,当被调用时,它将告诉您动物是否已经死亡。 由于IsDead是抽象的,每个动物都必须实现它。 因此,一只猫可能会在它达到14岁后决定它已经死亡,但鸭子可能会认为它在5岁之后死亡。 抽象类Animal为从它派生的所有类提供Age函数,但是每个类都必须自己实现IsDead。

一个商业例子 :

我有一个持久性引擎,可以对任何数据源(XML,ASCII(分隔和固定长度),各种JDBC源(Oracle,SQL,ODBC等))起作用我创建了一个基类,抽象类来提供这个的通用function持久化,但在持久化对象时实例化适当的“端口”(子类)。这使得新“端口”的开发变得更加容易,因为大多数工作都是在超类中完成的;特别是各种JDBC工作;因为我不仅做其他事情[比如表生成],我必须为每个数据库提供各种差异。)接口的最佳业务示例是集合。我可以使用java.util.List而不关心它是如何实现的;将List作为抽象类是没有意义的,因为anArrayList的工作方式与LinkedList相比存在根本区别。同样,Map和Set。如果我只是处理一组对象而不关心它是否是列表,地图或集合,我ca 你只需使用Collection界面。

在这里,关于抽象类的东西……

  1. 抽象类是一个不完整的类,所以我们无法实例化它。
  2. 如果方法是抽象的,则类必须是抽象的。
  3. 在抽象类中,我们使用抽象和具体方法。
  4. 定义类抽象和最终两者是非法的。

实时例子 –

如果你想制造一辆新车(WagonX),其中包括所有其他汽车的属性,如颜色,大小,引擎等,你想在你的车中添加一些其他function,如型号,baseEngine。然后只需创建一个摘要WagonX类,您使用所有预定义的function作为抽象,另一个function是具体的,由您定义。
扩展抽象类WagonX的另一个子类,默认情况下它还访问抽象类中实例化的抽象方法.SubClasses也通过创建子类的对象来访问具体方法。
为了代码的可重用性,开发人员主要使用抽象类。

abstract class WagonX { public abstract void model(); public abstract void color(); public static void baseEngine() { // your logic here } public static void size() { // logic here } } class Car extends WagonX { public void model() { // logic here } public void color() { // logic here } } 

您应该能够从JDK本身引用至少一个。 查看java.util.collections包。 有几个抽象类。 你应该完全理解Map界面,抽象和具体,以及为什么Joshua Bloch会这样写。

GenericServlet是抽象类的最佳示例。 GenericServletHttpServlet的父类。 这是一个抽象类。

在自定义servlet类中inheritance’GenericServlet’时,必须覆盖service()方法。

我经常使用抽象类与Template方法模式相结合 。
在主要的抽象类中,我编写了主要算法的框架,并将抽象方法作为钩子,其中蔗类可以进行特定的实现; 我经常在编写需要从一个不同的地方(文件,数据库或其他一些来源)读取数据的数据解析器(或处理器)时,经常使用类似的处理步骤(可能是小差异)和不同的输出。
这种模式看起来像策略模式,但是如果主代码增长太多或者需要太多主流exception(这些考虑来自我的经验),它会降低粒度并降低到难以控制的代码。
只是一个小例子:

 abstract class MainProcess { public static class Metrics { int skipped; int processed; int stored; int error; } private Metrics metrics; protected abstract Iterator readObjectsFromSource(); protected abstract boolean storeItem(Item item); protected Item processItem(Item item) { /* do something on item and return it to store, or null to skip */ return item; } public Metrics getMetrics() { return metrics; } /* Main method */ final public void process() { this.metrics = new Metrics(); Iterator items = readObjectsFromSource(); for(Item item : items) { metrics.processed++; item = processItem(item); if(null != item) { if(storeItem(item)) metrics.stored++; else metrics.error++; } else { metrics.skipped++; } } } } class ProcessFromDatabase extends MainProcess { ProcessFromDatabase(String query) { this.query = query; } protected Iterator readObjectsFromSource() { return sessionFactory.getCurrentSession().query(query).list(); } protected boolean storeItem(Item item) { return sessionFactory.getCurrentSession().saveOrUpdate(item); } } 

这是另一个例子。