抽象类实现接口的意义(抽象类和接口)

网友投稿 243 2022-12-31


本篇文章给大家谈谈抽象类实现接口的意义,以及抽象类和接口对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享抽象类实现接口的意义的知识,其中也会对抽象类和接口进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

什么是抽象类和接口?

一、两者相同点

1、不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,接口变量必须指向实现所有接口方法的类对象。

2、抽象类里的抽象方法必须全部被子类所实现,子类不能全部实现父类抽象方法,那么该子类还只能是抽象类。一个类实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。

二、两者不同点 

1、默认的方法实现

抽象类可以有默认的方法实现;接口,Java8规定可以为接口提供默认实现的方法并且不用强。

2、实现

制子类来重写子类使用extends关键字来继承抽象类。如果子类不是抽象类的话,它需要重写抽象类中的抽象方法;接口子类使用关键字implements 来实现接口,它需要重写接口中没有默认。

3、构造器

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

4、与正常Java类的区别

除了不能实例化抽象类之外,和普通Java类没有任何区别;接口是完全不同的类型外。

5、访问修饰符

抽象方法可有public.protected和default、abstract修饰符。不能用privatestatic.synchronize、 native 修饰。

接口属性默认修饰符是publicstatic final (必须赋初值) ,方法默认修饰符是publicabstract. Java8 开始出现静态方法,多加static关键字。

6、main方法

并且可以运行它;接口没有main方法,因此不能运行它。

7、多继承

抽象类可以继承一个类和实现多个接口;接口只可以继承一个或多个接口。

抽象类的运用意义

在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。

这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可以操作一个抽象体。

由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。

为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。

java中为什么要用抽象类和接口

对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲:
一.抽象类
二.接口
三.抽象类和接口的区别
若有不正之处,请多多谅解并欢迎批评指正,不甚感激。
一.抽象类
在了解抽象类之前,先来了解一下抽象方法。抽象方法是一种特殊的方法:它只有声明,而没有具体的实现。抽象方法的声明格式为:
abstract void fun();
抽象方法必须用abstract关键字进行修饰。如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。
下面要注意一个问题:在《Java编程思想》一书中,将抽象类定义为“包含抽象方法的类”,但是后面发现如果一个类不包含抽象方法,只是用abstract修饰的话也是抽象类。也就是说抽象类不一定必须含有抽象方法。个人觉得这个属于钻牛角尖的问题吧,因为如果一个抽象类不包含任何抽象方法,为何还要设计为抽象类?所以暂且记住这个概念吧,不必去深究为什么。
[public] abstract class ClassName { abstract void fun();}
从这里可以看出,抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情。对于一个父类,如果它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类也就成为abstract类了。
包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:
1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
2)抽象类不能用来创建对象;
3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
在其他方面,抽象类和普通的类并没有区别。
二.接口
接口,英文称作interface,在软件工程中,接口泛指供别人调用的方法或者函数。从这里,我们可以体会到Java语言设计者的初衷,它是对行为的抽象。在Java中,定一个接口的形式如下:
[public] interface InterfaceName { }
接口中可以含有 变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误),而方法会被隐式地指定为public abstract方法且只能是public abstract方法(用其他关键字,比如private、protected、static、 final等修饰会报编译错误),并且接口中所有的方法不能有具体的实现,也就是说,接口中的方法必须都是抽象方法。从这里可以隐约看出接口和抽象类的区别,接口是一种极度抽象的类型,它比抽象类更加“抽象”,并且一般情况下不在接口中定义变量。
要让一个类遵循某组特地的接口需要使用implements关键字,具体格式如下:
class ClassName implements Interface1,Interface2,[....]{}
可以看出,允许一个类遵循多个特定的接口。如果一个非抽象类遵循了某个接口,就必须实现该接口中的所有方法。对于遵循某个接口的抽象类,可以不实现该接口中的抽象方法。
三.抽象类和接口的区别
1.语法层面上的区别
1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract 方法;
2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的;
3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
2.设计层面上的区别
1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。举个简单的例子,飞机和鸟是不同类的事物,但是它们都有一个共性,就是都会飞。那么在设计的时候,可以将飞机设计为一个类Airplane,将鸟设计为一个类Bird,但是不能将 飞行 这个特性也设计为类,因此它只是一个行为特性,并不是对一类事物的抽象描述。此时可以将 飞行 设计为一个接口Fly,包含方法fly( ),然后Airplane和Bird分别根据自己的需要实现Fly这个接口。然后至于有不同种类的飞机,比如战斗机、民用飞机等直接继承Airplane即可,对于鸟也是类似的,不同种类的鸟直接继承Bird类即可。从这里可以看出,继承是一个 “是不是”的关系,而 接口 实现则是 “有没有”的关系。如果一个类继承了某个抽象类,则子类必定是抽象类的种类,而接口实现则是有没有、具备不具备的关系,比如鸟是否能飞(或者是否具备飞行这个特点),能飞行则可以实现这个接口,不能飞行就不实现这个接口。
2)设计层面不同,抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。什么是模板式设计?最简单例子,大家都用过ppt里面的模板,如果用模板A设计了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它们的公共部分需要改动,则只需要改动模板A就可以了,不需要重新对ppt B和ppt C进行改动。而辐射式设计,比如某个电梯都装了某种报警器,一旦要更新报警器,就必须全部更新。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。
下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:
abstract class Door { public abstract void open(); public abstract void close();}
或者:
interface Door { public abstract void open(); public abstract void close();}
但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:
1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;
2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。
从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。
interface Alram { void alarm();} abstract class Door { void open(); void close();} class AlarmDoor extends Door implements Alarm { void oepn() { //.... } void close() { //.... } void alarm() { //.... }}

可以详细说一下抽象类和接口吗?简单易懂一些

普通类中只要含有一个纯虚函数,该类就是抽象类。

1、抽象类只能用作其他类的基类,不能建立抽象类对象,即不可实例化,它只是一种规范、约定、行为说明,子类继承抽象类后,子类对象的函数名参数格式被制约,但是子类函数内部可以实现特有的操作,也就是抽象类具有规范接口的意义,以实现不同子类的调用接口保持一致,但是各自的函数所执行的操作可以独立。

2、抽象类不能用作参数类型、函数返回类型或显式转换的类型,因为不可实例化,所以不占用内存,也不存在地址和指针,所以不可作为参数传递,只可作为派生类的代理。

3、可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。

纯虚函数即不带实现的虚函数定义,比如:

virtual int fun()=0;

这样的函数因为没有函数实体,因此子类有义务实现它,从而实现不同派生类之间的同名函数但不同功能的特性,使用抽象类指针访问不同的派生类对象的同名函数,实现动态多态。

father *p;
p =new child1();
p-fun();
delete p; 
p=new child2();
p-fun(); 
delete p;

上述是一个用父类指针多态调用不同子类同名函数的简单例子,以实现不同功能,具体开发时,主程序部分不需要修改,如果要增加一块功能,只需扩展一个派生类就可以实现软件升级,对于大型程序重新编译规划及其有利。

抽象类中的非纯虚函数和成员变量,可以通过派生类访问(当然是公共和保护修饰情况下),因此抽象类本身除了具有规定函数格式(接口的规范标准)外,还提供可被继承的成员变量和函数。

接口

当一个类中只包含纯虚函数时,它完完全全就是个接口。接口中不包含成员变量和其他非纯虚函数,也即类中只包含虚函数说明,而没有其他可供继承的函数和成员变量。

接口是抽象类的升级版,所以也不可实例化,接口的功能完全是为了规范类函数标准,接口可以通过指针导出传递其派生类的地址,其他程序可通过接口指针访问派生类对象,通过接口访问对象,主调者完全不用考虑被调者内部结构和实现逻辑,完全解耦(什么是解耦及其重要性自行百度),仅通过接口提供的函数定义访问派生类实体,完全多态。另外,比如在集团开发时,架构师定义接口,各部门按接口实现派生类工作。

简单的打个比方,接口就是对象之间或者程序之间交互信息的通讯接驳口,就如同电脑网口标准,网卡上网口内的每根导线的定义以及网线上RJ45头内的导线都是根据接口标准设计生产的,因此用户只要带着笔记本跑到任意有网口的地方连上网线就可以上网了,而不用考虑所连接的网络内部是什么厂家生产,这也是就是解耦的一个例子。

纯手打,不知道你能不能看懂^^

java 继承了抽象类为什么还要实现接口

抽象类和接口都是Java中用来实现多态的方法,在此主要说明为什么会用抽象类来实现接口,因此对两者之间的异同就不介绍了。
在java一般的用法中,如果要用普通类来实现接口,则必须实现该接口中的所有方法,这样就会导致需要实现多余的方法;
采用抽象类来实现方法,可以实现该接口中的部分方法,而且当其他类继承该抽象类时,只需要实现抽象类中未实现的方法即可。

接口和抽象类在面向对象编程中有什么作用

在OOD(面向对象设计)中抽象类实现接口的意义,经常会用到抽象类或接口,【注抽象类实现接口的意义:在C++中,没有接口的概念,只有抽象类抽象类实现接口的意义;而在Java中两者都存在】。而在使用过程中,也许会有不少人认为接口和抽象类差不多,然后就想当然地觉得可以相互完全替换。事实上,虽然他们有很多相似点,但也有很大差异。
1.抽象类与接口的出现条件
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领 域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念在问题 领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。模块可 以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的;同时,通过从这个抽象体派生,也可扩展此模块的行为功能。熟悉OCP的读 者一定知道,为了能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle),抽象类是其中的关键所在。
2.从语法定义层次上区分abstract class和interface
在语法层面,Java语言对于abstract class和interface给出了不同的定义方式,下面以定义一个名为Demo的抽象类为例来说明这种不同。使用abstract class的方式定义Demo抽象类的方式如下:
abstract class Demo_A { abstract void method1();
abstract void method2();

}
使用interface的方式定义Demo抽象类的方式如下:
interface Demo_I {
void method1();
void method2();

}
在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的、不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。从某种意义上说,interface是一种特殊 形式的abstract class。
从编程的角度来看,abstract class和interface都可以用来实现"design by contract"的思想。但是在具体的使用上面还是有一些区别的。
首先,abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java对于多重继承的支持方面的一种折中考虑吧。
其次,在abstract class的定义中,我们可以赋予方法的默认行为。但是在interface的定义中,方法却不能拥有默认行为。为了绕过这个限制,必须使用委托,但是这会增加一些复杂性,有时会造成很大的麻烦。
在抽象类中不能定义默认行为还存在另一个比较严重的问题,那就是可能会造成维护上的麻烦。因为如果后来想修改类(一般通过abstract class或者interface来表示)以适应新的情况(比如,添加新的方法或者给已用的方法中添加新的参数)时,就会非常的麻烦,可能要花费很多的时间(对于派生类很多的情况,尤为如此)。但是如果是通过abstract class来实现的,那么可能就只需要修改定义在abstract class中的默认行为就可以了。
同样,如果不能在抽象类中定义默认行为,就会导致同样的方法实现出现在该抽象类的每一个派生类中,违反了"one rule,one place"原则,造成代码重复,同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心。
3.从设计理念层次上区分abstract class和interface
上面主要从语法定义和编程的角度论述了abstract class和interface的区别,这些层面的区别是比较低层次的、非本质的。接下来将从abstract class和interface所反映出的设计理念,来分析一下二者的区别。从这个层面进行分析更能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约而已。为了使论述便于理解,下面将通过一个简单的实例进行说明。
考虑这样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Door具有执行两个动作open和close,此时我们可以通过abstract class或者interface来定义一个表示该抽象概念的类型,定义方式分别如下所示:
使用abstract class方式定义Door:
abstract class Door_A {
abstract void open();
abstract void close();
}
使用interface方式定义Door:
interface Door_I {
void open();
void close();
}
其他具体的Door类型可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看起来好像使用abstract class和interface没有大的区别。 关于抽象类实现接口的意义和抽象类和接口的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 抽象类实现接口的意义的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于抽象类和接口、抽象类实现接口的意义的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:局域网接口测试工具(网络接口测试工具)
下一篇:Mybatis中拦截器的简单实现方法
相关文章

 发表评论

暂时没有评论,来抢沙发吧~