在Java中一切的關係都是以繼承的關係存在,如果一個類在定義時沒有明確指名繼承那個類,則默認繼承Object類,實際上定義格式如下:
class Person extends Object{}
class Person
Object文件位置可在 api\index.html裡的java.lan:Object看到說明
序號 | 方法名稱 | 類型 | 描述 |
1 | public Object() | 建構 | 建構方法 |
2 | public boolean equals(Object obj) | 普通 | 物件比較 |
3 | public int hashCode() | 普通 | 取得Hash碼 |
4 | public String toString | 普通 | 物件列印時呼叫 |
class Demo{ // 定義Demo類別,實際上繼承Object類別
};
public class ObjectDemo{
public static void main(String args[]){
Demo d = new Demo() ; // 產生實體Demo物件
System.out.println("不加toString()輸出:"+d) ;
System.out.println("加上toString()輸出:"+d.toString()) ;
}
};
執行結果:
不加toString()輸出:objectdemo.Demo@6d06d69c
加上toString()輸出:objectdemo.Demo@6d06d69c
從結果可以發現加與不加toString()的輸出結果都是一樣的,也就是說物件輸出時一定會呼叫Object類別中的toString()方法列印內容。
應用stString()方法取得物件內容
class Person{ //定義Person類別
private String name ; // 定義name屬
private int age ; // 定義age屬性
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){ //覆寫toString()方法
return "姓名:" + this.name + ";年齡:" + this.age ;
}
};
public class ObjectDemo{
public static void main(String args[]){
Person per = new Person("賴小明",30) ; // 產生實體Person物件
System.out.println("物件資訊" + per) ; //列印物件呼叫toString()方法
}
};
★Object類別提供的equals()方法預設是比較地址★
物件的比較操作
class Person{
private String name ; // 定義name屬性
private int age ; // 定義age屬性
public Person(String name,int age){ //透過建構設定屬性內容
this.name = name ; //為name屬性設定值
this.age = age ; //為age屬性設定值
}
public boolean equals(Object obj){ //覆寫Object類別中的equals()方法
if(this==obj){ // 如果兩個物件的位址相等,則肯定是同一個物件
return true ; //肯定為同一對象
}
if(!(obj instanceof Person)){ // 判斷傳進來的物件是否是Person的實例
return false ; // 如果不是,則直接傳回false
}
Person per = (Person) obj ; // 將傳進來的物件向下轉型
if(per.name.equals(this.name)&&per.age == this.age){ //一個一個屬性比較,看是否相等
return true ; // 依次比較內容
}else{
return false ;
}
}
public String toString(){ //覆寫toString()方法
return "姓名:" + this.name + ";年齡:" + this.age ;
}
};
public class ObjectDemo{
public static void main(String args[]){
Person per1 = new Person("賴小明",30) ; //實例化Person
Person per2 = new Person("賴小明",30) ; // 實例化Person
System.out.println(per1.equals(per2)?"是同一人" : "不是同一個人") ;
System.out.println(per1.equals("hello")?"是同一人" : "不是同一人") ;
}
};
Object類別是所有的父類別,所有的物件都可以向Object進行轉換,其中包含陣列和介面類別型,一切的參考資料型態都可以使用Object進行接收。
Object接收介面實例
interface A{
public String getInfo(); //定義抽象方法
}
class B implements A{ //子類別實現介面
public String getInfo(){ // 覆寫介面中的抽象方法
return "Hello World!!!" ;
}
};
public class ObjectDemo04{
public static void main(String args[]){
A a = new B() ; // 物件向上轉型,為介面產生實體
Object obj = a ; // 使用Object接收,物件向上轉型
A x = (A)obj ; // 物件向下轉型
System.out.println(x.getInfo()) ;
}
};
執行結果:
Hello World!!!
Object接收陣列
public class ObjectDemo{
public static void main(String args[]){
int temp[] = {1,3,5,7,9} ; //定義陣列
Object obj = temp ; // 使用Object接收陣列
print(obj) ; //傳遞陣列參考
}
public static void print(Object o){ //接收一個物件
if(o instanceof int[]){ // 判斷物件的型態
int x[] = (int[])o ; //向下轉型
for(int i=0;i<x.length;i++){ //迴圈輸出
System.out.print(x[i] + "\t") ;
}
}
}
};
執行結果:
1 3 5 7 9
結論:
- Object類別是所有類別的父類別,只要引用數據類型都可以使用Object進行接收。
- 對象在進行向下轉型之前一定要先發生向上轉型,要使用instanceof關鍵字判斷。
- toString():對象輸出時調用。
- equals():對象比較時調用。
- String類別也是Object類別的子類別。