前言:
什么是抽象类和接口?抽象类本质上是一个类,只是它创造出来就是用来被继承的,而接口它虽然不是类,但是可以将它看作比抽象类更抽象的一个东西。具体是什么,有什么作用,请看下面!
1.抽象类(abstract)
1.1 什么是抽象类
抽象类就是一个被abstract修饰的一个类,如果你创建一个抽象类,里面是一定要写抽象方法的(虽然不写不会报错,但此时就是相当于是一个“普通”的类并且这个抽象类还不能被实例化,只能由继承它的子类来进行实例化),有了抽象方法每当子类继承了该抽象类,都必须重写类中的抽象方法(就好比此时有一个抽象类Animal,这个动物是啥我们不知道(有很多不同的动物),且动物这个大类有一个通用的习惯,也就是吃饭(eat方法),通常我们不会去直接new Animal的对象(事实上Java里也不允许抽象类进行实例化),而是去new子类对象,所以抽象类的存在是为了帮助我们进行检验:是否进行抽象类的实例化,抽象方法是否被重写)。抽象类里面还可以像普通类一样拥有构造方法,成员方法,成员变量。
例如:
现有一个Animal类:(里面有一个抽象方法eat)
Dog类和Cat类:(继承于Animal类的)
它们里面都重写了eat方法。此时我们再new子类的对象时就可以来调用子类中独有的eat方法。
1.2 抽象类在使用过程中的注意事项
(1)抽象类不能进行实例化,它可以像普通类一样拥有成员变量和方法。
(2)继承抽象类的子类必须重写类中的所有抽象方法。
(3)abstract不能与final,static,private共存。
(4)如果一个类实现一个抽象类,但不想实现里面的抽象方法,就可以将此类变为抽象类。
2.接口(interface)
2.1 什么是接口
接口可以理解为是抽象类的进一步的抽象,它里面只能有抽象方法和成员常量(被public static final修饰的),不能有普通成员变量和方法(但是里面可以有protected和default修饰的方法)。
这个就是接口,那它有什么作用呢?
接口的出现帮助我们实现了多继承的一个效果,我们知道一个类只能继承一个类,不能继承多个类,但是可以实现多个接口,从而实现各种不同的功能。
比如现有3个接口,第一个接口是IEat接口(吃),第二个是IRun接口(跑),第三个是IFly接口(飞)。现在有三个动物:狗(假设是一只腿没了的狗),青蛙,鸟。我们可以分析得到狗只能够吃,青蛙能够吃和跑,而鸟能吃,跑,飞。每种动物拥有不同的功能,也就是每个动物实现了不同的接口。可以将上述eg用代码实现:
三个接口:
三个动物:
Dog:实现了eating功能:
frog:实现eating和running功能:
Bird:实现eating,running和flying功能:
2.2 使用接口时的注意事项
(1)接口和抽象类一样也不能实例化对象,也不能用实现它的类来实例化对象,可以用匿名内部类来实现实例化对象。
(2)接口里的抽象方法默认被会被public abstract修饰,所以一般不写修饰符。
(3)接口中的变量默认被public static final修饰,是一个静态成员常量。
(4)接口中的方法是不能有方法体的(抽象方法都不能有方法体)。
(5)接口中可以有protected和default修饰的方法,此方法可以有方法体。
(6)接口只能被public修饰,并且接口是默认被abstract修饰的。
(7)如果一个类不能实现接口当中的方法,但是又实现了该接口,就可以将该类变为抽象类。
(8)接口之间可以用extends实现扩展,eg:interface IA extends IB ,class Test implements IA,此时Test类不仅需要重写IA接口中的抽象方法,还需重写IB中的抽象方法!!!
2.3 接口的一些实现方法:
(1)直接用implements实现:
(2)用匿名内部类实现:
相当于一个类实现IRun接口并且重写了running方法。