浅谈Object类中的部分方法

      类 Object 类层次结构的根类。每个类都使用 Object 作为父类。所有对象都实现这个类的方法。

Object类中的部分方法

  1. String toString()
  2. boolean equals(Object object)
  3. protected void finalize()
  4. int hashCode()

1.toString()方法

  • toString方法源代码
public String toString(){
      getClass().getName() + '@' + Integer.toHexString(hashCode());
}

      1. 由源代码可知toString()方法的默认实现方式是:类名@对象的内存地址经过哈希算法转换为十六进制的形式。
      2. toString()方法的设计目的是返回对象的字符串表示形式,通过调用此方法可以将一个“Java对象”转换成“字符串”表示形式。
      3. 其结果应该是一个简介详实的,建议所有子类都重写此方法(SUN公司规定)。

public class MyTime {
    int year;
    int month;
    int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public static void main(String[] args) {
        MyTime myTime = new MyTime(2008,8,8);
        System.out.println(myTime.toString());
    }
}
//在没有重写toString()方法之前,创建一个MyTime对象调用toString方法输出的结果为MyTime@b4c966a
//显然这种输出结果并不简洁详实,并不符合我们的预期,当一个日期对象转换为字符串对象的时候,我们希望看到的仍然是具体的日期信息,而不是对象的内存地址,所以需要重写toString方法
public class MyTime {
    int year;
    int month;
    int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @Override
    public String toString() {
        return "MyTime{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }

    public static void main(String[] args) {
        MyTime myTime = new MyTime(2008,8,8);
        System.out.println(myTime.toString());
    }
}
//当重写了toString()方法后在输出的结果为MyTime{year=2008, month=8, day=8},显然这种输出结果才符合我们预期的效果

2.equals()方法

      1.SUN公司设计equals()方法的目的是通过equals方法来判断两个对象是否相等,显然SUN公司给的equals方法并不够用。
      2.判断两个基本数据类型是否相等可以使用==进行,但是如果是判断两个引用数据类型还可以使用==进行判断吗?

public class MyTime {
    int year;
    int month;
    int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @Override
    public String toString() {
        return "MyTime{" +
                "year=" + year +
                ", month=" + month +
                ", day=" + day +
                '}';
    }

    public static void main(String[] args) {
        MyTime time1 = new MyTime(2008,8,8);
        MyTime time2 = new MyTime(2008,8,8);
        System.out.println(time1==time2);//输出结果为false
    }
}

      ==保存的是对象的内存地址,time1和time2是两个不同的对象,保存的是两个不同的内存地址,所以输出的结果为false。示例中的==判断的是time1中的内存地址和time2中的内存地址是否相同,输出的结果自然为false,但是我们确确实实是创建了两个都为2008年8月8日的日期对象,显然是用==来进行判断两个引用数据类型是否相等的话结果就会永远都是false,这种方式并不合适,所以需要子类重写equals()方法来对引用数据类型是否相同进行比较。

  • equals()方法源代码
public boolean equals(Object object){
      return (this==obj);
}
//以上这个方法是Object类的默认实现,该默认的equals方法仍然使用的==对this的对象和obj对象进行比较,输出结果也是永远为false,所以要想使用equals方法对两个引用数据类型进行比较的话,就必须要重写equals方法
public class MyTime {
    int year;
    int month;
    int day;

    public MyTime() {
    }

    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    @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 static void main(String[] args) {
        MyTime time1 = new MyTime(2008,8,8);
        MyTime time2 = new MyTime(2008,8,8);
        System.out.println(time1==time2);//输出结果为true
    }
}

3.finalize()方法

  • 源代码
protected void finalize() throws Throwable{}

      1. finalize()方法只有一个方法体,里面没有代码,而且这个方法是protected修饰的。
      2. 这个方法不需要手动调用,JVM的垃圾回收器负责调用这个方法。
      3. finalize()方法的执行时机,当一个Java对象即将被垃圾回收期回收的时候,GC负责调用这个方法。
      4. 这个方法的意义是SUN公司为Java程序员准备一个垃圾销毁时机,如果希望对象在销毁时机执行一段代码的话,这段代码就要写到finalize()方法中,和静态代码块类似,静态代码块在类加载时刻执行并且只执行一次,是SUN公司准备的类加载时机。

4.hashCode()方法

  • 源代码
public native int hashCode();

      1. 这个方法带有native关键字,底层调用C++程序。
      2. hashCode()方法返回的是哈希码,实际上是一个Java对象的内存地址,经过哈希算法得出的一个值,所以该方法的执行结果可以等同的看作一个Java对象的内存地址。

posted @ 2020-07-18 12:11  zuzuzu_code  阅读(84)  评论(0)    收藏  举报