1. 程式人生 > 其它 >Java零基礎進階篇之面向物件-Object類

Java零基礎進階篇之面向物件-Object類

技術標籤:Java學習資料純乾貨Java學習視訊教程字串javajvm程式語言object

本篇文章講解的知識點主要圍繞面向物件中的Object類,廢話不多說,只分享Java相關的乾貨!

  1. Object 類是所有 Java 類的根基類
  2. 如果在類的宣告中未使用 extends 關鍵字指明其基類,則預設基類為 Object
如:
public class User {
………..
}
相當於
public class User extends Object {
………..
}
toString() 返回該物件的字串表示。通常 toString 方法會返回一個“以文字方式表示”此物件的字串,Object
類的 toString 方法返回一個字串,該字串由類名加標記 @ 和此物件雜湊碼的無符號十六進位制表示組成,Object toString 原始碼如下: getClass().getName() + '@' + Integer.toHexString(hashCode()) 在進行 String 與其它型別資料的連線操作時,如: System.out.println(student); ,它自動呼叫該物件的 toString() 方法 【程式碼示例】
public class ToStringTest01 {

public static void main(String[] args) 
{ int i = 100; 
System.out.println(100);

Person person = new Person(); 
person.id = 200;
person.name = "張三";

//會輸出
[email protected]
//因為它呼叫了Object 中的toString 方法 //輸出的格式不友好,無法看懂 System.out.println(person); } } //class Person extends Object { //和以下寫法等同class Person{ int id; String name; }
【程式碼示例】,覆蓋 Person 中的 toString 方法
public class ToStringTest02 {

public static void main(String[] args) { Person person = new Person(); person.id = 200;
person.name = "張三";

//System.out.println(person.toString());

//輸出結果為:{id=200, name=張三}
//因為println 方法沒有帶Person 引數的
//而Person 是Object,所以他會呼叫println(Object x)方法
//這樣就是產生object 對其子類Person 的指向,而在Person 中
//覆蓋了父類Object 的toString 方法,所以執行時會動態繫結
//Person 中的toString 方法,所以將會按照我們的需求進行輸出
System.out.println(person);



}
}

//class Person extends Object { //和以下寫法等同class Person{

int id;


String name;

public String toString() {
return "{id=" + id + ", name=" + name + "}";
}
}

finalize 垃圾回收器( Garbage Collection ),也叫 GC ,垃圾回收器主要有以下特點:
  • 當物件不再被程式使用時,垃圾回收器將會將其回收
  • 垃圾回收是在後臺執行的,我們無法命令垃圾回收器馬上回收資源,但是我們可以告訴他,儘快回收資源(System.gc Runtime.getRuntime().gc()
  • 垃圾回收器在回收某個物件的時候,首先會呼叫該物件的 finalize 方法
  • GC 主要針對堆記憶體
  • 單例模式的缺點
當垃圾收集器將要收集某個垃圾物件時將會呼叫 finalize ,建議不要使用此方法,因為此方法的執行時間不確定,如果執行此方法出現錯誤,程式不會報告,仍然繼續執行
public class FinalizeTest01 {

public static void main(String[] args) { Person person = new Person(); person.id = 1000;
person.name = "張三";


//將person 設定為null 表示,person 不再執行堆中的物件
//那麼此時堆中的物件就是垃圾物件
//垃圾收集(GC)就會收集此物件
//GC 不會馬上收集,收集時間不確定
//但是我們可以告訴 GC,馬上來收集垃圾,但也不確定,會馬上來
//也許不會來person = null;

//通知垃圾收集器,來收集垃圾System.gc();
/* try {
Thread.sleep(5000);
}catch(Exception e) {
}
*/
}


}


class Person{


int id;


String name;

//此方法垃圾收集器會呼叫
public void finalize() throws Throwable 
{ System.out.println("Person.finalize()");
  }
}
== equals 方法
  • 等號“==
等號可以比較基本型別和引用型別, 等號比較的是值 特別是比較引用型別,比較的是引用的記憶體地址
public class EqualsTest01 {


public static void main(String[] args) { int a = 100;
int b = 100;

//可以成功比較
//採用等號比較基本它比較的就是具體的值System.out.println((a == b)?"a==b":"a!=b");

Person p1 = new Person(); p1.id = 1001;
p1.name = "張三";


Person p2 = new Person(); p2.id = 1001;
p2.name="張三";

//輸出為p1!=p2
//採用等號比較引用型別比較的是引用型別的地址(地址也是值)
//這個是不符合我們的比較需求的
//我們比較的應該是物件的具體屬性,如:id 相等,或id 和name 相等
System.out.println((p1 == p2)?"p1==p2":"p1!=p2");


Person p3 = p1;


//輸出為p1==p3
//因為 p1 和 p3 指向的是一個物件,所以地址一樣
//所以採用等號比較引用型別比較的是地址System.out.println((p1 == p3)?"p1==p3":"p1!=p3");

String s1 = "abc"; String s2 = "abc";
//輸出s1==s2
System.out.println((s1==s2)?"s1==s2":"s11=s2");


}
}


class Person{


int id;


String name;
}

  • 採用equals比較兩個物件是否相等
public class EqualsTest02 {

public static void main(String[] args) { String s1 = "abc";
String s2 = "abc";
// 輸 出 s1==s2 System.out.println((s1==s2)?"s1==s2":"s1=s2");

String s3 = new String("abc"); String s4 = new String("abc");
System.out.println((s3==s4)?"s3==s4":"s3!=s4");

//輸出s3 等於s4,所以確定string 的equals 比較的是具體的內容
System.out.println(s3.equals(s4)? "s3 等於s4": "s3 不等於s4");

Person p1 = new Person(); p1.id = 1001;
p1.name = "張三";

Person p2 = new Person();
p2.id = 1001;
p2.name="張三";

//輸出:p1 不等於 p2
//因為它預設呼叫的是Object 的equals 方法
//而Object 的equals 方法預設比較的就是地址,Object 的equals 方法程式碼
如下:
//	public boolean equals(Object obj) {
//	return (this == obj);
//	}
//如果不準備呼叫父類的equals 方法,那麼必須覆蓋父類的equals 方法
行為
System.out.println(p1.equals(p2)? "p1 等於p2": "p1 不等於p2");

}
}

class Person{

int id;


String name;
}
在進一步完善
public class EqualsTest03 {

public static void main(String[] args) { Person p1 = new Person();
p1.id = 1001;
p1.name = "張三";

Person p2 = new Person(); p2.id = 1001;
p2.name="張三";


System.out.println(p1.equals(p2)? "p1 等於p2": "p1 不等於p2");

}
}


class Person{


int id;


String name;

//覆蓋父類的方法
//加入我們自己的比較規則  public boolean equals(Object obj) {
if (this == obj) {
return true;
}
//確定比較型別為person
//同一型別,才具有可比性if (obj instanceof Person) {
//強制轉換,必須實現知道該型別是什麼
Person p = (Person)obj;
//如果id 相等就認為相等
if (this.id == p.id) { return true;
}
}
return false;
}


}
以上輸出完全正確,因為執行了我們自定義的 equals 方法,按照我們的規則進行比較的,注意instanceof 的使用,注意強制轉換的概念。將父類轉換成子類叫做“ 向下轉型 (造型)”,向下造型是不安全的。“ 向上轉型 (造型)”是安全,子類轉換成父類,如:將 Student 轉成 Person,如 Dog 轉成動物。

以上就是Object類相關的知識點了,正在學習Java的同學們一定要持續關注哦~~