这一章可以说是 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 就是构造器。
/// 构造器的名称 要跟类名一样。
/// 构造器,总是伴随着 new 操作符的执行被调用,而不能对一个已经存在的对象调用构造器来达到重新设置实例域的目的。
Date dateObj = new Date();
/// JavaScript:
class 类名 {
/// constructor 是构造函数 / 也叫构造器,可能是 Java 习惯叫 构造器
constructor() {}
}
F、对象和对象变量之间 存在一个重要的区别,对象变量,它是未引用对象,只声明了的变量。不能使用类的方法。
G、Java 中的对象变量,可以理解成 C++ 中的指针,大概意思就是,编程语言在 内存中 创建好一个对象,放在那里,然后变量名只是指向这一块内存的地址。
H、所以 为什么上一章的 数组赋值 是浅拷贝。
I、在 Java 中,最简单的类定义形式为:
class ClassName
{
field 1
field 2
...
/// 其中 constroctor 是 Java 中,类的构造函数,
/// 这里不是有多个构造函数,而是一个方法重载的概念,我在下一章会说。
/// Java 中的构造函数,是跟类名相同的,这点跟JavaScript 的不同,JavaScript 的构造函数,是 constructor() 这个固定名称
constructor1
constructor2
...
/**
* A、Java 中的实例域,即,类的字段(属性),局部的,全局的。在实例化后变成了 对象的 属性或者字段,这个时候就叫做实例域
* 对比了一下,应该在 constructor 中有 赋值的 类属性/字段,实例化后,带的属性,都叫实例域,因为在实例中能访问到。
* B、静态域,也叫 类域,应该就是上面 field 使用 static 定义后的属性。
* 意思准不准确不好说,我先这样认为先,后面更加清楚后,会修改,这里个人建议自己去查意思。
*/
method1
method2
...
}