您的位置:首页 > 编程语言 > Java开发

Think in Java反刍笔记(3)---对象是什么(3)

2016-02-25 10:21 555 查看
1.5 继承:重新使用接口
       对象这个概念允许我们将各式各样的数据和功能封装到一起。
       个人注解:对象有类型,有能存储数据和对数据操作的功能,这些都是封装在一起的。

       在项目中我们费尽心机做出一种数据类型后,但是对象中总会有一些对象有类似的功能,这样我们所新建的对象在某种意义上是有重复的,为了便于使用,便有了继承这种新的特性。继承是说,如果基础类(也叫超类或者是父类)有某种功能那么继承类就天然拥有这种功能,但是继承类(子类)也可以有自己的不同于父类的特性或方法。继承是通过extends关键字实现的。

       继承并不能完全等价于克隆(克隆在企业项目中一般很少会用到)。

       书上的原话是:使用继承时,相当于创建了一个新类。这个新类不仅包含了现有类型的所有成员(尽管private成员被隐藏起来,且不能访问),但更重要的是,它复制了基础类的接口。也就是说,可向基础类的对象发送的所有消息亦可原样发给衍生类(也就是继承类)的对象。根据可以发送的消息,我们能知道类的类型。
        
       由于基础类和衍生类具有相同的接口,所以那个接口必须进行特殊的设计。也就是说,对象接收到一条特定的消息后,必须有一个“方法”能够执行。若只是简单的继承一个类,并不做其他任何事情,来自基础类接口的方法就会直接照搬到衍生类。那继承也就没有了意义。所以子类最好也是尽可能有自己新的特性或方法。
    

1.6.1 多形对象的互换使用

         继承的最终目的是在创建一些类似的对象时能够便利很多,提高代码的健壮性等。
         继承后最显著的变化如下图:
          
 


            上面这个图的意思就是 Circle,Square,Triangle,这三个对象都继承(extends) Shape对象,所以他们都有Shape的功能。

          
1.6.2  抽象的基础类和接口

         抽象的基础类指的是 : abstract class HelloWorld(){
                                                     abstract void method1();
                                                     abstract void method2();
                                              };
         接口指的是:                interface HelloWorld2(){

                                                     void method1();
                                                     void method2();

                                              };

         如何抽取抽象类?
         在上面看到的Shape这个对象,在我们分析项目时,基本基本上不会有这个对象,但是Circle,Square,Triange,这三个对象都有一些相同的特性,这个一个高度抽象化的对象。这个对象在问题领域是不存在的,因为如此抽象的概念没有对应的具体的概念,所以我们用抽象概念的抽象类来表示它,它是不能够实例化的。所以结论是抽象类是不能被实例化的。
        为什么在基础类上我们要加一个abstract?
        抽象类是主要是用来进行类型隐藏,防止修改。比如说我构造了一个固定的一组行为的抽象描述(Shape,形状:能被画出来,能被删除,能移动,能着色),但是这个抽象类可能会被Circle,Square……等等具体的实现方式。首先无论有多少个具体的实现方式,都不能修改Shape的行为,同时Circle,Square
的行为描述也得到了扩展等。而这个是遵循COP原则(Open-Closed Principle)的,这个原则是实现面向对象设计的一个最核心的原则,抽象类在其中起到关键作用。
      
        从编程的角度来说:
       abstract  class 在Java语言中表示的是一种继承关系,一个类只能使用一次继承。但是一个类却可以实现多个interface。也许,这是Java语言的设计者在考虑Java不能多重继承的一种折中考虑。
        


       不能有抽象构造函数或抽象静态方法。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现 这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。

       interface强调特定功能的实现,而abstract class强调所属关系。 

       interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也 不能声明实例变量。
      

       interface的应用场合

          A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。

          B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。

          C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。

         D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

      abstract class的应用场合

            一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:

                    A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。

                   B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。

                   C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能。

1.8 为例控制:解决错误
    “违例控制”将错误控制方案内置到程序设计语言中,有时甚至内建到操作系统内。这里的“违例”(Exception) 属于一个特殊的对象,它会从产生错误的地方抛出来。随后,这个异常会被设计用于控制特定类型错误的“异常控制器”捕获。
        个人注解:这里的“违例”就是Exception,更正确的翻译是“异常“,对异常可以捕捉,然后定义自己的异常信息。    

 


     
      个人注解:迷失这种事情在开发中是非常非常容易发生的。很多情况下是由于开发时间很紧,或者是开发水平的不同,又或者心态的问题,造成我们的代码其实在编写的过程中与最开始的预期会有很大的出入,每个人都会这种感觉,直到我们的代码不能维护。即便我们有了代码规范,有了代码审查,但是规范不能时时检测,代码审查不能经常发生,开发水平可能短时间不会快速提升,所以能改变这种状况的最开始的也是最重要的就是心态的问题。对这个项目的认真的态度和能对自己的代码负责的精神还有就是为别人提供便利就是为自己提供便利的认识,这些都很重要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息