Java 之路 (一) -- 对象导论

写在开篇

作为计划中的 java 学习系列的第一篇,说一点废话。

最开始学习 java 还是在大二下学期学校开的课,然而在那之后并未深入学习,相当多的知识要么遗忘掉了,要么就还是属于一知半解的程度。而自从今年接触 Android 以来,越发的感受到 java 基础的重要性,不只是 API 的熟练程度,最重要的是一些思想总是理解不到位。

于是乎,趁现在大四前(秋招前)的最后一个暑假,重新学一下 java 基础。某种意义上讲,也是迫于秋招的压力,觉醒了我的勤奋之血不得不恶补一波。。

嗯,关于学习资料,暂定以 《Thinking in java》 为主,系列文章会按照该书的目录顺序整理。

废话说的有点多,下面就正式开始我的 java 学习之路了。


本章学习内容:

主要是包括开发方法概述在内的 OOP(面向对象程序设计) 的基本概念,大多是背景性的和补充性的材料。通过引入诸多概念,帮助读者扎实的了解 OOP。

对于 OOP 的深入了解 很重要!很重要!很重要!


1. 抽象过程

(1) 纯碎的面向对象程序设计方式的5个特性

  1. 万物皆为对象
  2. 程序是对象的集合,它们通过发送消息来告知彼此所要做的
  3. 每个对象都有自己的由其他对象所构成的存储
  4. 每个对象都拥有其类型
  5. 某一特定类型的所有对象都可以接受同样的消息

(2) 对于对象的简洁描述:

对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据和方法,每一个对象在内存中都有一个唯一的地址。


2. 每个对象都有一个接口

(1) 所有的对象都是唯一的,但同时也是具有相同的特性和行为的对象所归属的类的一部分。

(2) 创建抽象数据类型(类)是面向对象设计的基本概念之一。

(3) 数据类型(类)描述了具有相同特性(数据元素)和行为(功能)的对象集合。

(4) 接口确定了对某一特定对象所能发出的请求。程序中必须存在的满足这些请求的代码与隐藏的数据一起构成了实现。在类型中,每一个可能的请求都有一个放方法之相关联,当向对象发送请求时,与之相关联的放法就会被调用。


3. 每个对象都提供服务

(1) 将对象想象成 “服务提供者“:

  • 程序本身向用户提供服务,通过调用其它对象提供的服务来实现这一目的。
  • 附带的好处:提高对象的内聚性。

(2) 高内聚

  • 每个对象都完成一项任务,但是并不试图做过多的事
  • Less is better.

4. 被隐藏的具体实现

(1) 客户端程序员目标是收集各种用来实现快速应用开发的类,可以类比为我们这种依靠 java 的 API 来写程序的程序员;类创建者的目标是构建类,类比为写 java 源码的程序员,这种类只想客户端程序员暴漏必须的部分,而隐藏其他部分,隐藏的部分通常是对象内部脆弱的部分。

(2) 访问控制的存在原因:

  1. 让客户端程序员无法触及它们不应该触及的部分
  2. 允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员
  3. 涉及到的关键字:public、private、protected

5. 复用具体实现

(1) 组合:新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成,即使用现有的类合成新的类。

(2) 聚合:如果组合是动态发生的,通常称之为聚合


6. 继承

(1) 通过继承,可以以现有的类为基础,复制它,然后通过添加和修改这个副本来创建新类。当基类发生变动时,被修改的子类也会反映出这些变动。

(2) 继承使用基类型和导出类型的概念表示类型之间的相似性:一个基类型包含其所有导出类型所共享的特殊性和行为。

(3) 继承现有类型时,也创造了新的类型。不仅包括了现有类型的所有成员,更重要复制了基类的接口。即所有可以发送给基类对象的消息同时也可以发送给导出类对象,意味着导出类与基类具有相同的类型。

(4) 如果只是简单地继承一个类,而不做任何改变,那么基类接口的方法将会直接继承到导出类中。

(5) 如何使基类和导出类产生差异:

  1. 直接在导出类中添加新方法,这些新方法并不是基类接口中的一部分。
  2. 覆盖父类方法:改变现有基类的方法,直接在导出类中创建想要覆盖的基类方法的新定义即可。

7. 伴随多态的可交换对象

(1) 将一个对象不当作它所属的特定类型来对待,而是将其当作基类的对象来对待。这种方式下,添加新类型很容易处理,只不过是从基类中导出了一个新的子类型,而不需要修改处理泛化基类的方法。

(2) 前期绑定:编译器会产生对一个具体函数名字的调用,而运行时将这个调用解析到将要被执行的代码的绝对地址。

(3) 后期绑定:向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但是并不知道将被执行的确切代码。java 默认是动态绑定。

(4) 向上转型:将导出类看作是它的基类的过程。

(5) 示例:

void doSomething(Shape shape){
    shape.erase();
    // ...
    shape.draw();
}

Circle circle = new Circle();
Triangle triangle = new Triangle();
doSomething(circle);
doSomething(triangle);

上面的代码表达的意思是:“你(circle / triangle)是一个 shape,我知道你可以 erase() 和 draw() 你自己,那么去做吧,但是要注意细节的正确性”,而非“如果是 Circle,请这样做;如果是 Triangle,请那样做……”。


8. 单根继承结构

(1) 在 Java 中,所有的类最终都继承单一的基类(Object)。

(2) 单根继承结构中的所有对象都具有一个公共接口,所以它们归根到底都是相同的基本类型。

(3) 单根继承结构使垃圾回收器的实现变得容易得多,而垃圾回收器是 Java 相对 C++ 重要的改进之一。


9. 容器

(1) 出现原因:某些情况下不知道解决某个特定问题时需要多少个对象,或者它们将存活多久,那么就不知道如何存储这些对象,更不可能知道需要多少空间创建这些对象。于是创建了被称为容器的新对象类型,它满足在任何需要时都能扩充自己以容纳我们置于其中的所有东西。因此我们只需要创建一个容器对象,让后将对象置于容器中,让它处理所有细节。

(2) Java 中存在众多容器,分别满足不同的需要:

  1. 不同容器提供了不同类型的接口和外部行为
  2. 不同的容器对于某些操作具有不同的效率(典型如 LinkedList 和 ArrayList)

(3) 泛型机制:创建这样一个容器,它直到自己所保存的对象的类型,从而不需要向下转型以及消除犯错误的可能。泛型就是一个编译器可以自动定制作用于特定类型上的类,通过泛型,编译器可以定制一个只接纳和取出 Shape 对象的容器


10. 对象的创建和生命期

(1) java 完全采用了动态内存分配方式。每当想要创建新对象时,就要使用 new 关键字来构建此对象的动态实例。

(2) Java 提供了垃圾回收器机制,被设计用来处理内存释放问题,可以自动发现对象何时不再被使用,继而销毁它并释放其内存;同时它还提供了高层保障,可以避免暗藏的内存泄漏问题。


11. 异常处理:处理错误

(1) 异常处理将错误处理直接置于编程语言中。异常是一种对象,它从出错地点被“抛出”,并被专门设计用来处理特定类型错误而定相应的异常处理器“捕获。

(2) 异常处理可以看错是与程序正常执行路径并行的、在错误发生时执行的另一条路径,因此它不会干扰正常的执行代码

(3) 异常不能被忽略,所以它保证一定会在某处得到处理。

(4) 异常处理不是面向对象的特征。


12. 并发编程

(1) 并发,在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。

(2) 通常线程只是一种为单一处理器分配执行时间的手段,如果操作系统支持多处理器,那么每个任务都可以被指派个不同的处理器,并且它们是真正的并行执行。

(3) 多线程的便利之一是程序员不需要关心机器上处理器的数量,由于程序在逻辑上被分为线程,如果机器拥有做个处理器,那么程序不需要特殊调整也能执行的更快。

(4) 并发的隐患:共享资源。如果多个并行任务都要访问同意向资源,那么必须在使用期间被绑定。(比如两个进程不能同时像一台打印机发送消息)


13. Java 与 Internet

本章接触的实在是太少了。。大概记下几个点,留待日后细细学习吧。

知识点:

  • 将Web 理解 为 C/S 架构
  • 客户端编程:
    • 插件
    • 脚本语言
    • Java – applet 以及 Java Web Start
    • .NET 和 C#
    • Intranet(注意这不是 Internet)
  • 服务器端编程

总结:

本章大多数都只是概念性质的知识,想当初第一次看的时候,只有这几种想法“这尼玛是啥”,“这尼玛又是啥”,哈哈哈。现在用了一段时间之后回过头再来看这些概念性的东西,突然就有不一样的理解了。

所以说,这章也就像原书中提到的一样,这章并不会妨碍我们编写程序和学习语言,但是最终我们还是要回到这一张来补充所学的知识,加深对对象的重要性的理解。

我这里只是记下了一些关键点,好多背景性的解释都没有提及,强烈建议大家还是有时间有精力的情况下仔细阅读一下本章。

猜你喜欢

转载自blog.csdn.net/whdAlive/article/details/81428313