A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuddd 高级黑马   /  2013-4-8 01:07  /  3431 人查看  /  10 人回复  /   2 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 吴超老师 于 2013-4-8 01:14 编辑

    有一篇关于抽象类与接口区别的帖子,从语法的角度,回答内容非常全面,臻于完美!

    下面我从语义的角度解释一下,可能非常难理解。目的有二:一是深入揭示三者区别,二是摸一下同学们的基础学的咋样。请同学们勿见怪!

    三者的区别是类中不能有未实现的方法,抽象类中可以存在未实现的方法,接口中只能有未实现的方法。大家可以发现三者的演化中,对于已实现的方法要求越来越严格,对于未实现的方法要求越来越纯粹。

    想过为什么有这样的区别吗?教学中说是为了多继承之类的,没错。从语法角度讲,确实如此。但,仅仅是为了语法的多继承吗,接口的多继承这么重要吗?非也!

    我已无从考证java标准委员会当初为何这么指定语法,只能谈一下我的理解。

    对于类,它是对现实世界中的事物抽象,非常好,通过属性和方法就清晰的表达了真实的世界万物。我至今仍然惊叹发明“类”这件事情非常伟大!

    抽象类也是一种类,它也有属性和方法,只是允许有未实现的方法。那么为什么不实现?是实现不了吗?还是不能实现?随便怎么理解,反正是没有实现!那就只能有子类来实现了。换句话说,抽象类是表示一种没有办法实现某种(些)方法的类。这种类有一定的行为,但是行为不确定。需要具体到子类才能知道是什么细节的行为(方法的实现其实定义的是行为的细节)。当子类知道了抽象类中抽象方法的实现细节后,那么就成为了具体类了。也就是子类可以实现抽象类中的抽象方法。

    随之而来,新的问题!为什么不能使用方法覆盖,而使用方法实现哪?不都是定义了子类的方法实现细节吗,二者有什么区别吗?有区别!方法覆盖是指父类中的方法时具体的,也就是父类知道方法的实现细节;而抽象类中根本不知道如何实现方法的细节!就比如金三胖说打美国,他说的“打”就是抽象方法,只有具体的作战部队才知道如何“打”。这时候,抽象类根本没能力实现抽象方法。也就是说,抽象类也不想成为抽象类,但是没办法。

    再说一下接口。接口太纯粹了,只有未实现的方法和静态常量属性,不能有任何已经实现的方法,那么可以知道接口是没有办法实例化的(教学中的实例化接口是从语法角度讲的,没错)。为什么发明不能实例化的类哪?还能按照从类产生抽象类的思路来理解吗,太牵强了!既然不能实例化接口,那么接口还有什么用?只能作为变量的类型了!也就是说接口实质上是在定义类型,具体什么实现,是别人干的事情。接口就是类型,别人怎么去实现,我不管,但是必须是我的类型。这就引出了多态!多态的含义就是同一个类型的多个实现,重点是“多个实现”。如果是一个实现的话,那就是普通类。

    那么,抽象类也可以“多个实现”啊?与接口的“多个实现”有什么区别吗?我个人觉得没有区别。那为什么有接口的语法?我觉得核心在于接口的“纯粹性”!

    接口既然是空实现。那只要我定义接口,就没有想着要实现它。我不管实现,谁负责实现那谁负责。它体现的是一种职责划分。

    综上,我个人觉得类、抽象类、接口体现的是一种责任划分。接口责任最小,因为不负责实现,只是作为变量的声明类型而已。抽象类承担了责任,也可以承担接口的责任,但是对于没有办法承担的它就不管了。担责任最多的是具体类,它既要有自己的责任,还需要承担抽象类的责任,还需要承担接口的责任。  既然类是现实世界的抽象,那么可以把它们比作社会结构:接口是国王,抽象类是中间管理层,具体类是老百姓。

    以上纯属个人的理解,不能作为标准答案应对面试。

    我打算写本书,叫做《编程的哲学》或者《面向对象的哲学》或者《面向对象的社会学分析》,时间定在鸡年马月, O(∩_∩)O哈哈~

    如果有闲得无聊的,可以跟帖讨论啊,没有标准答案!

   

10 个回复

倒序浏览
哥们飘过,云中无影,只是觉得没有方法我就补全,有了我就再改写
回复 使用道具 举报
说是计算机科学包含了哲学还是哲学成就了计算机科学呢!从0101和易的关系,到云计算和人与世界连通的猜想(参考阿凡达),万事万物真的有想通的地方。
回复 使用道具 举报
接口是国王,抽象类是中间管理层,具体类是老百姓。
类中不能有未实现的方法,抽象类中可以存在未实现的方法,接口中只能有未实现的方法

亮点!
回复 使用道具 举报
十年书白读了.....惭愧啊...
回复 使用道具 举报
抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。接口是特殊的抽象类。
基本都是面向接口编程,接口就是国王、
回复 使用道具 举报
{:soso_e100:}{:soso_e112:}{:soso_e113:}{:soso_e129:}
回复 使用道具 举报
楼主说的很有道理,说说我在使用这些 东西的原则吧,一般先定义接口,接口中有n多方法,接口中的方法一多,实现起来就显的臃肿 ,然后就把常用的方法变量封装到一个抽象类中,然后用的时候 一般情况就用抽象类了,特殊情况在用接口来实现。
回复 使用道具 举报
支持~~~~~~~~~
回复 使用道具 举报
提炼下老师文章的内容,
1.抽象类因为某些原因导致其无法确定自身某些方法的细节.
2.具体类完全了解方法的细节.
其实这两条已经完整的表达了老师的观点,我认为老师加金三胖打美国的那一段有些多余了.
3.接口是国王,抽象类是中间管理层,具体类是老百姓。这个观点,给赞一个!{:soso_e179:}

关于老师的这个观点:
        那么,抽象类也可以“多个实现”啊?与接口的“多个实现”有什么区别吗?我个人觉得没有区别。那为什么有接口的语法?我觉得核心在于接口的“纯粹性”!

老师的观点3很好的表达了三者之间的关系,但我仍认为java中的接口是多余的,这样特性只会提高语言的复杂性,我有许多理由,单是jdkdoc中的各种interface class,abstract class,concrete class之间的directed acyclic graph就把我弄得头昏脑涨.打个比方,我很多年前就听说过易语言,两个月之前看了一下,那个语法让我想吐.很简单的if语句,偏要用中文加上许多线来描述,这就好比明明是很简单地事物,偏要用复杂的方法去描述,或许是体现自己的高深莫测,或许是因为其自身设计的局限性.我倒认为C++中只分基类和虚基类使其比java简单一层,灵活性却更强了.

这是一篇blog:blog.sina.com.cn/s/blog_5d90e82f010184hx.html,作者是王垠,康奈尔大学博士,他更为人知的事迹是05年清华大学退学博士.王垠的许多观点我都相当认可,读他的博客,常有醍醐灌顶的感觉.
与诸君共享!

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 赞一个!

查看全部评分

回复 使用道具 举报
期待老师的作品
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马