Object類
- 超類、基類,所有類的直接或間接父類,位於繼承樹的最頂層
- 任何類,如沒有書寫extends顯示繼承某個類,都默認直接繼承Object類,否則爲間接繼承
- Object類中所定義的方法,是所有對象都具有的方法
- Object類型可以存儲任何對象:
作爲參數,可以接受任何對象
作爲返回值,可返回任何對象
getClass()方法
- public final Class<?> getClass(){}
- 返回引用中存儲的實際對象類型
- 應用:通常用於判斷兩個引用中實際存儲對象類型是否一致
public class TestMethodForGetClass {
public static void main(String[] args) {
Animal[] as = new Animal[] {new Dog(),new Cat()};
//判斷數組中兩個對象的真實類型是否相同
/*
if(as[0] instanceof Dog) {
if(as[1] instanceof Dog) {
System.out.println("兩個都爲Dog對象");
}
}
if(as[0] instanceof Cat){
if(as[1] instanceof Cat) {
System.out.println("兩個都爲Cat對象");
}
}*/
System.out.println(as[0].getClass()==as[1].getClass());//獲取引用中的真實類型
}
}
class Animal{
}
class Dog extends Animal{}
class Cat extends Animal{}
hashCode()方法
- public int hashCode(){}
- 返回該對象的十進制的哈希碼值
- 哈希算法根據對象的地址或字符串或數字計算出來的int類型的數值
- 哈希碼並不唯一,可保證相同對象返回相同哈希碼,儘量保證不同對象返回不同哈希碼
public class TestMethodForHashCode {
public static void main(String[] args) {
Teacher t1 = new Teacher();
System.out.println(t1.hashCode());
}
}
class Teacher{}
toString方法
- public String toString(){}
- 返回該對象的字符串表示(表現形式)
- 可以根據程序需求覆蓋該方法,如:展示對象各個屬性值
public class TestMethodForToString {
public static void main(String[] args) {
Fish fish = new Fish();
System.out.println(fish.toString());
System.out.println(fish);//打印對象,實質打印就是該對象的toString()的結果
//打印出對象的結果後的數字由哈希碼產生,由十進制的哈希碼轉換爲十六進制的數值
//getClass()獲得對象的真實類型+@+十六進制哈希碼
System.out.println(fish.getClass().getName()+"@"+Integer.toHexString(fish.hashCode()));
}
}
class Fish{}
public class TestMethodForToString1 {
public static void main(String[] args) {
Worker w1 = new Worker();
w1.name="kunyan";
w1.age =12;
w1.sex ="女";
w1.salary=8000;
//System.out.println(w1.name+"\t"+w1.age+"\t"+w1.sex+"\t"+w1.salary);
//若創建很多工人對象,每一個都需要輸出,則輸出語句重複寫很多遍
System.out.println(w1);
}
}
class Worker{
String name;
int age;
String sex;
double salary;
@Override
public String toString() {
return name + "\t" + age +"\t" + sex + "\t" + salary;
}
}
equals()方法
- public boolean equals(Object obj){}
- 默認實現爲(this==obj),比較兩個對象地址值是否相同
- 可進行覆蓋,比較兩個對象的內容是否相同
比較地址不同,但內容相同的對象需要覆蓋。
public class TestMethodForEquals {
public static void main(String[] args) {
Student s1 = new Student("kunyan",20,"female",100);
Student s2 = new Student("kunyan",20,"female",100);
System.out.println(s1==s2);
//有==判斷地址值是否相等,仍用equals
//字符串String類型中equals和==結果不一樣,equals比內容,覆蓋equals方法
System.out.println(s1.equals(s2));//爲返回true
}
}
class Student{
String name;
int age;
String sex;
double score;
public Student(String name, int age, String sex, double score) {
super();
this.name = name;
this.age = age;
this.sex = sex;
this.score = score;
}
public boolean equals(Object obj) {//比較內容
//1.比較兩個對象的地址是否一樣
if(this == obj) {
return true;
}
//2.確認對象不爲null
if(obj== null) {
return false;
}
//3.確認類型,但是值爲null報錯NullPointerExption
if(this.getClass() != obj.getClass()) {
return false;
}
//4.轉型,傳入進的參數是子類,但前提需要確認是否爲Student
Student stu = (Student)obj;//想獲取子類屬性,則需要將父類參數轉箱,轉爲子類類型
//5.比較內容
if(this.name.equals(stu.name) && this.age==stu.age && this.sex.equals(stu.sex) && this.score == stu.score) {//此處應爲equals,若傳的屬性爲引用類型則用==又是比較地址,內容無法確定相同
return true;
}
return false;
}
}
class MyObject{
public boolean equals(Object obj) {
return(this == obj);
}
}
finalize()方法
- 當對象被判爲垃圾對象時,由JVM自動給調用此方法,用以標記垃圾對象,進入回收隊列。
- 垃圾對象:沒有有效引用指向此對象時,爲垃圾對象
- 垃圾回收:由GC銷燬垃圾對象,釋放數據存儲空間。
- 自動回收機制:JVM的內存耗盡,一次性回收所有垃圾對象。
- 手動回收機制:使用System.gc();通知JVM執行垃圾回收。
public class TestFinalize {
public static void main(String[] args) {
System.out.println("程序開始");
Student s1 = new Student();
s1 = null;
System.gc();//手工觸發垃圾收集的工作
System.out.println("程序結束");
}
}
class Student{
@Override
protected void finalize() throws Throwable {
// TODO Auto-generated method stub
super.finalize();//不要改
System.out.println("Student finalize() Executed");
}
}