菜雞的Java筆記 Object 類
Object 類
Object類 的主要作用
Object 類的常用方法
內容
雖然有了物件的向上轉型,可以解決了引數的統一問題,但是面對JAVA 開發之中如此眾多的開發類
所以現在就面臨這樣一個問題:引數型別怎麼選擇才能夠儲存所以的類物件呢?
為此java裡面考慮到了此種情況有一個Object類
此類定義:public class Object
可以發現在整個對的java裡面只有Object 類的定義的時候沒有定義父類,而其他的所有類都是Object類的子類
也就是說在整個java之中,除了Object類之外,一切都存在有繼承關係
理論上定義一個類的時候如果沒有繼承任何的父類,那麼其將預設繼承Object類
這樣的直接好處就是,所以類的物件都可以使用Object來接收
範例:利用Object接收物件
class Person{ } public class objectclass{ public static void main(String args[]){ Object obj = new Person();// 向上轉型 } }
利用Object可以實現最終的引數型別的統一
清楚了 Object 類的作用之後,下面要完善一些操作:
在簡單java類的時候需要提供有一個 getInfo() 的方法以返回物件資訊
在進行簡單java類物件比較的時候準備有一個 compare() 方法進行比較
那麼從現在開始以上的這兩個方法需要換名,在 Object 類裡面定義有一下的兩個匹配方法
取得物件資訊: public String toString()
物件比較: public boolean equals(Object obj);
取得物件資訊
如果說現在直接輸出一個物件,預設輸出的是一個物件的地址編碼
範例:觀察預設的 toString
class Person{ } public class objectclass{ public static void main(String args[]){ Person p = new Person(); System.out.println(p); System.out.println(p.toString); } }
通過此程式碼可以發現,在預設情況下如果要輸出一個物件都會執行 toString()方法,不管是否顯式呼叫此方法
於是 Object 類對於此方法就有了一個自己的預設實現,雖然不知道每個物件輸出時都需要那些,但是至少知道每個物件存在都會有一個地址編碼
所以預設的輸出內容就是物件的編碼資訊
如果使用者現在不希望輸出編碼,而希望輸出具體的內容,則可以進行方法的覆寫
範例:覆寫 toString() 方法
class Person{ private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public String toString(){ return "姓名:"+this.name+";年齡:"+this.age; } } public class objectclass{ public static void main(String args[]){ // 為了方便模擬化呼叫 Person p = new Person("楓",20); System.out.println(p); } }
物件比較:equals()
物件比較在之前曾經使用過compare()方法進行表示,而且最為重要的是在之前實現物件比較時比較的流程:地址是否為空,屬性是否相同
範例:實現物件比較
class Person{ private String name; private int age; public Person(String name,int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ if(this == obj){// 地址相同 return true; } if(obj == null){ // 沒得比 return false; } if(!(obj instanceof Person)){ return false;// 兩個物件沒關係 } Person per= (Person)obj; if(this.name.equals(per,name)&&this.age == per.age){ return true; } return false; } public String toString(){ return "姓名:"+this.name+";年齡:"+this.age; } } public class objectclass{ public static void main(String args[]){ // 為了方便模擬化呼叫 Person p1 = new Person("楓",20); Person p2 = new Person("楓",20); System.out.println(p2); // 有BUG 如果傳進來的是字串就會出錯,所以以後有判斷就..... } }
以後開始,所編寫物件比較操作,都以 Object 類的 equals()方法為主
Object 類可以接收一切引用型別
java的引用型別包含:陣列,類,介面。現在已經證明了所有的類物件都可以使用 Object 進行接收
可是陣列和介面,他們也可以被 Object接收
範例:利用 Object接收陣列物件
public class objectclass{ public static void main(String args[]){ Object obj = new int[]{1,2,3};//利用Object接收整型陣列,向上轉型 if(obj instanceof int[]){ // 物件是否是int陣列 int data[] = (int[])obj;//向下轉型 for(int x = 0;x<data.length;x++){ System.out.println(data[x]); } } } }
除了可以接收陣列之外,介面也可以接收
範例:輔助概念
interface A{// 定義了一個介面 public void ptintA(); } interface B{ public void ptintB(); } class X implements A,B{ public void ptintA(){ System.out.println("AAAAAAAAAAAAAAA"); } public void ptintB(){ System.out.println("BBBBBBBBBBBBBBBB"); } } public class Interface{ public static void main(String args[]){ A a = new X();//向上轉型 B b = (B)a;// 雖然A與B沒有關係,但是X是B的子類 b.ptintB(); } }
按照以上的思路解決Object 接收介面物件的問題
interface A{// 定義了一個介面 public void ptintA(); } class X equals Object implements A{ public void ptintA(){ System.out.println("AAAAAAAAAAAAAAA"); } } public class Interface{ public static void main(String args[]){ A a = new X();//向上轉型 Object obj = a;// 向上轉型 A temp = (A)obj; // 向下轉型 temp.ptintA(); } }
Object 所有引用型別都可以接收,對於 資料的統一性操作上更加方便了
總結
1.Object類是所有類的父類,可以接收所以引用資料型別
2.Object類提供的 toString()與 equals()方法可以應用在簡單java類中