黑马程序员技术交流社区
标题:
抽象类和接口的区别?
[打印本页]
作者:
张 涛
时间:
2012-9-6 17:27
标题:
抽象类和接口的区别?
本帖最后由 张 涛 于 2012-9-12 09:46 编辑
一次面试时的一道面试题,很简单的问题,当时却答得很糟,一点都没条理。张孝祥老师在视频中说一定要答出和别人不一样的东西,你会怎么答呢?
作者:
魏-玉-彪
时间:
2012-9-6 18:18
本帖最后由 魏-玉-彪 于 2012-9-6 18:30 编辑
用学术的语言描述是这样:
抽象类:抽象就是不具体,没有方法体的方法称为抽象方法,有抽象方法的类称为抽象类,抽类中可以有具体方法,也就是正常的、有方法体的、有大花括号的方法。使用abstract关键字修饰
接口:可以认为是一种特殊的抽象类,接口中声明的所有方法都是抽象的,所有的变量都是 final类型的。使用interface关键字修饰一个接口,当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
如果要换成自己的语言,可以这样回答:
首先,抽象类是一个类,
用abstract class
定义,接口是一个接口用
interface
定义,
接口可以看成是一种特殊的类,抽象类中可以有非抽象方法,接口中声明的所有方法必须都是抽象的,所有的变量都是 final类型的 。
关于继承的特性,在java中,不支持类的多继承,就好比说,一个孩子只能有一个爹,抽象类是类的一种,因此不支持多继承,但支持多重继承。 接口支持多继承,也支持多实现,就好比是一个学生可以有多个老师,可以从事多种职业。
另外抽象类和接口都不能实例化,只能通过子类覆写了所有的抽象方法后才能实例化,就像是老父亲和老师的年龄大了,不能直接干活,只能让儿子或者学生干。{:soso__8961432591078930798_3:}
在定义的时候,能定义接口的就定义接口,这样可以少占用一个类的extends关键字,就好比说,能让学生干的活就让学生干,儿子只有一个,干了这个就干不了别的,学生可以有很多。{:soso__10513193490961459299_4:}
作者:
孙岳
时间:
2012-9-6 18:30
抽象类用abstact修饰,接口用interface修饰;
抽象类中的方法至少有一个是抽象的,而接口中的方法都是抽象的;
抽象类通过extends继承的方式来实现抽象方法,接口通过implement来实现;
抽象类只能单继承,而接口可以多继承。
作者:
杨卫腾
时间:
2012-9-6 21:20
相同点:
都是不断向上抽取而来的。
不同点:
1. 抽象类需要被继承,而且只能是单继承。
接口需要被实现,而且可以多实现。
2. 抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
接口只能定义抽象方法,必须由子类去实现。
3. 抽象类的继承,是 is a 的关系,在定义该体系的基本共性内容。
接口的实现是 like a 关系,在定义体系的额外功能。
作者:
武庆东
时间:
2012-9-6 23:16
相同点:
1.接口和抽象类都不能被实例化,用于被其他类实现和继承
2.接口和抽象类都可以包含抽象法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法
不同点
:
1.接口自能包含抽象方法,不包含已经提供实现的方法;抽象类可以包含普通方法
2.接口里不能定义静态方法;抽象类里可以定义静态方法
3.接口里只能定义静态常量属性,不能定义普通属性;抽象类中可以定义普通属性,也可以定义静态常量属性
4.接口不包含构造器;抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象,而是其子类调用这些构造器来完成属于抽象类的初始化操作;
5,接口里不能包含初始化,但抽象类则完全可以包含初始化块;
6.一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口
抽象类
:从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模版,从而避免了子类设计的随意性,抽象类体现的是一种模版模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式!
接口
:接口定义的是一种规范,因此接口里不能包含构造器和初始化块定义。接口里可以包含属性(还能是常量)、方法(只能是抽象方法)、内部类(包括内部接口)和枚举类定义!
作者:
张 涛
时间:
2012-9-12 09:46
大神啊,这些就可以了,结贴。呵呵
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2