适当的提醒自己学习的目的是有必要的。笔记的作者和理想中的读者应当是具有C语言编程的基础,对指针的概念有清晰理解,
正在学习面向对象编程并且希望理解类、对象的概念,特性和其大致实现原理。
本文的参考教材是java核心技术卷一
面向对象的编程
我很喜欢书中的一句话:对于面向过程而言,首先决定如何操作数据,然后再觉得如何组织数据的结构。而OOP却调换了这个次序,将数据放在第一位,然后再考虑组织数据的算法。
书中进一步提到,Web浏览器可能需要两千个过程对一组全局数据进行操作,而OOP只需要一百个含有20个方法的类,我对此存疑,但这不是重点。
一、类和对象
1.1 基本概念
类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。
对象中的数据称为实例字段,这些字段的值构成了对象的当前状态。
操作数据的过程称之为方法,程序只能通过一个类的方法来与该类的数据交互,这实现了类的封装。
可以通过保留一个类的全部属性和方法并扩展一些新的方法和数据字段的过程来创建一个新的类,这个过程称为继承。
对象的方法集合构成了对象的行为,示例字段值得集合构成了对象的当前状态同一个类的不同对象具有不同的标识。
1.2 编写OOP程序的原则
先识别类,再为类添加方法。重要的名词可能是类,重要的动词可能是类的方法。
1.3 类之间的关系
依赖关系
一个类的方法操作或使用另一个类的对象,就称为这个类依赖于另一个类聚合关系
一个类的对象包含另一个类的对象继承关系
一个类继承并扩展了另一个类的功能
二、使用类的方法
使用对象要先构造对象,然后初始化对象,之后调用对象的方法。
2.1 构造对象
构造对象使用new
运算符,这意味着为该对象分配存储空间。单独声明一个对象变量只是声明了一个指针(仔细思考一下,这意味着如果两个对象变量持有同一个对象的引用,通过任何一个对象变量调用方法都会影响另一个对象变量获得的数据):
1 | Date birthday; //unavailable |
2.2 成员
对对象变量使用.
运算符,就可以在对象上取出对应的成员。如果是成员字段,将会获得这个字段的引用。如果是方法,那么可以调用这个方法并且该方法已经绑定到该对象上。
这是相对而言比较正常的语法。
2.3 方法
我们在java中将一个类的成员函数称之为“方法”,这是一个非常拗口的称呼,尽管大多数程序员并不这么认为(
通常使用的成员方法可以分为两类:
- 更改器
- 访问器
在C++中,我们会使用const来标志访问器方法,从语法上限制这个函数修改对象内容的能力。然而,在java里我们无能为力。
要问:这种区别有什么用呢?这涉及到后面重要的概念“不可变性”。
2.4 定义
如果要定义一个类,我们需要定义其数据和对数据的操作,也就是成员字段和成员方法。同时,我们还应该准备一系列构造器,以初始化这个类。
定义字段的方法为访问修饰符+类型+标识符+;
定义方法的方式为访问修饰符+函数原型+函数定义
构造器的原型没有返回值