zoukankan      html  css  js  c++  java
  • 接口与抽象类

    首先声明,本文基本參考自
    http://dev.yesky.com/436/7581936.shtml
    增加从其它资料中获得的观点。

    1从逻辑上说

       抽象类描写叙述了一系列"东西"的本质。
       接口描写叙述一系列"东西"应该具有的功能,或者说接口就是一组契约。


       在oop的观点里,世界上不论什么实物都能在思想的角度给一个类与之配对,但反过来说,并非思想中全部的类都能在现实世界里找到一个实物配对。(这里说的思想里的类 也是个逻辑概念 包含普通的类也包含抽象类 接口等等)
    举个样例,我们设计一个画图软件,这里面会有正方形三角形,直线曲线,实线虚线,红色蓝色各种逻辑概念。

    我们如今仅仅讨论正方形三角形这个问题域,通过对这个问题域的思考,我们能设计出一个"形状"的概念,我们能从画图软件的側边栏拖出一个三角形一个正方形,可是我们不能拖出一个"形状"!由于在我们的问题域里事实上不存在"形状"的概念,它是我们抽象出来的。既然是抽象的自然就不能实例化喽!

    2从语法定义上说

       abstract class Demo{
       abstract void meth1();
       abstract void meth2();
       }
       interface Demo2{
       void meth1();
       void meth2();
       }
    最主要的定义如上。
    一个类仅仅能够继承一个类,却能够实现非常多个接口(多少个? 好像是65535 预计够咱们用了)
    先说属性,抽象类中能够有自己的数据成员。接口中也能够有数据成员,只是都是static final型的,另外尽管接口从语法角度能够有属性,可是实际情况中,我们并不在接口中定义属性。


    再说方法,接口中的全部的方法都是抽象的(不能有方法体),且都默认是public。抽象类中的方法能够有方法体,也能够没有方法体(没有方法体时要注明abstract)
    抽象类中的抽象方法(其前有abstract修饰)不能用private、static、synchronized、native訪问修饰符修饰。

    原因例如以下:抽象方法没有方法体。是用来被继承的,所以不能用private修饰。static修饰的方法能够通过类名来訪问该方法(即该方法的方法体)。抽象方法用static修饰没有意义;使用synchronizedkeyword是为该方法加一个锁。。而假设该keyword修饰的方法是static方法。则使用的锁就是class变量的锁。假设是修饰 类方法。则用this变量锁。可是抽象类不能实例化对象,由于该方法不是在该抽象类中实现的。是在其子类实现的。所以。

    锁应该归其子类全部。所以。

    抽象方 法也就不能用synchronizedkeyword修饰了。native,这个东西本身就和abstract冲突,他们都是方法的声明。仅仅是一个吧方法实现移交给子类,还有一个是移交给本地操作系统。假设同一时候出现,就相当于即把实现移交给子类。又把实现移交给本地操作系统。那究竟谁来实现详细方法呢?
    上一段參考资料
    http://blog.sina.com.cn/s/blog_7ffb8dd5010111yu.html

    3从设计层面来说

      在回顾一下上文的观点
       抽象类描写叙述了一系列"东西"的本质。


       接口描写叙述一系列"东西"应该具有的功能,或者说接口就是一组契约。


       如今我们设计了一个door,它具有open与close的功能,我们能够用抽象类的方式实现,也能够用接口的方式实现。
       假设我们如今又设计了一个带报警功能的门呢?
       方法一
            我们在原来的抽象类/接口中加上一个报警的方法(仅仅有一个概念)
    问题出现了,从逻辑上说,我们一直都在反复抽象类描写叙述的事一系列东西的本质,报警算是门的本质么?应该不算吧。另外从软件的角度来看,我们确实存在一些类,它是单单依赖于门这个类的,如今我们把门改了加上了报警的特性,那么那些原本仅仅依赖门open与close的类也得改。
       方法二
            把门和报警器设计成两个概念
    1门和报警器都是抽象类
    java中不同意多重继承。
    2门和报警器都是接口
    那带报警器的门罗逻辑上来说究竟是门能还是接口呢?
    "带报警器的门"从语法上分析,我们都能看出来"带报警器"是"门"的一个定语起修饰作用,带报警器的门的实质还是门。

    因此就有了第3中思路
            3门是抽象类,报警器是接口
    显而易见,门是抽象类,报警器是接口这样的方式是我们所须要的。


    总而言之,设计层面上的东西没有对错之分,仅仅有合适与否之别,上面的问题中,假设我们觉得带报警器的门本质上是报警器同一时候又门的功能,那咱们就把程序设计成门市接口,报警器是抽象类就可以!
    言而总是,类的继承说的是" a ia b"的关系;类的实现说的是"a is like b"(a像b)的关系!

  • 相关阅读:
    Python学习总结之三 -- 优雅的字符串
    Python学习总结之二 -- 数据类型
    Python学习总结之一 -- 基础篇
    JavaWeb学习总结第三篇--走进JSP页面元素
    JavaWeb学习总结第二篇--第一个JavaWeb程序
    JavaWeb学习总结第一篇--初识JavaWeb
    三俊马 站立会议04
    三俊马 站立会议03
    三俊马 站立会议02
    三俊马 站立会议01
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6803975.html
Copyright © 2011-2022 走看看