Object——所有类的父类
java是典型的面向对象的编程语言,在java中除了基本数据类型,其他所有的数据都以对象的形式组织,包括基本类型或对象的数组。
如果没有extends指出父类,则默认用Object作为父类,实际上所有类的最祖先类都为Object
- equals方法
public boolean equals(Object obj) {
return (this == obj);
}
类中默认的equal方法,比较两者的引用,必须是同一个对象的条件下返回true。
常用的String类中的equal方法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
//instanceof关键字等同于双目运算符,对象属于类
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
字符串使用中,“==”表示引用相等,equal方法表示字符内容相同。重写覆盖了Object中的equal方法。
子类equal方法设计
使用默认的equal方法实用性显然是不高的,所以在ADT设计中常常需要重写equal方法。
- 显示参数命名otherObject
- 检测otherObject是否为nul
- 检验this是否与otherObject引用同一对象
- 检验this和otherObject是否属于同一个类
(使用getclass或instanceof) - 将otherObject强转为this类型
(遇到父转子情况,报错ClassCastException) - 比较目标域相等
- toString方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回对象所属类名,@后跟其散列码组合起来的字符串,包括数组在内的类都直接继承Object的toString方法。
显然,返回散列码的方法无法直观的反映一个对象的数据情况,所以绝大多数的类采取“类的名字 + 方括号内域值”的形式。
Java自动toString转换
- 对象与一个字符串通过+连接
- 对象直接出现在print中
- hashCode方法
@HotSpotIntrinsicCandidate
public native int hashCode();
如代码所示,在java编译器中并没有hashCode的实现。注意注释@HotSpotIntrinsicCandidate,HotSpot是java虚拟机,表示该方法在虚拟机中更高效的实现。这样的方法称为本地方法
本地方法是由其它语言编写,编译成机器代码。本地方法保存在动态链接库以.dll后缀出现。虚拟机装载包含这个本地方法的动态库,并调用这个方法。通过本地方法,JAVA程序可以直接访问底层操作系统的资源。需要注意的是,本地方法与平台相关的。
在Object中,hashCode默认返回由对象存储地址导出的一个整数值。
编写hashCode时,合理组织实例域散列码,注意与equal方法保持一致。
- Object中还有getClass获取类方法,以及多线程控制的其他方法。