抽象类和接口

抽象类和接口的问题在网上可谓海量文章,资料颇丰。今天我也总结一下,主要是整理一下自己的思路,如果有人看到觉得有点帮助就更好了。

关于抽象类和接口的语法我就不多说了,首先来说说为什么要使用抽象类

我们用天一时代老师的例子,比如说银行的一个类,该类能根据本金和利率得到利息。我们可以写出这样一份代码:

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肯定需要一个发动机,这就是接口的作用:将要做的事情和怎么做分开


如果说一个比较大的项目,多个人来开发,把项目分成几个模块,那各个模块的人都做什么呢?这里,我们就需要用接口来分配各个模块需要做什么,至于怎么做,那就可以交给每个人去实现了,因为他们有了接口,已经知道了自己要做什么。所以,接口的作用主要是提供一个方向,一个纲领,其本身并不能完成任何实际的任务,但是它却可以指引我们,告诉我们需要做什么,避免盲目的开发。

原文地址:https://www.cnblogs.com/yuxiaoqi/p/2743074.html