文章目录
1.1 JDK类库的根类:Object
研究Object类中的方法,就是所有Object类的所有子类通用的任何一个类都默认继承Object。都直接或者间接继承
1.2 Object类中的常用方法:
String toString()
//返回对象的字符串表示形式
boolean equals (Object obj)
//判断两个对象是否相等
protected void finalize()
//垃圾收集器在对象上调用该对象
int hashCode()
//返回对象的哈希码值
protected Object clone()
//创建并返回此对象的副本克隆
1.3 如何查找Object类中的常用方法
方法一:查看源代码
方法二:查阅JAVA的类库的API
1.4 关于Object类中的toString()方法
1)源代码:
public String toString() {
return this.getClass().getName()+"@"+Integer.toHexString(hashCode);
}
以上源代码默认实现形式为:
类名@对象的十六进制的内存地址
2)toString方法设计的目的:
通过调用此方法将一个"java对象"转换成"字符串"
表现形式
3)写一个类,toString()方法都是要被再次重写的
满足简洁、详实、易阅读的要求
4)代码示例:
public class test {
public static void main(String[] args) {
Mytime01 mytime01 = new Mytime01(2020,9,26);
System.out.println(mytime01);
}
}
class Mytime01{
int year;
int month;
int day;
public Mytime01(){
}
public Mytime01(int year,int month,int day){
this.year = year;
this.month = month;
this.day = day;
}
//重写toString方法,重写原则简洁、易阅读、详实
public String toString(){
return this.year+"/"+this.month+"/"+this.day;
}
}
1.5 关于Object类中的equals()方法
1)源代码:
public boolean equals(Object obj){
return (this == obj);
}
以上源代码默认实现形式:Object类中默认"=="equals()比较两个对象的内存地址
2)equals方法设计的目的:
通过调用此方法比较两个java对象是否相等
3)"=="用来判断两个基本数据类型的内存地址是否相等。
而如果我们要比较两个数据类型的内容相等
,则子类必须重写
Object类中的equals()方法来实现两个对象的内容是否相等
4)代码示例:
public class test02 {
public static void main(String[] args) {
Mydata mydata = new Mydata(10,15,25);
Mydata mydata2 = new Mydata(10,15,25);
//未重写equals()方法之前【比较的是内训地址】,false
System.out.println(mydata.equals(mydata2));
//重写equals()方法之后【比较的是对象内容】,true
}
}
class Mydata {
private int hour;
private int minute;
private int second;
public Mydata() {
}
public Mydata(int hour, int minute, int second) {
this.hour = hour;
this.minute = minute;
this.second = second;
}
//重写equals()方法【当 年相同、月相同、日相同时,表示两个对象相等,返回true】
public boolean equals(Object obj) {
// //具体代码实现
// //1.获取第一个日期的年月日,2.获取第二个日期的年月日,3.再对比
// int h = this.hour;
// int m = this.minute;
// int s = this.second;
// if (obj instanceof Mydata){
// Mydata md = (Mydata)obj;
// if (h == md.hour && m == md.minute && s == md.second){
// return true;
// }
// }
// return false;
//简洁优化版
if (obj == null || !(obj instanceof Mydata)){ //情况1:obj为空; 情况2:obj != Mydata
return false;
}else if (this == obj){ //情况3:obj == this,内存相同
return true;
}else{ //情况4:obj转化Mydata
Mydata md = (Mydata)obj;
return md.hour == this.hour && md.minute == this.minute && md.second == this.second;
}
}
// if (obj == null){
// return false;
// }
// if (!(obj instanceof Mydata)){
// return false;
// }
// if (obj == this){
// return true;
// }
// Mydata md = (Mydata) obj;
// if (md.second == this.second && md.minute == this.minute && md.hour == this.hour){
// return true;
// }
// return false;
}
1.6 String类重写的toString()和equals()方法
1.6.1 toString()
1)String类有没有重写toString方法?
String name=new String("123");
System.out.println(name); //123
System.out.println(name.toString()); //123
如果String类没有重写toString()方法,则输出结果:java.lang.String@十六进制的内存地址
如果String类已经
重写toString()方法,则输出结果:java对象的字符串形式
2)总结:
String类已经重写了toString方法
3)写一个类,toString()方法都要被再次重写
重写规则:简洁、明了、易阅读
System.out.println(name); //这里会自动调用"引用name"的toString()方法
1.6.2 equals()
1) 大部分情况下,String类创建新字符串对象用以下形式
String s1 = "456";
String s2 = "456";
System.out.println(s1.equals(s2)); //true
System.out.println(s1 == s2); //true
2)但实际上String也是一个类,不属于基本数据类型,却一定存在构造方法
String s3 = new String("789");
String s4 = new String("789");
System.out.println(s3 == s4); //false, "双等号"比较的是两个对象的内存地址是否相等
System.out.println(s3.equals(s4)); //true,String作为Object的子类重写了equals()方法,比较的是两个对象的数据内容是否相等
3)总结:
String类已经重写了equals()方法。比较两个字符串不能用“==”,而必须要用equals(),equals是通用的
重写规则:自己定。主要看什么和什么相等时,表示两个对象相等
4)注意:
equals()方法要重写彻底
,在两个类中的equals()比较重写方法都要彻底。