抽象类和接口的区别?为什么要有

抽象类(abstract class):

使用abstract修饰符修饰的类。官方点的定义就是:如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类。

实际点来说,一个抽象类不能实例化,因为“没有包含足够多的信息来描述一个具体的对象”。但终归属于类,所以仍然拥有普通类一样的定义。依然可以在类的实体(直白点就是能在{}里面)定义成员变量,成员方法,构造方法等。

那么可能初学者会问:既然不能实例化,那么在类里面定义成员方法,成员变量有什么用。

抽象类在实际应用中,更多的是因为类中有抽象方法。抽象方法:只声明,不实现。具体的实现由继承它的子类来实现。实际点就是:被abstract修饰的方法,只有方法名没有方法实现,具体的实现要由子类实现。方法名后面直接跟一个分号,而不是花括号。例如:public abstract int A();

一个类中含有抽象方法(被abstract修饰),那么这个类必须被声明为抽象类(被abstract修饰)。

接口(interface):

官方定义:接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。

从定义上看,接口是个集合,并不是类。类描述了属性和方法,而接口只包含方法(未实现的方法)。接口和抽象类一样不能被实例化,因为不是类。但是接口可以被实现(使用 implements 关键字)。实现某个接口的类必须在类中实现该接口的全部方法。虽然接口内的方法都是抽象的(和抽象方法很像,没有实现)但是不需要abstract关键字。

接口中没有构造方式(因为接口不是类)

接口中的方法必须是抽象的(不能实现)

接口中除了static、final变量,不能有其他变量

接口支持多继承(一个类可以实现多个接口)

扫描二维码关注公众号,回复: 11927389 查看本文章

抽象类和接口的区别:

默认的方法实现 

抽象类可以有默认的方法实现完全是抽象的。接口根本不存在方法的实现。

抽象类中可以有已经实现了的方法,也可以有被abstract修饰的方法(抽象方法),因为存在抽象方法,所以该类必须是抽象类。但是接口要求只能包含抽象方法,抽象方法是指没有实现的方法。所以就不能像抽象类那么无赖了,接口就根本不能存在方法的实现。

实现 抽象类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。子类使用关键字implements来实现接口。它需要提供接口中所有声明的方法的实现。

抽象类虽然不能实例化来使用,但是可以被继承,让子类来具体实现父类的所有抽象方法。接口的实现,通过implements关键字。

抽象类可以有构造器,而接口不能有构造器

抽象方法可以有public、protected和default这些修饰符 ;接口方法默认修饰符是public。你不可以使用其它修饰符。

抽象类的目的就是被继承,抽象方法就是为了被重写,所以肯定不能用private修饰符,肯定是可以用public的。但是protected和default也是可以的。

接口就有且只有一个public修饰。

抽象类在java语言中所表示的是一种继承关系,一个子类只能存在一个父类,但是可以存在多个接口。

总的来说,因为java中抽象类只有单继承,接口就可以实现多继承。

抽象方法比接口速度要快

接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。

如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。 如果你往接口中添加方法,那么你必须改变实现该接口的类。

抽象类可以有一些非抽象方法的存在,这些方法被称为默认实现。如果添加一个默认实现方法(不能是抽象方法),就不需要在子类中去实现,所以继承这个抽象类的子类无须改动。

但是,接口中只能添加抽象方法,当你添加了抽象方法,实现该接口的类就必须实现这个新添加的方法。


 

接口和抽象类在程序设计上的作用是不一样的。

接口定义是为了在不同的 模块/组件 之间制定协议或契约。接口不关心内部的状态。接口通常是在 模块或组件有了外部的消费者 (或者有被外部使用的预期),而有意识或者无意识的提前定义好的。所以,很多时候我们会约定好这种契约(也就是接口),然后再去实现。

而抽象类在设计上的主要目标之一是复用。子类作为超类的子集,从而可以复用超类的某些逻辑,包括属性(或者说状态)和行为。例如,我们在写数据访问层的时候,可能会有一个抽象类里提供一些通用的业务数据读写的逻辑,这个抽象类可能会维护一些例如数据库连接之类的带有状态的东西,然后有一些子类来继承他,从而复用这些逻辑实现某些特定业务数据的访问——开发者不会也不能用接口来完成这种复用,而自然而然的选用抽象类。抽象类通常是在设计中(为了形象化,可以想象:程序设计者在画一个UML类图,在图中发现某些类之间存在共性,而为这些类抽象出一个超类)发现种抽象关系,甚至很多是在重构的过程中进化出来的。

所以,两者在程序设计的角度上有明晰的分工区别,目前来说还是无法相互替代的。这一点,在写代码的时候,我们不会在决策某处“到底是要使用接口,还是抽象类”这个问题上犹豫不决,甚至不假思索的就决定了 (如果有纠结,多半可能没有想清楚)。这就很能说明问题了。


 

猜你喜欢

转载自blog.csdn.net/wang_nian/article/details/108822003
今日推荐