Java-Object類
阿新 • • 發佈:2022-03-16
-
Object類
-
Object 是類層次結構的根類,每個類都使用Object 作為父類(超類)
-
所有物件(包括陣列)都實現這個類的方法
-
它具備所有物件都具備的共同內容
-
-
Object類位於哪個包下
-
類Object 在java.lang包下
-
知識點2-Object類中的方法
- Object類中toString方法: public String toString()
-
Course類中重寫Object的toString()方法
-
Object類中equals方法: public boolean equals(Object obj)
-
Object類中定義了equals方法【public boolean equals(Object obj) 】,用來比較兩個物件的虛地址,如果虛地址相同則返回true,否則返回false;
-
Object類中hashCode方法: public int hashCode()
-
兩個引用的虛地址相同時,hashCode返回相同的值,否則返回不同的值
package com.tjetc.myobject;public class Course {
private String name;
private double score;
public Course(String name, double score) {
this.name = name;
this.score = score;
}//列印name和score的值
//方案1:System.out.println()列印拼接物件屬性值,重複程式碼多
//方案2:重寫toString()方法,直接列印物件,程式碼不會重複寫(方案好)
@Override
public String toString() {
return "Course{" +
"name='" + name + '\'' +
", score=" + score +
'}';
}
//重寫equals和hashcode 有個原則
//1、equals和hashcode要同時重寫
//2、重寫的結果:兩個物件比較 equals返回true,hashcode返回必須是true
// 兩個物件比較 hashcode返回true,equals返回的不一定是true(可以是true也可以false)
//平常只判斷兩個物件相等,使用equals方法,不使用hashcode,
//在集合類中,判斷兩個物件對相等,優先是有hashcode,如果hashcode能判斷false結果,就不用呼叫equals方法,hashcode返回true的時 然後才使用equals
//一般情況下,java會大量使用集合,所以要符合集合判斷兩個物件相等的邏輯
//重寫hashcode,依據Course的name
@Override
public int hashCode() {
return this.name.hashCode();
}
//重寫equals可以按照業務特殊需求來定製的判斷是否相等
//但是 == 沒法定製,就是判斷2個物件的地址是否相等
@Override
public boolean equals(Object o) {
//引數o 表示傳進來的物件 ,本類物件的引用this比較
//需求:業務上提個要求,兩個課程如果名稱一樣,就認為是相等
if (o == null) { //null直接返回false
return false;
} else if (!(o instanceof Course)) { //傳進來的物件不是Course類的物件,返回false
return false;
} else {
//判斷物件的name字串是否相等
if (this.name == ((Course) o).name) {
return true;
} else {
return false;
}
}
}
public static void main(String[] args) {
//建立2個課程物件
Course c1 = new Course("java", 90);
Course c2 = new Course("java", 90);
//列印物件,呼叫toString方法(Object的toString)
System.out.println(c1);
System.out.println(c2);
//物件的toString方法
System.out.println("========================");
//Object的toString方法
//System.out.println(c1.toString());
//System.out.println(c2.toString());
System.out.println("=================物件相等==================");
Course c3 = c1; //把c1的地址值賦給c3
//判斷2個物件的地址值是否相等,使用==判斷物件相等並沒有呼叫equals方法,==表示判斷2個物件的地址值是否相等
System.out.println(c1 == c2); //false
System.out.println(c1 == c3); //true
System.out.println("==================equals================");
//Object的equals就是比較2個物件的地址值是否相等
//System.out.println(c1.equals(c2)); //false
//重寫了Course 的equals方法(只要name相等就是認為是相等)
System.out.println(c1.equals(c2)); //true
System.out.println(c1.equals(c3)); //true
System.out.println("=================hashcode=======================");
System.out.println(c1.hashCode());
System.out.println(c2.hashCode());
System.out.println(c3.hashCode());
System.out.println(Integer.toHexString(c2.hashCode()));
}
}
-
finallize方法(瞭解)
-
Java 技術允許使用finalize() 方法在垃圾收集器將物件從記憶體中清除出去之前,做必要的清理工作。這個方法是由垃圾收集器在確定個物件沒有被引用時對這個物件呼叫的。它是在Object 類中定義的,因此所有的類都繼承了它。子類覆蓋finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除物件之前對這個物件呼叫的。