黑马程序员技术交流社区
标题:
关于抽象类和接口
[打印本页]
作者:
homeless
时间:
2014-3-1 12:13
标题:
关于抽象类和接口
抽象类里定义了0个或多个抽象方法,接口里的方法也全都是抽象的,最大区别是一个是extends,一个是implements那么究竟该什么时候用抽象类,什么时候用接口。假若被面试问道了,又该怎么回答呢?
作者:
xietansheng
时间:
2014-3-1 13:07
接口可以多实现,抽象类只能单继承,抽象类可以对方法进行部分实现,只实现共有的方法,二实现方式不同的方法交个子类,也就是说抽象类不打算解决所有的问题,只解决部分公有的问题。
作者:
李白衣
时间:
2014-3-1 13:35
抽象类只能单继承,接口可以多实现。
接口的方法都是 public abstract 的,成员变量是 public static final 的。
用到抽象类,说明抽象类一定是一个父类。
用到接口,只是说明有一定的关系,就像用到序列化接口的时候,只是为了给类加上一个标记而已。
接口的出现是为弥补java中没有多重继承的遗憾。比如,当你有个Animal父类,然后你又想要Dog这个子类拥有Pet的特性,这是就可以将Pet设计为接口了。
作者:
陪你等日出
时间:
2014-3-1 14:21
本帖最后由 陪你等日出 于 2014-3-1 14:23 编辑
以前我也有和楼主同样的困惑,觉得抽象类和接口区别不大,有时都可以用,后来看了很多讲解弄懂了。
首先,抽象类在java语言中表现的是一种继承关系,而且只能单继承,就意味着一个类只能使用一次继承关系,但是一个类却可以实现多个接口。然后,抽象类表示的是“is a”关系,接口表示的是“like a”关系。
那么决定使用接口还是使用抽象类就看你对问题领域的理解,你的设计意图是怎样的,举一个例子:
你要设计一个phone,这个phone中有两个功能:call,send,那么你可以这样设计
用抽象类定义:
abstract class phone
{
abstract void call();
abstract void send();
}
复制代码
用接口定义:
interface phone
{
void call();
void send();
}
复制代码
然后其它具体的phone对象可以通过继承抽象类phone,使用其中的方法,或者通过实现phone接口再使用其中的方法,这么看来区别不大,但是这时如果你想让这个手机不仅可以发送短信和打电话,还要拥有照相功能,那么你可以这样做:
抽象类中简单的加上拍照方法,让其成为拍照手机:
abstract class phone
{
abstract void call();
abstract void send();
abstract void camera();
}
复制代码
接口中简单的加上拍照方法,让其成为拍照手机:
interface phone
{
void call();
void send();
void camera();
}
复制代码
看起来是实现了功能要求,但是却违反了面向对象设计的一个核心原则ISP (Interface Segregation Principle),因为你将phone概念固有的功能和照相机的行为方法混在一起了。那么这里就是前面所说的,决定使用接口还是使用抽象类就看你对问题领域的理解,你的设计意图是怎样的,显然你要设计的是一个手机,那么就要这样设计:
abstract class phone
{
abstract void call();
abstract void send();
}
interface Camera
{
void camera();
}
//继承固有功能,实现照相功能
class CameraPhone extends phone implements Camera
{
void call()
{
System.out.println("call phone");
}
void send()
{
System.out.println("send message");
}
void camera()
{
System.out.println("take photos");
}
}
复制代码
如果你想设计一个可以发送短信和打电话的照相机,那么你可以把上面的设计方式反过来,把camera()定义在抽象类里,把send()和call()定义在接口里。
作者:
午夜b'Boy
时间:
2014-3-1 16:07
设计一个类,共性的,最本质的,一般用抽象类实现,特别的,扩展的,相互约定的一般用接口实现
作者:
chenfc8578
时间:
2014-3-1 23:03
抽象类,使部分抽象,它是可以带有一些有方法体的方法的。接口中的所有方法都是抽象的。抽象类是模板,接口是规范。
作者:
还是回去火星吧
时间:
2014-3-2 02:38
当描述一组方法的时候 或 有一些变量和方法,你不需要修改的时候使用接口
当描述一个虚拟的物体的时候使用抽象类
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2