抽象类和接口
抽象类和接口的问题在网上可谓海量文章,资料颇丰。今天我也总结一下,主要是整理一下自己的思路,如果有人看到觉得有点帮助就更好了。
关于抽象类和接口的语法我就不多说了,首先来说说为什么要使用抽象类。
我们用天一时代老师的例子,比如说银行的一个类,该类能根据本金和利率得到利息。我们可以写出这样一份代码:
public class LoanAccount { private double fund; // 本金 public double calculateInterest() // 计算利息 { // 利息=本金*利率 return fund * getInterestRate(); } public double getInterestRate() { return 0.2; } }
很明显,每家银行都需要这样来计算利息,也就是说会有很多类需要这个类中的方法,因此,为了复用这个类的代码,这个类可能被其他的银行来继承。这时,问题出现了,每家银行的利率不一样,那这个父类的利率到底要返回多少呢,我们不可能知道具体的数字,只能靠子类去完成这项任务,这时候这个方法就不能具体的去实现了,所以有了抽象方法。
public abstract class LoanAccount { private double fund; // 本金 public double calculateInterest() // 计算利息 { // 利息=本金*利率 return fund * getInterestRate(); } public abstract double getInterestRate(); }
这样,无论哪个银行要继承这个类,只要在getInterestRate中返回自己的利率就可以了。
那我们现在是否知道了为什么要使用抽象类?
答案就是:因为在定义我们要做什么的时候,我已经能够发现所有的子类都要做相同的事情(计算利息),没有必要把这种情况留给子类去处理了,这时我们把这些方法在父类中实现,子类实现之后就可以直接使用。但是还有一些方法,是只有子类才能够实现的(每个银行具体的利率),这时候,我们把方法抽象,留给子类去实现。
其实就是一句话:我们当前不知道如何去实现这个方法,即方法在当前不具备实现的条件!
另外,当一个类含有抽象方法,那这个类就是一个不完整的类,这样的类当然不能够执行具体的任务,即抽象类不能生成对象,所以含有抽象方法的类必须是抽象类,以免它生成对象。
现在,我们来考虑另外一种情况,如果说在一个类中,所有的方法我都不知道如何去实现,每个方法都不具备实现的条件,那怎么办。按照上面我们对抽象类的理解,当方法在当前不具备实现的条件的时候,我们应该把该方法定义成抽象方法,这样这个类中的所有方法都该定义成抽象方法,这时候,这个纯抽象类就有了一个更好听的名字,叫做接口。那么,既然这个类中每个方法我们都不知道该怎么去实现,那为什么我们还要写呢?重点就在这,我们虽然不知道这些方法怎么去具体的实现,但是我们知道这个类肯定会用到这个方法,比如一个Car类,虽然我们不知道Car具体用的什么发动机,不知道这个发动机里边是什么样,但是我们确定的是Car肯定需要一个发动机,这就是接口的作用:将要做的事情和怎么做分开!
如果说一个比较大的项目,多个人来开发,把项目分成几个模块,那各个模块的人都做什么呢?这里,我们就需要用接口来分配各个模块需要做什么,至于怎么做,那就可以交给每个人去实现了,因为他们有了接口,已经知道了自己要做什么。所以,接口的作用主要是提供一个方向,一个纲领,其本身并不能完成任何实际的任务,但是它却可以指引我们,告诉我们需要做什么,避免盲目的开发。