这一章可以说是 Java 的重中之重,没错众所周知,Java 是 面向对象 编程,这一章讲的就是 对象与 类。
1、概述:
A、面向对象程序设计,简称(OOP),Java 是完全面向对象的,必须熟悉 OOP 才能够编写 Java 程序。
B、面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。
C、程序中的很多对象来自标准库,还有一些事自定义的。
D、只要对象能够满足要求,不必关心其功能的具体实现过程。
E、在面向过程的程序中,算法是放在第一位,而数据结构是放在第二位;OOP 把这个次序调转,把数据放在第一位,算法/操作数据的算法放在后面。
2、类:
A、类(class)是构造对象的模板 或 蓝图。
B、由 类 构造(construct)对象的过程称为创建类的实例(instance)。
C、OOP 的原则,让用户自定Java 的类,变得更加容易,就是:可以通过扩展一个类来建立另一个新的类。
D、在 Java 中,所有的类都源自一个 "神通广大的超类" Object。
E、在扩展一个已有的类时,这个扩展后的新类具有所扩展的类的全部属性和方法。
F、通过扩展一个类来建立另一个类的过程叫 继承(inheritance)。
G、类之间的关系:
关系 | 描述 |
依赖("uses-a") |
A、依赖(dependence),即 "uses-a" 关系,是一种最明显的、最常见的关系。 B、如果一个 类/A 的方法操作另一个 类/B 的对象,我们可以说这个 类/A 依赖 另一个 类/B。 C、将相互依赖的类减至最少,可以减少一些因为修改类而导致的Bug 出现,这就是所谓的耦合度最小。 D、上面 C 的说法,就是减少相互依赖的类,其实就是低耦合的说法。 |
聚合("has-a") |
A、聚合(aggregation),即 "has-a" 关系。 B、聚合意味着 类A 的对象,包含着一些 类B 的对象 C、在 Java 的核心技术中,作者建议我们用聚合这个词,而不是用关联。 |
继承("is-a") |
A、继承(inheritance),即 "is-a" 关系。 |
3、对象:
A、要使用 OOP, 一定要清楚对象的三个主要特性:
* 对象的行为(behavior)—— 可以对对象施加哪些操作,或者可以对对象施加哪些方法。
* 对象的状态(state)—— 当施加哪些方法时,对象如何响应
* 对象标识 (identity)—— 如何辨别具有相同行为与状态的不同对象
B、对象的状态必须通过调用方法实现(如果不经过方法调用就可以改变状态,只能说明封装性遭到破坏)。
C、要想使用对象,就必须先构建对象,并指定初始状态;然后再对对象应用方法。
D、在 Java 中,是使用 构造器(constructor)构造新的实例;构造器是一种特殊的方法,用来构造并初始化对象。
E、想要构造一个对象,需要在构造器前面 加上 new 操作符:
/// 例如下面的 Date 类,我们要构造一个 Date 对象 /// Date 就是构造器。 /// 构造器的名称 要跟类名一样。 Date dateObj = new Date(); /// JavaScript: class 类名 { /// constructor 是构造函数 constructor() { } } /// 这里可以说明 构造器 和 构造函数,不是一个东西。应该是这样没错。 /// 可能是相同,区分一下叫法先。
F、对象和对象变量之间 存在一个重要的区别,对象变量,它是未引用对象,只声明了的变量。不能使用类的方法。
G、Java 中的对象变量,可以理解成 C++ 中的指针,大概意思就是,编程语言在 内存中 创建好一个对象,放在那里,然后变量名只是指向这一块内存的地址。
H、所以 为什么上一章的 数组赋值 是浅拷贝。
I、在 Java 中,最简单的类定义形式为:
class ClassName { field 1 field 2 ... /// 其中 constroctor 是 Java 中,类的构造函数, /// 这里不是有多个构造函数,而是一个方法重载的概念,我在下一章会说。 constructor1 constructor2 ... method1 method2 ... }