黑马程序员技术交流社区
标题:
java接口与抽象类
[打印本页]
作者:
尚新泽
时间:
2015-8-16 22:40
标题:
java接口与抽象类
谁能详细说一下接口与抽象类的区别呢? 什么时候用接口,什么时候用抽象类.请详细说明不要太官方了.来个通俗易懂的.
作者:
sunsteam
时间:
2015-8-16 22:40
本帖最后由 sunsteam 于 2015-8-17 11:03 编辑
简单来说 抽象类是从子类中抽取了基本共性, 包括了所有子类都必须具有的基本功能,
接口提供了额外的扩展功能 不是所有子类都必须具有 但如果部分子类需要有,那么可以通过 implements接口来实现 下面不是代码 只是简单举个例子
abstract class Employee
//员工都有必须工作的基本功能
--abstract void work();
interface Smoking
--void smoke();
interface Chating
--void chating();
工人,经理,文员都具有工作的基本功能, 但他们具有一些额外的扩展功能. 如工人和经理都抽烟,但文员不抽烟. 文员和经理都爱聊天, 而工人不喜欢高谈阔论 那么就通过分别实现不同接口来达成. 这就是单继承多实现
class Worker extends Employee implements Smoking
-- void work(){工人的工作}
-- public void smoke(){抽利群牌烟}
class Manger extends Employee implements Smoking, Chating
-- void work(){经理的工作}
-- public void smoke(){抽中华牌烟}
-- public void chating(){聊工作内容}
class Clerk extends Employee implements Chating
-- void work{文员的工作}
-- public void chating(){聊八卦}
作者:
尚新泽
时间:
2015-8-16 22:41
怎么都没人回答/////
作者:
code_linux
时间:
2015-8-17 00:39
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,
另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。
还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识【里面没有任何方法,比如Remote接口】和数据共享【里面的变量全是常量】的作用.
作者:
永远的EOF
时间:
2015-8-17 00:47
接口里面是抽象的,类是具体的。
作者:
肖天长
时间:
2015-8-17 09:48
抽象类与接口紧密相关,它们不能实例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。
在实现抽象类时,必须实现该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值。
抽象类不能被实例化,也就是不能用new关键字去产生对象
抽象方法只需声明,而不需实现
抽象类的子类必须覆盖所有的抽象方法后才能被实例化,否则这个子类还是个抽象类.
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。必须重写所有方法
抽象类只能单继承,接口能多实现
作者:
chajinglong
时间:
2015-8-17 17:37
简单的来说,接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的。
作者:
0803宝
时间:
2015-8-17 21:41
接口的所有属性和行为都是抽象的,没有构造方法。
抽象类,可以有成员变量,成员常量;有构造方法;有成员方法,抽象的和非抽象的。
作者:
樱花飘过
时间:
2015-8-17 22:59
接口就像电脑的usb端口,可以用来扩展功能,比如插个鼠标,也就可以实现鼠标功能,插个音响就能放音乐的功能
抽象类是描述不清的就像水果,动物,比较宽泛,如果别人管你要个水果,你并不知道是什么,所以抽象类不能创建对象,但是你知道他的子类比如苹果,所以可以利用多态创建子类对象
三个方面有区别,
1,成员变量:接口都是常量,抽象类有常量也有变量,
2构造方法,接口没有,抽象类有
3成员方法,接口全是抽象的,抽象类成员方法可以是抽象的也可以不是抽象的
接口使用:比如一个我只需要一个类增加功能,那么就可以实现这个接口,可以多实现,就像可以多扩展点功能,有点像干爹,你可以不像你的干爹,其实你可以像你干爹学到东西,各种功能,也可以有很多干爹
抽象类:有子类is a父类的关系,其实就是无法创建对象,很多东西描述不清,好比,我的父亲小时候就不再身边,记不清了,但是我还是很像我的父亲,我有一些天赋,我也只能有一个亲父亲
作者:
费世福
时间:
2015-8-17 23:00
接口是功能的扩展,比如说,猫狗,人(没有父子类的关系)都是可以跳这个动作的,这个时候就可以用接口,接口中都是抽象方法。
抽象类的抽象方法是被子类继承的,也可以说是子类的共性提取方法
作者:
信@仰
时间:
2015-8-18 16:13
抽象类的成员可以具有访问级别,而接口的成员全部public级别 抽象类可以包含字段,而接口不可以, 抽象类可以继承接口,而接口不能继承抽象类 抽象类的成员可以具有具体实现,而接口不行 抽象的子类可以选择性实现其基类的抽象方法,而接口的子类必须实现
作者:
不忘初心、
时间:
2015-8-19 00:46
接口就是方法都是抽象的,这个时候用。如果是抽象类,方法不都是抽象的。
作者:
l_15562009298
时间:
2015-8-19 10:54
接口:like a
抽象类:is a
向框架方面理解理解
作者:
l_15562009298
时间:
2015-8-19 11:00
抽象类是创建的“内”引用,接口是”外“引用
作者:
说不出再见
时间:
2015-8-19 22:19
接口的所有属性和行为都是抽象的,没有构造方法。
抽象类,可以有成员变量,成员常量;有构造方法;有成员方法,抽象的和非抽象的
作者:
zouyinhui_888
时间:
2015-8-19 22:35
唯一的区别在于,接口必须要之类复写,而抽象类不一定需要子类复写,抽象类几乎用不着,接口在方法回调时候用到比较多。我是42期学员,已经工作8个太月
作者:
jaunce
时间:
2015-8-22 00:42
接口的使用与抽象类类似,不能直接使用,需要创建子类对象,然后通过子类对象调用成员方法和成员变量。比抽象更抽象
作者:
zhangcheng0403
时间:
2015-8-22 16:57
他们都说的挺好的,我简单概括一下吧:
java的数据类型有八种基本类型和三大引用类型,其实中数组,类,和借口就是这三种引用类型。
那么抽象类和接口有哪些异同:
1、接口中所有的方法隐含的都是抽象的,而抽象类则可以同时包含抽象和非抽象的方法。
2、类可以实现很多个接口,但是只能继承一个抽象类。
3、类如果要实现一个接口,它必须要实现接口声明的所有方法。但是,类可以不实现抽象类声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
4、抽象类可以在不提供接口方法实现的情况下实现接口。这句话的意思是说,抽象类实现接口时,接口中定义的抽象方法,不需要复写到抽象类中,这个很好理解,抽象类中定义抽象方法,而接口中都是抽象方法,都需要由继承他们的类去实现其中的抽象方法。所以抽象类可以不复写接口中的方法,但是继承抽象类的子类一定要实现接口中的方法。
5、接口中声明的变量默认都是final的。抽象类可以包含非final的变量。也就是说接口中的变量其实就是常量,而抽象类可以定义成员变量。
6、接口中的成员函数默认是public修饰符。抽象类的成员函数可以是private,protected或者是public。
接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。
抽象类和接口的用法
抽象类:如果将一个类声明为abstract,此类不能生成对象,只能被继承使用。抽象类中可以有一般的变量和一般的方法。子类继承抽象类必须实现其中抽象方法,除非子类为抽象类。 private void print(){};此语句表示方法的空实现。 abstract void print(); 此语句表示方法的抽象,无实现。
抽象类的用法:一般多态的应用比较多。
接口:因为java不支持多继承所以就出现了接口,接口不能实现另一个接口,但可以继承多个接口。接口里面的成员变量默认都是public static final类型的,即使static漏写了,也是会被默认添加上的,接口里面的方法默认都是public abstract类型的。接口没由构造器不能被实例化。
视频里毕老师讲接口解释为规则,我认为这种比喻比较贴切。类是又来描述某一类事物,可以说是抽取某写事物的共同特点的产物,我们得到一个类,给他添加特有的数据就成了实例对象了。那么至于规则(接口)又怎么理解呢?我们以接力赛为例。一群运动员要参加比赛,我们可以把各个国家的运动会代表队看成类的对象,如果想参加接力赛就要遵守接力赛的规则:每组四个人,每个人都擅长短跑,每个人一圈,还要有接力棒。具备这些条件就能参赛了,如果少一个人或者没有接力棒就不能参赛了,除非实现了这个接口,在项目中如果要某些类型参与到某些类运算当中而又不能采用继承的方式使其满足条件,就可以考虑定义借口了。我个人在开发中看到很多程序在接口中定义大量常量,这样可以实现数据共享,避免就重复声明相同的数据啦!
作者:
迷途羔羊
时间:
2015-8-22 20:26
(1): 成员区别
抽象类:
成员变量: 可以是变量也可以是常量
构造方法: 有构造方法
成员方法: 可以是抽象方法,也可以是非抽象方法
接口:
成员变量: 只能是常量 ,存在默认的修饰符: public static final
构造方法: 没有构造方法
成员方法: 只能是抽象方法, 存在默认的修饰符: public abstract
(2): 关系区别:
类与类: 继承关系, 只能是单继承 , 不能是多继承,但是可以是多层继承
类与接口: 实现关系, 可以是单实现,也可以是多实现,并且一个类可以继承一个类的同时去实现多个接口
接口与接口: 继承关系 可以是单继承也可以是多继承
(3): 设计理念
抽象类 体现的关系"is a" 抽象类中定义的是该继承体系的共性功能。
接口 体现的关系"like a" 接口中定义的是该继承体系的扩展功能。
作者:
liuguodong
时间:
2015-8-22 23:22
接口就是一个抽象类吧,
作者:
taoaisheng
时间:
2015-8-23 09:31
首先比较一下两者的语法区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和(默认类型,虽然
eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
其次再说说两者在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码
作者:
旦夕
时间:
2015-8-23 13:59
参考下哈:
抽象类和常规类一样,都有数据和方法,但是不能用new操作符创建抽象类的实例,抽象类可以包含抽象和非抽象方法。
接口只包括常量和抽象方法。
两者不同点:
变量:
抽象类:无限制
接口:所有变量都必须是public static final
构造方法:
抽象类:子类通过构造方法链调用构造方法,抽象类不能用new操作符实例化
接口:没有构造方法,接口不能用new操作符实例化
方法:
抽象类:无限制
接口:所有的方法必须是公共的抽象实例方法
作者:
shdosh
时间:
2015-8-24 21:23
我是在职的看做java的,接口内一般不定义属性,只会定义方法名,接口一般是为类做功能扩展的和实现接口的类不一定在在属性和行为上有特定的联系,而抽象类与继承它的类是有继承关系的,会继承抽象类中的属性,集成他的类算是它的一个分支。
作者:
a4903913
时间:
2015-8-24 22:53
接口里面全部都是抽象方法,但是抽象类里面可以有实例方法的。看到这句话你知道什么时候用了吧。你在用接口的时候必须要重新接口的所有抽象方法。而抽象类则不用。接口是一种约束和能力。
作者:
心之谷96
时间:
2015-8-25 08:54
1、抽象类里面可以有非抽象方法
但接口里只能有抽象方法
声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
2、接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口
作者:
Ci功
时间:
2015-8-25 12:43
接口,可以多实现,这个功能最爽了
作者:
yaochaoyang
时间:
2015-8-25 14:34
接口和抽象类区别是:1.抽象类需要被继承,而且只能单继承。而接口需要被实现,而且可以多实现。2.抽象类中可以定义抽象的方法和非抽象的方法,子类继承后可以直接使用非抽象的方法。接口只能定义抽象的方法,必须要子类去实现。3.抽象类的继承是is,a的关系是定义该体系的基本共性内容。接口的实现是like,a的关系,在定义体系额外的功能
作者:
心之谷96
时间:
2015-8-26 12:26
接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。
抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个类(如果是类的话……),他们的抽象类是人。说明,他们都是人。
人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它.
所以,在高级语言上,一个类只能继承一个类(抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。
第一点. 接口是抽象类的变体,接口中所有的方法都是抽象的。而抽象类是声明方法的存在而不去实现它的类。
第二点. 接口可以多继承,抽象类不行
第三点. 接口定义方法,不能实现,而抽象类可以实现部分方法。
第四点. 接口中基本数据类型为static 而抽类象不是的。
当你关注一个事物的本质的时候,用抽象类;当你关注一个操作的时候,用接口。
作者:
yaochaoyang
时间:
2015-8-27 16:37
接口和抽象类都是不断向上抽取来的,抽象类只能单继承,接口可以多实现,你可以继承了抽象类后再多实现接口让子类有跟多的方法
作者:
hejin67410
时间:
2015-8-28 21:55
通俗的说抽象是用来实现共性内容的,而接口是用来实现扩展功能的,当一个对象需要对功能进行扩展的时候一般使用接口。
作者:
War3cdota
时间:
2015-8-31 11:51
楼上总结的都很好,我也想发表下我的小看法啊~
我是一个人,会吃饭睡觉,嗯,我还会一些java编程,喜欢打游戏。
那么,地球有这么多人,抽象出一个概念,人类,都有吃饭睡觉的行为,所以,我觉得抽象类的作用就是描述相同事物共同行为的类。同时你也看到,抽象类是要被继承的,那么,就说明了他是“is a”关系,因为描述一类事物,你不可能说他既是.....又是.....;最好的说法:他是....(类的单继承),但是像....,也像....,还像....(接口的多实现)的描述。
那么接口就是来提供“像(like a)”这个关键字的方法。那么,我喜欢打游戏,会写java,就是一些我个人的属性了,其他人可以和我相同,有重叠,或者完全不同。和我相同的行为就可以抽象成一个接口,按需来实现。
出身不能改变(继承),但是可以后天努力(接口)。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2