今天讲讲java中的抽象类到底有什么作用?

之前听别人说java的抽象类完全就是鸡肋啊, 一点用都没有?

我要规范代码,直接写接口然后用一个类实现这个接口不就好了,抽象类在实际的开发中到底有没有什么独特的作用?

今天讲讲java中的抽象类到底有什么作用?_第1张图片

我以前也纠结过这个问题, 今天我就把我理解的为什么java要有抽象类这个东西;

这里从抽象类的作用抽象类与普通类以及接口之间的区别来解释.

一: 抽象类的作用

如果你看JDK的源码,就会发现,大部分情况下,你用到的方法,他的父类都是一个抽象类,而不是一个直接的接口。原因主要有两个,接口确实是用来定义规范的,同一个接口下,可能有大量不同的实现,举个例子,List这个接口

boolean add(E e);
boolean remove(Object o);
boolean addAll(Collection c);
......

但是你去看ArrayList,第一个继承的是AbstractList(抽象类),然后你去看LinkedList,第一个继承是AbstractSequentialList(抽象类),而AbstractSequentialList也是继承自AbstractList,你肯定知道ArrayList和LinkedList的区别咯。为什么这么做呢,因为有很多方法是可以复用的,比如

public int indexOf(Object o);
public int lastIndexOf(Object o);
......

如果你纯粹用接口的话,你需要写很多重复的代码,一旦修改,你就麻烦了。抽象类的目的在于,你可以更细致化的表明哪些是不同的,哪些是相同的。所以这就是接口和抽象类的简单区别。如果还不理解,你可以看看collection容器类的源码,就会发现了。(抽象类可以默认实现某些方法, 就不需要对一些方法重复实现相同的功能)

二: 抽象类与一般类的区别

抽象类与一般类的区别在于抽象方法

它的理念是对某个操作下一个定义,但交给子类去实现。

你可能会说,一般类也可以定义一个空方法,然后交给子类实现啊,但这么做因为没有在语法上强迫子类一定要实现这个方法,所以如果子类忘了去实现的话,软件出错的几率会很高。

三: 抽象类与接口的区别

当然,有时候 Java 接口不支持缺省方法,但有了缺省方法的接口,仍然不能代替抽象类,因为没有成员。

接口之所以不能有成员,是因为它只是对象行为的抽象。当你需要定义一个类型,既包含行为抽象,又包含成员来供子类使用时,显然只有抽象类可以满足了。

你可能感兴趣的:(Java干货,java)