【Java】常用類之頂級Object類常用方法

Object類

簡介:超類、基類,所有類的直接或間接父類,位於繼承樹的最高層
特點:

  • 任何類,如果沒有書寫extends顯式繼承某個類,都默認繼承Object類
  • Object類中所定義的方法,是所有對象都具備的方法
  • Object類可以存儲任何對象:作爲參數,可接收任何對象;作爲返回值,可返回任何對象。

1. getClass()

public final Class<?> getClass() {}
返回引用中存儲的實際對象類型。
應用:通常用於判斷兩個引用中實際存儲對象類型是否一致。

public class TestMethodForGetClass {
      public static void main(String[] args) {
            
            Animal[] as = new Animal[] {new Dog(), new Cat(), new  Dog()};
            
            if (as[0] instanceof Dog) {
                  //...
            } else if (as[0] instanceof Cat) {
                  //...
            }
            
            System.out.println(as[0].getClass()); // class  com.day20.t4_objects.Dog
            System.out.println(as[1].getClass().getName()); //  com.day20.t4_objects.Cat
            System.out.println(as[0].getClass() == as[1].getClass());  // false
            System.out.println(as[0].getClass() == as[2].getClass());  // true
      }
}
class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

2. hashCode()

public int hashCode() {}
返回該對象的十六進制的哈希碼值(對象在內存中的數字型名字)。
哈希算法根據對象的地址或者字符串或者數字計算出來的int類型的數值。
哈希碼並不唯一,可保證相同對象返回相同的哈希碼,儘量保證不同對象返回不同的哈希碼值。

public class TestMethodForHashCode {
      public static void main(String[] args) {
            // 引用數據類型 .hashCode()
            Teacher t1 = new Teacher();
            System.out.println(t1.hashCode());
            
            String s1 = "abc";
            System.out.println(s1.hashCode());
      }
}
class Teacher {}

3. toString()

返回該對象的字符串表示(表現形式)。
可以根據程序需求覆蓋該方法,如展示對象各個屬性值。
特點:

  • 對象中屬性的表現形式,常用於展示對象的各個屬性。
    源碼:
// 對象.toString()
public String toString() {
    return getClass().getName() + "@" +  Integer.toHexString(hashCode());
}


public class TestMethodForToString2 {
      public static void main(String[] args) {
            Worker worker = new Worker();
            worker.name = "Jerry";
            worker.age = 22;
            worker.sex = "男";
            worker.salary = 15000.0;
            
            // 對象中屬性的表現形式,常用於展示對象的各個屬性。
            System.out.println(worker.toString());
      }
}
class Worker {
      String name;
      int age;
      String sex;
      double salary;
      
      // 覆蓋父類Object類的toString()方法 - Alt+Shift+S +s
      @Override
      public String toString() {
            return "Worker [name=" + name + ", age=" + age + ", sex=" +  sex + ", salary=" + salary + "]";
      }
}

4. equals();

public boolean equals(Object obj)
默認實現爲 this == obj, 比較兩個地址是否相同。
特點:

  • 可進行覆蓋,比較兩個對象的內容是否相同。

     重寫覆蓋父類Object.equals()方法,五步走:
     1.判斷引用地址是否相同
     2.判斷引用地址是否爲空
     3.確認對象類型是否一致
     4.轉型 - 向下轉型拆箱
     5.比較對象中的實際內容
    
public class TestMethodForEquals {
      public static void main(String[] args) {
            Student s1 = new Student("tom", 20, "男", 99D);
            Student s2 = new Student("tom", 20, "男", 99D);
            
            System.out.println(s1.hashCode() + " " + s2.hashCode()); //  !=
            System.out.println(s1.equals(s2)); // equals:不重寫就是false,重寫後爲true
      }
}
class Student {
      String name;
      int age;
      String sex;
      double score;
      
      public Student() {}
      
      public Student(String name, int age, String sex, double score) {
            super();
            this.name = name;
            this.age = age;
            this.sex = sex;
            this.score = score;
      }
      /**
       * 重寫覆蓋父類Object.equals()方法,五步走:
       * 1.判斷引用地址是否相同
       * 2.判斷引用地址是否爲空
       * 3.確認對象類型是否一致
       * 4.轉型 - 向下轉型拆箱
       * 5.比較對象中的實際內容
       */
      @Override
      public boolean equals(Object obj) {
            // 1.地址不同
            if (this == obj) {
                  return true;
            }
            // 2.內容非空
            if (obj == null) {
                  return false;
            }
            // 3.類型一致
            if (this.getClass() != obj.getClass()) {
                  return false;
            }
            // 4.向下轉型 - 拆箱
            Student stu = (Student)obj;
            
            // 5.比較內容 - 需要覆蓋toString()方法
            if (this.toString().equals(stu.toString())) {
                  return true;
            }
            
            return false;
      }
      @Override
      public String toString() {
            return "Student [name=" + name + ", age=" + age + ", sex="  + sex + ", score=" + score + "]";
      }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章