学习目标
本讲介绍了三种常见的面向对象编程场景:对象比较、对象组合、对象复制
掌握这三种面向对象编程技巧,是进一步学习更复杂的(比如“设计模式”)编程技巧的基础
对象比较
- 施加于两个对象变量之上的“==”,实际上是判断这两个对象变量是否引用同一个对象
- 在实际开发中,我们经常需要比对某两个对象的“内容“比如你已经有一个对象,想在另一个对象集合中找到是否有”内容一样“的对象
- 这里所说的对象的”内容“,主要指对象的字段值
- 由于字段值在不同的时刻可能会改变,在某一特定时刻,对象所有字段值的集合,称为对象在这一时刻的”状态“
对象比较:Comparable接口
- JDK中为了能比较对象X和Y的大小,定义了以下接口:
public interface Comparable{
int compareTo(Object other);
}
- 泛型化的Comparable接口
引入泛型后,JDK中又增加了一个泛型化的接口,老的版本不推荐使用:
public interface Comparable<T>{
int compareTo(T other);
}
区分==与Equals
- ==施加于对象类型,是比较两个对象变量是否引用同一对象,如果需要比对对象的“内容(即各字段的值)”,通常是调用对象的equals方法
- equals方法由Object类所定义,其默认实现如下:
public boolean equals(Object obj){
return (this == obj);
}
重写equals()的必要性
- JDK的许多集合类型,比如ArrayList,在查找元素时,会调用元素的equals方法以确定当前元素是不是要找的那个
一个容易忽略的问题
- 重写Object的equals方法,注意其参数必须是Object
- 另外,为了让对象能放入各种容器中,通常还需要重写hashCode方法
重写equals方法的要求
一个可以“判等”的类的示例模版
【不理解重写hashCode有啥用?】
对象组合
- 对象组合指的是对象之间的相互包容关系
- 在面向对象时代:正在运行的程序=对象+对象之间的合作关系
【研究对象组合的方式在面向对象编程中很有必要】
对象组合方式一的实现
class A{
private class D{
}
private D innerDObj=null;
public A(){
innerDObj = new D();
}
}
- A 完全包容 D
- A对象创建时,B对象自动创建;A对象销毁时,D对象也同时销毁
对象组合方式二的实现
对象复制
简单克隆对象
对象的浅复制
组合对象的复制问题
对于组合对象,浅复制会带来一些问题。A对象包容一个B对象: