接口和抽象类的区别

📅 发布时间:2026/8/22 12:05:08
接口和抽象类的区别 接口(Interface)和抽象类(Abstract Class)是支持抽象类定义的机制。接口至上而下定义规则抽象类至下而上注重抽取子类的通用特性。一、抽象类在Java中被abstract关键字修饰的类称为抽象类被abstract关键字修饰的方法称为抽象方法抽象方法只有方法的声明没有方法体。抽象类是用来捕捉子类的通用特性的 。它不能被实例化只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。抽象类的特点1、抽象类不能被实例化即不能使用new关键字来实例化对象只能被继承2、包含抽象方法的一定是抽象类但是抽象类不一定含有抽象方法3、抽象类中的抽象方法的修饰符只能为public或者protected默认为public4、抽象类中的抽象方法只有方法体没有具体实现5、如果一个子类实现了父类抽象类的所有抽象方法那么该子类可以不必是抽象类否则就是抽象类6、抽象类可以包含属性、方法、构造方法但是构造方法不能用于实例化主要用途是被子类调用。抽象类和普通类的主要有三点区别1、抽象方法必须为public或者protected因为如果为private则不能被子类继承子类便无法实现该方法缺省情况下默认为public。2、抽象类不能用来创建对象3、如果一个类继承于一个抽象类则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法则必须将子类也定义为为abstract类。在其他方面抽象类和普通的类并没有区别。二、接口Java中接口使用interface关键字修饰。接口是抽象方法的集合。若某个类实现了某个接口该类就必须就继承了这个接口的抽象方法。接口只是一种形式接口自身不能做任何事情。接口中可以含有变量和方法。接口中的变量会被隐式地指定为public static final变量用其他关键字都会报错接口中的方法会被隐式地指定为public abstract方法用其他关键字都会报错接口中所有的方法不能有具体的实现接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别接口是一种极度抽象的类型它比抽象类更加“抽象”并且一般情况下不在接口中定义变量。要让一个类遵循某组特地的接口需要使用implements关键字允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口就必须实现该接口中的所有方法。对于遵循某个接口的抽象类可以不实现该接口中的抽象方法。接口的特点为:1、接口可以包含变量、方法变量被隐士指定为public static final方法被隐士指定为public abstractJDK1.8之前2、接口支持多继承即一个接口可以extends多个接口间接的解决了Java中类的单继承问题3、一个类可以实现多个接口4、JDK1.8中对接口增加了新的特性4.1、默认方法default methodJDK 1.8允许给接口添加非抽象的方法实现但必须使用default关键字修饰定义了default的方法可以不被实现子类所实现但只能被实现子类的对象调用如果子类实现了多个接口并且这些接口包含一样的默认方法则子类必须重写默认方法4.2、静态方法static methodJDK 1.8中允许使用static关键字修饰一个方法并提供实现称为接口静态方法。接口静态方法只能通过接口调用接口名.静态方法名。5、Jdk 9 在接口中引入了私有方法和私有静态方法三、抽象类、接口相同点1、都不能被实例化但可以定义抽象类和接口类型的引用2、接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。四、抽象类、接口的区别1、语法层面上的区别参数抽象类接口定义定义抽象类的关键字是abstract class定义接口的关键字是interface子类实现继承抽象类的关键字是extends必须实现所有抽象方法实现接口的关键字是implements必须实现所有声明public abstract方法默认方法实现可以有默认方法实现jdk8前不可以jdk8后可以构造器可以有不可以有数度速度比接口快比抽象类慢需要在子类中去寻找实现main方法支持支持不支持添加新方法添加抽象方法子类必须实现抽象方法添加非抽象方法子类无须改掉添加方法子类必须实现该方法多继承抽象类可以继承一个类或实现多个接口接口只能实现多个接口2、设计层面上的区别抽象类是对一种事物的抽象即对类抽象而接口是对行为的抽象。抽象类是对整个类整体进行抽象包括属性、行为但是接口却是对类局部行为进行抽象。设计层面不同抽象类作为很多子类的父类它是一种模板式设计。而接口是一种行为规范它是一种辐射式设计。对于抽象类如果需要添加新的方法可以直接在抽象类中添加具体的实现子类可以不进行变更而对于接口则不行如果接口进行了变更则所有实现这个接口的类都必须进行相应的改动。举例说明若是把交通工具汽车自行车马车轮船飞机火车做一个抽象此时适用的就是抽象类可抽象出客运和货运两个抽象方法抽象类/** * author Evan Walker * version 1.0 * desc 昂焱数据 https://www.ayshuju.com/home * date 2023/03/16 16:07:51 */ public abstract class Transport{ /** * 客运方法 */ public abstract void passengerTransport(); /** * 货运方法 */ public abstract void freightTransport(); public Date getTransportTime(){ return new Date(); } }/** * author Evan Walker * version 1.0 * desc 昂焱数据 https://www.ayshuju.com/home * date 2023/03/16 16:07:51 */ public class Car extends Transport{ Override public void passengerTransport() { System.out.println(少量客人); } Override public void freightTransport() { System.out.println(少量货物); } } class Bus extends Transport{ Override public void passengerTransport() { System.out.println(大量客人); } Override public void freightTransport() { System.out.println(大量货物); } }若是把汽车比亚迪特斯拉小鹏蔚来做一个抽象此时适用的就是接口可抽象出颜色型号大小等抽象方法因为他们全部拥有电动汽车的本质更可以便捷的实现多态。/** * author Evan Walker * version 1.0 * desc 昂焱数据 https://www.ayshuju.com/home * date 2023/03/16 16:07:51 */ public interface ElectricAutomobile { public void size(); public void color(); } public class XiaoPeng implements ElectricAutomobile{ Override public void size() { System.out.println(昂焱科技); } Override public void color() { System.out.println(昂焱科技); } } public class Tesla implements ElectricAutomobile{ Override public void size() { System.out.println(昂焱科技); } Override public void color() { System.out.println(昂焱科技); } }五、抽象类、接口应用场景1、抽象类可以拥有一些方法并可以进行一些有默认实现2、如果你想实现多重继承那么你必须使用接口。由于Java不支持多继承子类不能够继承多个类但可以实现多个接口。因此你就可以使用接口来解决它。3、基本功能在不断改变就需要优先使用抽象类。4、基本功能在不改变就需要优先使用接口若基本功能不断改变那就需要改改接口的全部实现费时费力。5、实现java的多态特性必须使用接口总而言之接口是定义规则的而抽象类是抽取并实现公共功能。