1 对象与类
1.1 对象导论
抽象过程
所有编程语言都提供抽象机制。可以认为,人们所能够解决的问题 的复杂性直接取决于抽象的类型和质量。 **面向过程:**是一种以过程为中心的编程思想。以什么正在发生为主要目标进行编程。 **面向对象:**是通过向程序员提供表示问题空间中的元素的工具。我们将问题空间中的元素及其在解空间中的表示称为“对象”。
面向对象编程这种思想的实质是:程序可以通过添加新类型的对象使自身适用于某个特定问题。 因此,当你在阅读描述解决方案的代码的同时,也是在阅读问题的表述。 Booch对对象的描述:对象具有状态、行为和标识。这意味着每一个对象都可以拥有内部数据(它们给出了该对象的状态)和方法(它们产生行为)。
每个对象都有一个接口
**接口(方法)确定了对某一特定对象所能发出的请求。**在类型中,每一个可能的请求都有一个方法与之相关联,当向对象发送请求时,与之相关联的方法就会 被调用。此过程通常被概括为:向某个对象“发送消息”(产生请求), 这个对象便知道此消息的目的,然后执行对应的程序代码。
每个对象都提供服务
当正在试图开发或理解一个程序设计时,最好的方法之一就是将对 象想像为**“服务提供者**”。程序本身将向用户提供服务,它将通过调用其他对象提供的服务来实现这一目的。你的目标就是去创建(或者最好是在现有代码库中寻找)能够提供理想的服务来解决问题的一系列对象。
1.2 类
- 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
- 类:类是一个模板,它描述一类对象的行为和状态。
对象与对象变量
在Java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用。
Date deadline = new Date()
上面语句中:表达式new Date() 构造了一个Date类型的对象,并且它的值是对新创建对象的引用。这个引用存储在变量deadline中。
字段和方法
在类中可以设置两种类型的元素:
- **字段(有时被称作数据成员):**字段可以是任何类型的对象,可以通过其引用与其进行通信;也可以是基本类型中的一种。
- 字段如果没有进行初始化,会赋予一个默认值。对象类型的字段,默认值为null。
- **方法(有时被称作成员函数):**决定了一个对象能够接收什么样的消息。方法的基本组成部分包括:名称、参数、返回值和方法体。
构造器
在创建一个对象的时候,至少要调用一个构造方法。每个类都有构造方法。构造方法的名称必须与类同名, **注意:**如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
创建对象
对象是根据类创建的。在Java中,使用关键字new 来创建一个新的对象。创建对象需要以下三步:
- 声明:声明一个对象,包括对象名称和对象类型。
- 实例化:使用关键字 new 来创建一个对象。
- 初始化:使用 new 创建对象时,会调用构造方法初始化对象。
2、 对象的初始化
假设有个假设有个名为Dog
的类:
- 当首次创建类型为
Dog
的对象时或使用Dog
类的静态方法时,Java解释器必须查找类路 径,以定位Dog.class文件。 - 载入Dog.class,此时有关静态(static 成员变量) 的初始化的所有动作都会执行。因此,静态初始化只在Class对象首次加载的时候进行一次。
- 当用new Dog()创建对象的时候,首先将在堆上为Dog对象分配足够的存储空间,这块存储空间会被清零,这就自动地将Dog对象中的所有基本类型数据都设置成了默认值(对数字来说就是0,对布尔型和字符型也相同),而引用则被设置成了null。
- 执行所有出现于成员字段定义处的初始化动作。(所以成员字段的初始化发生再构造器方法执行之前)
- 执行构造器方法。
💡当涉及到继承的时候,对象初始化的过程会更加复杂