1. 程式人生 > 實用技巧 >常用類-Object類

常用類-Object類

Object類

概念

  • 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層。
  • 任何類,如果沒有書寫extends顯示繼承某個類,都預設直接繼承Object類,否則為間接繼承。
  • Object類中所定義的方法,是所有物件都具備的方法。
  • Object型別可以儲存任何物件。
    • 作為引數,可接受任何物件。
    • 作為返回值,可返回任何物件。

方法摘要

JDK官方文件中的方法摘要

方法介紹

這裡只講getClass()equals()hashCode()toString()finalize()這5個方法,其他方法後面用到了再講

getClass()
  • 原始碼,返回值為Class

    public final Class<?> getClass(){}

  • 返回引用中儲存的實際物件型別

  • 應用:通常用於判斷兩個引用中實際儲存物件型別是否一致

    • 學生類

      package com.ciao.classDemo.demo01;
      public class Student {
          private String  name;
          private int age;
          public Student(String name, int age) {
              this.name = name;
              this.age = age;
          }
          public String getName() {
              return name;
          }
          public void setName(String name) {
              this.name = name;
          }
          public int getAge() {
              return age;
          }
          public void setAge(int age) {
              this.age = age;
          }
      }
      
    • 測試類

      package com.ciao.classDemo.demo01;
      public class Test {
          public static void main(String[] args) {
              //建立例項
              Student s1 = new Student("言身寸", 23);
              Student s2 = new Student("雨山夆", 23);
              //獲取例項儲存物件的型別
              Class s1Class = s1.getClass();
              Class s2Class = s2.getClass();
              //判斷是否一致
              Boolean flag = s1Class==s2Class;
              System.out.println("s1與s2型別是否一致?"+ flag);
          }
      }
      
hashCode()
  • 原始碼,返回值為int

    public int hashCode(){}

  • 返回該物件的雜湊碼值

  • 雜湊值根據物件的地址字串數字使用hash演算法計算出來的Int型別的數值

  • 一般情況下相同物件返回相同雜湊碼

    接上一個例項

    package com.ciao.classDemo.demo01;
    public class Test {
        public static void main(String[] args) {
            //建立例項
            Student s1 = new Student("言身寸", 23);
            Student s2 = new Student("雨山夆", 23);
            //獲取例項的雜湊值,int型別
            int s1Hash = s1.hashCode();
            int s2Hash = s2.hashCode();
            //判斷雜湊值是否一致
            Boolean flag2 = s1Hash==s2Hash;
            System.out.println("s1:"+s1Hash+"與s2:"+s2Hash+"是否一致?"+ flag2);
            //新建一個例項s3等於s1,發現s3的雜湊值與s1一致,指向地址一致
            Student s3 = s1;
            System.out.println(s3.hashCode());
        }
    }
    

    輸出

    s1:1735600054與s2:21685669是否一致?false
    1735600054
    
toString()
  • 原始碼

    型別為String,返回值包括類名+@+雜湊值十六進位制

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
  • 返回該物件的字串表示(表示形式,類名字+雜湊值十六進位制),可重寫該方法,變成你想要的字串形式(展示物件的各個屬性值)

    • 未重寫返回值

      程式碼

      System.out.println(s1.toString());
      System.out.println(s2.toString());
      

      輸出

      com.ciao.classDemo.demo01.Student@677327b6
      com.ciao.classDemo.demo01.Student@14ae5a5
      
    • 重寫後返回物件的各個屬性

      這裡使用快捷重寫

      @Override
      public String toString() {
          return "Student{" +
                  "name='" + name + '\'' +
                  ", age=" + age +
                  '}';
      }
      

      程式碼

      System.out.println(s1.toString());
      System.out.println(s2.toString());
      

      輸出

      Student{name='言身寸', age=23}
      Student{name='雨山夆', age=23}
      
equals()
  • 原始碼

    返回值型別為boolean值,判斷兩個物件指向的地址是否一致

    public boolean equals(Object obj) {
        return (this == obj);
    }
    
  • 可進行重寫,比較兩個值的內容是否相同

    • 未重寫,輸出為false

      package com.ciao.classDemo.demo01;
      
      public class Test {
          public static void main(String[] args) {
              //建立例項
              Student s1 = new Student("雨山夆", 23);
              Student s2 = new Student("雨山夆", 23);
              //判斷兩個內容一樣的物件是否相等
              System.out.println(s1.equals(s2));
          }
      }
      
    • 重寫後再比較,輸出為true

      @Override
      public boolean equals(Object obj) {
          //1.比較兩個引用是否指向同一個物件
          if(this==obj){
              return true;
          }
          //2.判斷obj是否是null
          if(obj == null){//非空性
              return false;
          }
          //3.判斷兩個引用指向的實際物件型別是否一致
          /*
          if(this.getClass()==obj.getClass()){}
          */
          if(obj instanceof Student){//instanceof  判斷物件是否是某種型別
              //4.強制型別轉換
              Student s = (Student) obj;
              //5.依次比較各個屬性值是否相等
              if(this.name.equals(s.getName())&&(this.age==s.getAge())){
                  return true;
              }
          }
          return false;
      }
      
  • equals()==的區別

    https://blog.csdn.net/qq_36522306/article/details/80550210

    https://www.cnblogs.com/zjc950516/p/7877511.html

finalize()
  • 原始碼

    protected void finalize() throws Throwable { }
    
  • 當物件被判定為垃圾物件時,由JVM自動呼叫此方法,以標記垃圾物件,進入回收佇列

  • 垃圾物件:沒有有效引用指向此物件時,為垃圾物件

  • 垃圾回收:由GC銷燬垃圾物件,釋放資料儲存空間

  • 自動回收機制:JVM記憶體耗盡,一次性清空所有垃圾物件

  • 手動回收機制:使用System.gc();通知JVM執行垃圾回收

  • 測試:

    • 重寫finalize()方法,使其輸出誰被回收了

      @Override
      protected void finalize() throws Throwable {
          System.out.println(this.name+"被回收了~");
      }
      
    • 被引用的物件不會被回收,未被引用的物件被回收

      package com.ciao.classDemo.demo01;
      public class Test {
          public static void main(String[] args) {
              //建立例項
              Student s1 = new Student("aaa", 1);
              Student s2 = new Student("bbb", 1);
              new Student("ccc", 1);
              //回收垃圾
              System.gc();
              System.out.println("已執行回收垃圾!");
          }
      }
      

      輸出

      com.ciao.classDemo.demo01.Test
      已執行回收垃圾!
      ccc被回收了~
      
      Process finished with exit code 0