导航
导航
Posts List
  1. Java面向对象特性
  2. Java语言特性
  3. Java使用场景

Thinking in java --- overview

作为整本书的开端,这章从比较高的层面全面的概括和介绍了Java语言的全貌。可以窥见,作为一门OOP的编程语言,Java的面向对象的特性体现,Java提供的完备的语言特性,以及Java的使用场景。其中穿插着和一些其他语言在横纵上的比较,对于语言的选择上也提供了建议。以下就从这几个方面总结一下这一章的内容。

Java面向对象特性
  • 抽象

    所有编程语言都提供抽象机制。解决问题的复杂性取决于抽象的类型(对象)和质量。根据抽象的类型,可以将编程语言的抽象分为三种:

    • 基于解空间的抽象:解空间是对问题建模的地方,这里指的是计算机。即基于计算机结构的抽象。

      • 实例

        • 汇编语言:对底层机器的轻微抽象。
        • 命令式语言:对汇编语言的抽象。
      • 缺点

        要求程序员建立解空间和问题空间上的关联,而这是困难费力的,维护成本高。

    • 基于问题空间的抽象:问题空间是问题存在的地方,这里指的是业务。即基于业务结构的抽象。

      • 实例

        • LISP:所有问题最终都是列表。
        • APL:所有问题都是算法形式的。
        • PROLOG:所有问题都可以转换成决策链。
        • 基于约束条件编程的语言和基于图形符号操作的语言。
      • 缺点

        只针对待解问题建模

    • 面向对象方式的抽象:向编程人员提供表示问题空间中的元素的工具。即对问题空间中的元素及其在解空间中的表示的抽象,抽象的结果就是”对象”。

      • 对象:问题空间中的元素及其在解空间中的表示的对象+无法类比为问题空间元素的对象。
      • 本质:程序可以通过添加新类型的对象使自身适用于某个特定的问题,而不会受限于任何特定类型的问题。
  • 继承

    • 现实意义:为了解决在创建一个类后,即使另一个新类与其具有相似的功能,还是要重新创建一个新类。而继承能够以现有的类为基础,通过添加和修改来创建新类。
    • 本质:体现了类型之间的相似性,并引入父类和子类的概念来表示这样的相似性。
    • 结果:
      • 对于某些对象的核心概念可以提取出来在父类中表示,而对于核心概念的不同实现方式可以用子类来表示。
      • 通过继承来建立了类型层次结构。同时类型层次结构也体现了类型的相似型和差异性。
      • 通过继承而产生的类型等价性。即父类和子类具有相同类型。
  • 多态

    • 现实意义:在处理类型层次结构时,基于基类进行进行编程,可以编写出不依赖于特定类型的代码,而对接会依据自身的具体类型来执行相对应的代码。这样在扩展功能而添加新类型时,不需要更改调用方法的代码,代码不受新添加类型的影响。这样可以极大改善代码的设计,同时也降低软件维护的代价。
    • 本质:动态绑定(动态派发)
      • 静态绑定 VS 动态绑定
        • 静态绑定:编译器在编译时,将产生对具体函数名字的调用;运行时将这个调用解析到将被执行代码的绝对地址。
        • 动态绑定:编译器在编译时,不知道将被执行的确切代码,只能确保调用方法的存在和对调用参数和返回值进行类型检查;运行时通过实际对象中存储的信息,通过一段特殊的代码来计算出方法体的地址,实现动态调用对象方法。
    • 结果:多态的实现,使得程序从特定类型中解放出来。而这样的实现不需要自己编写检查类型代码,编译器和Runtime会处理这些实现细节。
Java语言特性
  • 单根继承

    在Java中所有的类最终都继承自单一的基类 — Object

    优点:

    • 单根继承结构保证所有对象都具备某些功能。
    • 单根继承结构使垃圾回收器的实现变得容易得多。
  • 对象创建与回收

    • 对象的存储位置

      • 静态分配

        • C++:Stack,对象存储在堆栈或静态存储区。

        • 使用场景:对象的存在空间和生命周期可以在编写程序时确定。

        • 优点:执行速度快,有利于存储空间分配和释放。
        • 缺点:缺少了灵活性,必须在编写程序时知道对象的确切数量,生命周期和类型。在一般化问题上将收到极大限制。
      • 动态分配

        • Java:Heap,在堆的内存池中动态创建对象。Java完全采用了动态内存,基本类型只是一种特例。
        • 使用场景:知道运行时才知道需要多少对象,生命周期和具体类型
        • 优点:对象创建的灵活性,对象创建可以在需要时直接在堆中创建。
        • 缺点:存储空间是在运行时被动态管理的,需要大量时间在堆中分配空间。
        • 前提:动态方式存在一般性的假设,即对象趋于变得复杂,所以查找和释放存储空间的开销不会对对象的穿件造成重大冲击。
  • 对象的生命周期:

    • 静态分配:编译器可以确定对象存活时间,并可以自动销毁。
    • 动态分配:编译器对对象的生命周期一无所知。所以Java提供了垃圾回收机制来发现对象何时不再使用,并对对象进行销毁。而C++程序必须手动编程实现,而这不可避免的容易发生错误。
  • 容器

    Java在其标准类库java.util中提供了大量的容器,其中有满足不同需求的各种类型的容器。

    • 不同容器提供了不同类型的接口和外部行为
    • 不同的容器对于某些操作具有不同效率。
  • 泛型

    在Java SE5中增加的参数化类型,符号是一对尖括号,中间参数为类型名词。

    现实意义:在取回具有实用接口的对象时,需要某种方式记住对象类型,使得可以进行正确的向下转型。而这样的方案就是参数化类型机制。

    本质:通过编译器可以自动定制作用于特定类型上的类。

    优点:不需要向下转型和进行运行时类型检查,避免错误。

  • 异常

    异常处理就是于程序正常执行路径并行的,在错误发生时执行的另一条路径。

    • 异常处理的错呀处理直接至于编程语言中,甚至操作系统中
  • 异常不能被忽略,它保证一定在某处得到处理。
  • 异常提供了一种从错误状况进行可靠恢复的途径。

  • 并发

    把问题切分成多个可独立运行的部分,提高程序的响应能力。Java的并发是内置的,在Java SE5的java.util.concurrent中添加了大量的并发支持。

    • 可独立运行的部分叫线程,使一种为单一处理器分配执行时间的手段。
    • 在语言级别上,多线程使得编程人员不再操心机器上是有多个处理其还是只有一个处理器。如果有多个处理器,线程可以被指派给不同的处理器,实现真正的并行;如果是单处理器,通过时间片的分配使得看起来好像在并行执行一样。
    • 问题:共享资源
Java使用场景
  • java C/S编程