Java中抽象类与接口,一篇就够啦

503 阅读6分钟

Java中抽象类与接口

Java中抽象类

抽象类的定义

定义:类的修饰符abstract class 类名
抽象类跟普通的类定义相比,就是在原来的基础上,加上一个abstract关键字。

Java语言中,用abstract 关键字来修饰一个类时,这个类叫作抽象类。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。抽象类可以看作是对类的进一步抽象。在面向对象领域,抽象类主要用来进行类型隐藏。(摘自百度百科)

为什么需要定义抽象类,而不是普通的类

如果一个类,我们通常不会实例化,而且含了一些公共的属性和方法,我们就可以把它定义成抽象的。比如说人,就可以定义为抽象类Person。

抽象类使用总结:

1、在Java中使用abstract关键字定义的类就是抽象类,采用abstract关键字定义的方法就是抽象方法。
2、抽象类是不能被实例化的,就像现实世界中的人,其实是抽象的,张三才是具体的人的一个实例。
3、抽象的方法只需在抽象类中,提供声明。抽象类中的抽象方法只有方法体,不需要在抽象类中进行实现。
4、如果一个类中含有抽象方法,那么这个类必须定义成抽象类,当然,抽象类中,可以没有抽象方法。
5、如果一个子类继承了抽象类,那么,抽象类中的所有的抽象方法必须被子类复写。如果在子类中不复写该抽象方法,那么必须将此方法声明为抽象方法。
6、抽象类不能被final修饰,因为抽象类就是用来被继承的,而final修饰后的类,不能被继承,两者有冲突。
7、抽象方法不能被final修饰,因为抽象方法就是用来被子类实现的,而final修饰的方法不能被覆盖,这和final有冲突。
8、在抽象类中,我们可以将一些公共的属性变量放到抽象类中,也可以包含一些公用方法的实现。当然啦,抽象类使用的重要意义在于:在抽象类中,我们可以定义一些抽象的方法,这样就会存在一个约束,而子类必须实现我们定义的方法,抽象类中的方法名称,子类又不能修改,这样就能很好的实现多态的机制,有了多态的机制,我们在运行期就可以动态的调用子类的方法。从而在运行期可以灵活的互换实现。

Java中接口
接口定义:
Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。(摘自百度百科)

这里的接口有两种含义:
1、Java接口,Java语言中存在的结构,有特定的语法和结构;
2、一个类所具有的方法的特征集合,是一种逻辑上的抽象。前者叫做“Java接口”,后者叫做“接口”。

接口使用总结:

1、在Java中,接口使用interface声明类。
2、接口可以看作是抽象类的一种特殊情况,在接口中只能定义抽象的方法和变量。
3、接口中的方法,只能由子类通过implements关键字来实现。
4、接口中的变量默认都是public static final类型的,不能更改,所以必须显示的初始化。
5、接口中的方法默认都是public abstract的,方法的定义格式不能更改。
6、接口不能被实例化,另外,接口中没有构造函数的概念。
7、接口之间可以继承,但接口之间不能实现。
8、如果一个类实现了接口,那么这个子类,必须实现接口中所有的方法。
9、接口相比较类而言,类只能单继承,而接口可以多实现。

接口和抽象类的区别
共同点:

a) 接口和抽象类都不能被实例化

b) 抽象类和接口都是用来抽象具体对象的,要面向接口(抽象)编程,而不要面向具体编程。虽然都进行了不同程度的抽象,但是接口的抽象级别最高。

不同点:

a) 抽象类要被子类继承,而接口是用来被子类实现的。

b) 接口只能做方法声明,不能有方法的实现(接口默认方法实现除外),抽象类中不仅可以作方法声明,也可以做方法实现。

c) 实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。接口一方面解决java的单继承问题,另一方面,实现了强大的可插拔性(多态机制)。

d) 抽象类可以有抽象方法、具体的方法和属性,而接口只能有抽象方法和不可变常量。接口里定义的变量只能是公共的静态的常量(public static final),抽象类中的变量是普通变量。

e) 接口是设计的结果,抽象类是重构的结果。抽象类主要用来抽象类别,强调的是所属关系,接口主要用来抽象功能,强调的是特定功能的实现。

使用总结

a) 抽象类的存在主要是可以把公共的代码移植到抽象类中。

b) 使用时,优先选择接口(因为继承抽象类后,此类将无法再继承,所以会丧失此类的灵活性)

接口与抽象类的异同点(面试用)
相同点
都可以定义抽象方法
都不能实例化对象
定义的抽象方法都需要被重写
都可以定义public static方法,public static final常量(接口中一般不这么用)
不同点
意义不同
抽象类是对事物更高层级的抽象
接口是对功能的封装
定义方式不同
抽象类用 abstract class定义
接口用interface定义
内容不同
抽象类中除了抽象方法外,还可以定义构造方法等普通类中定义的所有成员
接口不能定义构造方法
使用方式不同
抽象类需要被子类extends继承
接口需要被实现类implements实现
类只支持单继承,接口支持多实现
应用场景不同
一般情况下,对类进行功能的扩展,优先选择接口
除了扩展功能外,还需要保存不同的数据,只能选择抽象类。抽象类的抽象方法需要子类重写,抽象类还可以约束所有的子类都具有相同的功能。
注: 上文中接口不能有方法的实现,其实说的不是很严谨,在JDK1.8之后,在接口里面可以定义default方法,default方法里面是可以具备方法体的,当子类实现该接口之后,不需要重写该方法即可以调用该方法

public interface Test {

    /**
     * <p>
     * 
     * <p/>
     *
     * @param
     * @return void
     * @Date 2021/10/3 17:53
     */
    default void getCustomerInfo(){

    }

    void test();

}