abstract 和 interface的区别详解

转载 2017年01月03日 16:57:19

先给大家说下基本概念

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进 行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对 于问题领域本质的理解、对于设计意图的理解是否正确、合理。

  abstract class和interface在Java语言中都是用来进行抽象类(本文 中的抽象类并非从abstract class翻译而来,它表示的是一个抽象体,而abstract class为Java语言中用于定义抽象类的一种方法, 请读者注意区分)定义的,那么什么是抽象类,使用抽象类能为我们带来什么好处呢?

  在 面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是 所有的类都是用来描绘对象的(把类具体化),如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。比如:如果我们进行一个图形编辑软件的开发,就会发现问题领域存在着圆、 三角形这样一些具体概念,它们是不同的,但是它们又都属于形状这样一个概念,形状这个概念在问题领域是不存在的,它就是一个抽象概念。正是因为抽象的概念 在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能够实例化的。

java开发里面经常会用到虚函数和接口,这两者的区别是什么呢?

abstract: 子类里面只能继承一个父类

interface: 子类可以实现多个接口

那什么时候用abstract,什么时候用interface呢?

当某个子类和父类是 is a关系时,比如一个亚洲人是一个人,那么一个亚洲人的子类可以继承一个人的父类。
当子类和父类是like a关系时,比如一个美洲超人像一个超人,超人的能力不是每个人都有的,所以不是所有人的属性,我们不能把超能力归于人的父类,这时就可以用interface

代码例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public abstract class Man {
public abstract void eat();
public interface SuperPower {
public void superPower();
}
public class AsiaMan extends Man { 
@Override
public void eat() {
System.out.println("亚洲人用筷子吃");
}
public class AmericanSuperMan extends Man implements SuperPower {
public void superPower() {
System.out.println("美国超人会飞");
}
@Override
public void eat() {
System.out.println("美国人用刀叉吃");
}
}
public static void main(String[] args) {
Man anAsiaMan = new AsiaMan();
AmericanSuperMan anAmericanSuperMan = new AmericanSuperMan();
anAsiaMan.eat();
anAmericanSuperMan.eat(); 
anAmericanSuperMan.superPower();
}

运行结果:

美国人用刀叉吃
美国超人会飞
亚洲人用筷子吃

正确的使用abstract和interface有利提高代码可读性,当人们看到extend时就会知道这是一个is a什么,看到implement时可以知道这个类有什么特性like a

抽象类abstract和接口interface的区别与深入思考

在以前的编程过程中,经常对abstract和interface混淆,相信很多初学者都有这样的困惑,也问过很多经验丰富的程序员,他们也不能清楚地说出个所以然来。经过自己的思考,想到了一种比较形象的方式来...
  • wujiaxian
  • wujiaxian
  • 2014年10月11日 11:32
  • 2896

interface和abstract 的区别和相同点

在Java语言中,abstract class和interface是支持抽象类定义的两种机制。 不能创建abstract类的实例,然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实...
  • Mandypan
  • Mandypan
  • 2016年08月06日 19:30
  • 6137

java 中 abstract 与interface的区别

Abstract class                                                   Interface 实例化          不能     ...
  • longtengshuimeng
  • longtengshuimeng
  • 2016年06月09日 14:07
  • 599

Interface与abstract类的区别

接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。       抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。...
  • u011860731
  • u011860731
  • 2015年09月25日 11:43
  • 2324

Java中abstract class和interface的区别

在Java语言中,abstract和interface是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对...
  • shuaijunlan
  • shuaijunlan
  • 2016年05月11日 20:32
  • 3189

abstract class 和 interface 区别

相信这个问题一定困扰不少小伙伴,今天来谈谈自己的理解 首先从概念上来区分 abstract class :就是抽象类,用关键字abstract来修饰的类称为抽象类(abstract...
  • singit
  • singit
  • 2015年08月17日 13:33
  • 1515

PHP interface和abstract理解

1.接口类:interface 接口类可以认为是只是定义一个方法,具体实现由子类来完成interface People { public function say();}由子类完成父类定义的方法 cl...
  • well1219
  • well1219
  • 2016年11月03日 14:46
  • 325

interface abstract 区别

java中interface接口与abstract class抽象类的区别 interface和abstract class是Java中实现多态的基础,都很有用,但也有一些区别:  interfac...
  • subuser
  • subuser
  • 2014年03月13日 20:24
  • 5310

C# interface与abstract class区别

C# interface与abstract class区别 一、abstract class abstract 声明抽象类抽象方法,一个类中有抽象方法,那么这个类就是抽象类了。所谓的抽象方法,就是不含...
  • fengzhongzhishenfu
  • fengzhongzhishenfu
  • 2014年04月09日 18:19
  • 3797

详解java中的abstract class和interface的区别

转载自http://blog.sina.com.cn/s/blog_624ca808010159ku.html 核心提示 在Java语言中,abstract class 和interface 是支持抽...
  • w962035216
  • w962035216
  • 2014年12月05日 11:07
  • 835
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:abstract 和 interface的区别详解
举报原因:
原因补充:

(最多只允许输入30个字)