java接口(interface)、抽象类(abstract class)、继承(extends)相关知识解析

来源:互联网 发布:网络类型是什么意思 编辑:程序博客网 时间:2024/05/16 09:22

 

一、什么是接口

1.接口内涵以及和抽象类的区别

(1) 接口的含义

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

(2) 比抽象类更加纯粹,更加抽象

abstractclass和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstractclass和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,其实,两者之间还是有很大的区别的。

 

以上区别详解:

①略②略③略

④从设计理念层面看abstract class和interfac

abstarctclass在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"isa"关系,即父类和子类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了接口定义的契约而已。其实abstract class表示的是"is a"关系,interface表示的是"likea"关系,大家在选择时可以作为一个依据,当然这是建立在对问题领域的理解上的。

⑤略⑥略

⑦Ⅰ.在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的。

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表示我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

正是因为抽象的概念在问题领域没有对应的具体概念,所以接口和抽象类都通过子类进行对象的实例化操作。

Ⅱ.面向对象领域,抽象类和接口进行类型隐藏。接口可以把“做什么”和“怎么做”分离开来。这给Java带来了很多好处。虽然代码量增加了,可我们的程序的可维护性加强了。我们的程序是可以拆分的。就象电脑一样,可以拆分成很多组件。

⑧从编程的角度来看,abstract class和interface都可以用来实现"design bycontract"的思想(核心思想是对软件系统中的元素之间相互合作以及“责任”与“义务”的比喻)。但是在具体的使用上面还是有一些区别的。

首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个接口。这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折衷考虑吧。

其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为,为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
   在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类的界面(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果界面是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。

同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。

二、为什么要有接口

1.要用来定义类型

2.用来对事物做高度的抽象

3.实现系统的可拔插性,保证系统遵循”开-闭”原则(也就是说,对扩展是开放的,而对修改是封闭的。)

4.一个接口不能继承抽象类,但可以继承多个接口

(1)在类的声明中,通过关键字extends来创建一个类的子类。一个类通过关键字implements声明自己使用一个或者多个接口。

extends 是继承某个类, 继承之后可以使用父类的方法, 也可以重写父类的方法; implements 是实现多个接口, 接口的方法一般为空的, 必须重写才能使用

(2)extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,JAVA中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了

举例:implements是向老师学习,我可以拜很多的人为师,从而我就有了这些人的本领,但我还是我,不过本事大了些;extends就是认爸爸。一个人就一个爸,同样我有了爸爸的本领,你可以替你爸去从军,但不能替别的老头子,我也不能再认别的爸了,但可以认老师,几个都没关系。

5.接口和C++中多重继承的区别

Java也提供继承机制﹐但还另外提供一个叫interface的概念。由于 Java的继承机制只能提供单一继承(就是只能继承一种父类别)﹐所以就以Java的interface来代替C++的多重继承。

对于Java的继承与接口﹐我们总结如下:

(1)Java的class只能继承一个父类别(用extends关键字)﹐但可以拥有(或称实作)许多interface(用implements关键字)。

(2)Java的interface可以继承许多别的interface(也是用extends关键字)﹐但不可以实作任何interface。

三、接口怎么用

1.接口的定义

Java语言规范对接口的定义

[public] interface SomeInterface {

编译时常量定义; //不推荐

抽象方法声明;

}

2.接口应用注意问题

Java中在接口的应用中,要注意一下几点:

(1)接口一般定义的是常量和一些抽象方法。

(2)接口(interface)只能定义抽象方法而且默认为是Public。常量是public static final 修饰的

(3)和继承一样,接口与实现类之间存在多态性。

(4)接口可以继承其他的接口,并添加新的属性和抽象方法。

(5)多个无关的类可以实现同一个接口,一个类可以实现多个无关的接口。