一、Object类的概述
JDK类库的根类,所有类的祖先。
任何一个类默认继承Object,没有直接继承,也会间接继承。
Object类是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,实现这个类的方法。
包名+类名:java.lang.Object
二、Object类当中有哪些常用的方法?
①怎么找这些方法?
去源代码当中。(但这种方式比较麻烦,源代码也比较难)
去查阅java类库的帮助文档
②什么是API?
应用程序编程接口。(Application program Interface)
整个JDK的类库就是一个Javase的API。
每一个API都会配置一套API帮助文档。
③ 目前需要知道的方法:
protected Object clone() //负责克隆的
boolean equals(Object obj) //判断两个对象是否相等
protected void finalize() //垃圾回收器负责调用的方法
int hashCode() //获取对象哈希值的一个方法
String toString() //将对象转换成字符串的形式
三、Object类中的toString()方法
①toString()的源代码长什么样?
public String toString() {
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
//源代码上toString()方法的默认实现是: 类名@对象的内存地址转换为十六进制的形式
②SUN公司设计toString()方法的目的是什么?
返回对象的字符串表示形式。
总的来说,这 toString方法返回一个字符串,“以文本方式表示”这个对象。
其结果应该是一个简洁,但详实的代表性,易阅读的。根据实际需要,建议所有子类都重写此方法。
Object类的toString方法返回一个包含该类的对象是一个实例的名称字符串的符号` @ ',和符号进制表示的对象的哈希码。
换句话说,此方法返回一个等于值的字符串
@Override
public String toString() {
return this.year + "年" + this.month + "月" + this.day + "日";
}
class MyTime{
int year;
int month;
int day;
public MyTime(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public MyTime() {
}
@Override
public String toString() {
return "MyTime{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
MyTime myTime = (MyTime) o;
return year == myTime.year &&
month == myTime.month &&
day == myTime.day;
}
}
public class Test01 {
public static void main(String[] args) {
MyTime T1 = new MyTime(1970,1,1);
String s1 = T1.toString();
//MyTime类重写toString()方法之前
System.out.println(s1);
//cn.edu.mju.t02.MyTime@1540e19d
//MyTime类重写toString()方法之后
System.out.println(s1);
//1970年1月1日
//输出引用时,会自动调用toString()方法
System.out.println(T1);
}
}
@打印输出对象/引用时,会自动调用toString()方法
四、Object类中的equals()方法
①equals()的源代码长什么样?
public boolean equals(Object obj) {
return (this == obj);
}
//以上这个方法是Object类的默认实现。
②SUN公司设计equals()方法的目的是什么?
以后编程的过程当中,都要通过equals()方法来判断两个对象是否相等。
③我们需要研究一下Object类给的这个默认的equals()方法够不够用!!!
在Object类的equals()方法里默认采用"=="来判断两个对象是否相等,而"=="判断的是两个java对象的内存地址是否相等,我们应该判断两个java对象的内容是否相等。所以Object中默认的Object方法不够用,需要子类重写
@Override
public boolean equals(Object obj) {
if (obj == null || !(obj instanceof MyTime)){
return false;
}
if (this == obj){
return true;
}
MyTime t =(MyTime)obj;
return this.year == t.year && this.month == t.month && this.day == t.day;
}
public class test02 {
public static void main(String[] args) {
//判断两个基本数据类型的数据是否相等直接使用"=="就行
//判断a里面的100和b里面的100是否相等
int a = 100;
int b = 100;
System.out.println(a==b);//true
//判断两个java对象是否相等,用equals,而不能用"=="
MyTime T1 = new MyTime(2008,8,8);
MyTime T2 = new MyTime(2008,8,8);
//这里"=="判断的是:T1中保存的对象的内存地址和T2中保存的对象的内存地址是否相等。
System.out.println(T1==T2);//false
//这里equals()方法判断的是T1对象保存的数据和T2对象保存的数据是否相等
//发现Object类的equals()方法里面用的是"==",而"=="判断不了一个对象是否相等
//不够用,就要重写equals()方法
System.out.println(T1.equals(T2));//true
}
}