4. 面向对象
4.1 面向对象
面向对象程序设计,简称OOP是当今主流的程序设计范型。Java是完全面向对象的。
面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。在OOP中,不必关心对象的具体实现,只要能够满足用户的需求即可。
面向对象是一种思想,能让复杂问题简单化,程序员不需要了解具体的实现过程,只需要指挥对象去实现功能。
4.1.1 类
类:对现实生活中事物的描述。
类是构造对象的模板或蓝图。由类构造对象的过程称为创建类的实例。
封装是与对象有关的一个重要概念。从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式。对象中的数据称为实例域,操纵数据的过程称为方法。对于每个特定的类实例(对象)都有一组特定的实例域值。
- 类关系UML符号对照表:
4.1.2 对象
对象:就是事物,实实在在存在的个体。
要想使用OOP,一定要清楚对象的三个主要特性:
- 对象的行为 -- 可以对对象施加哪些操作/方法
- 对象的状态 -- 当施加方法时,对象如何响应
- 对象标识 -- 如何辨别具有相同行为与状态的不同对象
4.1.3 类之间的关系
- 依赖:users-a
- 聚合:has-a
- 继承:is-a
4.2 用户自定义类
4.2.1 构造器
-
构造器与类同名
-
每个类可以有一个以上的构造器
-
构造器可以有0个、1个或多个参数
-
构造器没有返回值
-
构造器总是伴随着new操作一起调用
4.2.2 隐式参数与显示参数
显示参数明显地列在方法声明中,隐式参数没有在方法声明中。
在每一个方法中,关键字this表示隐式参数。
4.2.3 final实例域
可以将实例域定义为final。构建对象时必须初始化这样的域。必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能够再对它进行修改。
final修饰符大都应用于基本类型域,或不可变类的域中的每个方法都不会改变其对象,这种类就是不可变的类。
4.3 静态域与静态方法
4.3.1 静态域
如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。
4.3.2 静态常量
由于每个类对象都可以对公有域进行修改,所以,最好不要将域设计为public。
4.3.3 静态方法
静态方法是一种不能向对象实施操作的方法。
4.4 对象构造
4.4.1 重载
一个类可以有多个构造器。
StringBuilder messages = new StringBuilder();
StringBuilder todoList = new StringBuilder("To Do:
");
上面的特征叫做重载。多个方法有相同的名字、不同的参数,便产生了重载。
Java允许重载任何访法,而不只是构造器方法。
4.4.2 默认域初始化
如果在构造器中没有显式地给域赋予初值,那么就会被自动地赋为默认值:数值为0、布尔值为false、对象引用为null。
4.4.3 无参数的构造器
很多类都包含一个无参数的构造函数,对象由无参数构造函数创建时,其状态会设置为适当的默认值。仅当类没有提供任何构造器的时候,系统才会提供一个默认的构造器。如果在编写类的时候,给出了一个构造器,哪怕是和简单的,要想让这个类的用户能够构造实例new ClassName()
,就必须提供一个默认的构造器(不带参数的构造器)。
4.4.4 关键字this
-
关键字this引用方法的隐式参数。
-
如果构造器的第一个语句为:
this(…)
,这个构造器将调用同一个类的另一个构造器。 -
public Demo(double s) { // calls Demo(String, double) this("Demo #" + nextId, s); nextId++; }
当调用
new Demo(6000)
时,Demo(double)
构造器将调用Demo(String, double)
构造器。
4.4.5 对象析构与finalize方法
在析构器重,最常见的操作是回收分配给对象的存储空间。对于Java有自动的垃圾回收器,不需要人工回收内存,所以Java不支持析构器。当然,某些对象使用了内存之外的其他资源。在这种情况下,当资源不再需要时,将其回收和再利用将显得十分重要。
可以为一个类添加finalize
方法。finalize方法将在垃圾回收器清除对象之前调用。
4.5 注释
关于注释,前文已经略有讲到,此处就不过多赘述,本节主要是拿出几个重要地方记录下来。
4.5.1 方法注释
- @param变量描述:对当前方法的“param”参数部分添加一个条目。
- @return描述:对当前方法添加“return”返回部分。
- @throws类描述:将添加一个注释,用于标识这个方法有可能抛出异常。
4.5.2 通用注释
- @author姓名:将产生一个作者条目
- @version文本:将产生一个版本条目
- @since文本:始于条目
- @deprecated文本:对类、方法或变量添加一个不再使用的注释。
- @see引用
4.6 类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法名要能够体现它们的职责
- 优先使用不可变得类