概览
要想使用OOP, —定要清楚对象的三个主要特性:
- 对象的行为(behavior):可以对对象施加哪些操作, 或可以对对象施加哪些方法?
- 对象的状态 (state) :当施加那些方法时 对象如何响应? ,
- 对象标识(identity):如何辨别具有相同行为与状态的不同对象?
在实际的业务开发过程中,要时刻谨记以面向对象思维编程。由于业务需求多是流程性的,很容易在编码的过程中变为面向过程编程,这点尤其需要注意。
数据域
大部分时候,我们需要获得或设置类内实例域的值(强烈推荐使用 lombok 工具类,减少冗余代码量)。 因此, 应该提供下面三项内容:
- 一个私有的数据域
- 一个公有的域访问器(get)方法
- 一个公有的域更改器(set)方法
如果在编写一个类时没有编写构造器, 那么系统就会提供一个无参数构造器。 这个构造器将所有的实例域设置为默认值。
fina关键字
此外,有几点需要注意。final 实例域必须在构建对象时初始化。也就是说, 必须确保在每一个构造器执行之后, 这个域的值被设置, 并且在后面的操作中, 不能够再对它进行修改。final 关键字只是表示存储在变量中的对象引用不会再指示其他对象,但是这个对象可以更改。
静态方法
一般情况下,在下面两种情况下使用静态方法:
- 一个方法不需要访问对象状态, 其所需参数都是通过显式参数提供(例如: Math.pow )
- 一个方法只需要访问类的静态域
按值调用
一个对象变量并没有实际包含一个对象, 而仅仅引用一个对象。在 Java 中, 任何对象变量的值都是对存储在另外一个地方的一个对象的引用。new 操作 符的返回值也是一个引用。
Java 程序设计语言总是采用按值调用。 也就是说, 方法得到的是所有参数值的一个拷贝,特别是方法不能修改传递给它的任何参数变量的内容。
有些程序员认为 Java 程序设计语言对对象采用的是引用调用,实际上, 这种理解是不对的。 由于这种误解具有一定的普遍性, 所以下面给出一个反例来详细地阐述一下这个问题。
首先, 编写一个交换两个雇员对象的方法:
public static void swap(Employee x, Employee y) // doesn't work
{
Employee temp = x;
x = y;
y = temp;
}
如果 Java 对对象采用的是按引用调用, 那么这个方法就应该能够实现交换数据的效果:
Employee a = new Employee("Alice", . . .);
Employee b = new Employee("Bob", . . .);
swap(a, b);
// does a now refer to Bob, b to Alice?
但是,方法并没有改变存储在变量 a 和 b 中的对象引用。 swap 方法的参数 x 和 y 被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
// x refers to Alice, y to Bob
Employee temp = x;
x = y;
y = temp;
// now x refers to Bob, y to Alice
最终,白费力气。 在方法结束时参数变量 x 和 y 被丢弃了。 原来的变量 a 和 b 仍然引用这个方法调用之前所引用的对象。
交换对象参数的结果没有保留下来
这个过程说明,Java 程序设计语言对对象采用的不是引用调用, 实际上, 对象引用是按值传递的。
总结一下 Java 中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数 (即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。
重载 Overloading
有些类有多个构造器,这种特征叫做重载(overloading)。 如果多个方法有相同的名字、不同的参数, 便产生了重载。 编译器必须挑选出具体执行哪个方法, 它通过用各个方法给出的参数类型与特定方法调用所使用的值类型进行匹配来挑选出相应的方法。 如果编译器找不到匹配的参数, 就会产生编译时错误,因为根本不存在匹配,或者没有一个比其他的更好。这个过程被称为重载解析(overloading resolution)。
Java 允许重载任何方法, 因此,要完整地描述一个方法,需要指出方法名以及参数类型。这叫做方法的签名(signature)。例如, String 类有 4 个称为 indexOf 的公有方法。它们的签名分别是
//重载签名与返回值类型无关
indexOf(int)
indexOf(int, int)
indexOf(String)
indexOf(String, int)
值得注意的是,返回类型不是方法签名的一部分,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。
类设计技巧
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法名要能够体现它们的职责
- 优先使用不可变的类
网友评论