接口和抽象类的区别?

接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。

接口是公开的,不能有私有的方法或变量,接口中的所有方法都没有方法体,通过关键字interface实现。

抽象类是可以有私有方法或私有变量的,通过把类或者类中的方法声明为abstract来表示一个类是抽象类,被声明为抽象的方法不能包含方法体。子类实现方法必须含有相同的或者更低的访问级别(public->protected->private)。抽象类的子类为父类中所有抽象方法的具体实现,否则也是抽象类。

接口可以被看作是抽象类的变体,接口中所有的方法都是抽象的,可以通过接口来间接的实现多重继承。接口中的成员变量都是static final类型,由于抽象类可以包含部分方法的实现,所以,在一些场合下抽象类比接口更有优势。

相同点:

(1)都不能被实例化
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。

不同点:

(1)接口只有定义,不能有方法的实现,java 1.8中可以定义default方法体,而抽象类可以有定义与实现,方法可在抽象类中实现。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口强调特定功能的实现,而抽象类强调所属关系。
(4)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。


接口和抽象类有什么区别?各在什么场景下使用?

1、语法方面

(1)接口可以多实现,抽象类只能单继承。

(2)接口里的成员变量,不能更改的,因为修饰符是:public static final;方法默认public abstract修饰的

2、思想上:

(1)接口强调功能实现,abstract class强调所属关系。

(2)接口中是全局的静态的常量,所以接口用于定义标准、行为规范等;是对事务的属性和行为的更高层次的抽象。

(3)接口是为了统一管理,没有继承关系的各种类的对象,但是它们存在相同的行为方法。我们把这些行为方法抽象到接口中。

(4)接口是对修改关闭,对扩展开放的,是开闭原则的一种体现。

(5)有时功能需要接口隔离。

1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。 2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。 3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。 4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。 5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。 6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。 7.接口中的方法默认都是 public,abstract 类型的。

什么时候用接口?什么时候用抽象类?
接口相对于抽象类和实体类的好处.
实现多继承.

对于一种需求,发电机,然后分别有光能和风能发电机,最后又出来风能光能混合发电机.

如果使用抽象类,则因为JAVA不支持多继承而使,(风能光能混合发电机 instance 风能发电机)失效.而如果使用接口则没有此问题.

抽象类相对于接口的好处
抽象类中可以包含一些实现,即一些非abstract方法,而接口中所有的方法都是抽象的.所以抽象类可以将子类中共同的逻辑向上提,在抽象类中实现,在一定程度上实现代码的复用.

抽象类和接口相对于实体类的好处.
通过方法的覆盖来实现多态,也就是运行期绑定.

总结
接口是用来定义行为的,抽象类是用来实现行为的,实体类是用来执行行为的.

抽象类和接口的区别在于使用动机,使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。

1.使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。

2.当2个或多个类中有重复部分的时候,我们可以抽象出来一个基类,如果希望这个基类不能被实例化,就可以把这个基类设计成抽象类。

3.当仅仅描述一组方法或规则时使用接口

Last modification:July 22nd, 2020 at 08:42 am
如果觉得我的文章对你有用,请随意赞赏