Java_Object类
3.2、Object類(重點)
???????? 在Java的定義之中,除了Object類之外,所有的類實際上都存在繼承關系,即:如果現在定義了一個類,沒有默認繼承任何一個父類的話,則默認將繼承Object類,以下兩種類的最終定義效果是完全一樣的。
| class Person {} | class Person extends Object {} |
???????? 那么按照這樣的方式理解,即:Object類可以接收所有類的實例化對象。
| class Person {} public class TestDemo { ???????? public static void main(String args[]) { ?????????????????? Object obj = new Person() ; ?????????????????? Person per = (Person) obj ; ???????? } } |
???????? 如果在日后的開發之中,一個操作可能接收所有類的對象,那么使用Object作為參數最合適。
???????? 除此之外,對于任意的一個簡單Java類而言,理論上講應該覆寫Object類之中的三個方法:
?????????????????? · 取得對象信息:public String toString();
?????????????????? · 對象比較:public boolean equals(Object obj);
?????????????????? · 取得哈希碼:public int hashCode()。
3.2.1 、取得對象信息:toString()
???????? 在之前提示過,如果說現在一個對象直接輸出,那么默認情況下輸出的是一個對象的地址。
| class Person {} public class TestDemo { ???????? public static void main(String args[]) { ?????????????????? Person per = new Person() ; ?????????????????? System.out.println(per) ;??????? // Person@ 1f 6226 ?????????????????? System.out.println(per.toString()) ; // Person@ 1f 6226 ???????? } } |
???????? 現在可以清楚地方發現,如果直接輸出一個類的對象,那么和這個對象調用toString()方法的結果是完全一樣的,那么就可以得出一個結論:對象直接輸出默認調用了Object類之中的toString()方法,但是默認的toString()方法有一個特點:為了適用于所有的子類,那么在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 TestDemo { ???????? public static void main(String args[]) { ?????????????????? Person per = new Person("張三",20) ; ?????????????????? System.out.println(per) ;??????? // Person@ 1f 6226 ???????? } } |
3.2.2 、對象比較:equals()
???????? 實際上對于equals()方法應該并不陌生了,這個方法在String類中見過,String是Object類的子類,所以String類的equals()方法就是覆寫了Object類中的equals()方法,在Object類之中,默認的equals()方法實現比較的是兩個對象的內存地址數值,但是并不符合于真正的對象比較需要。對象比較之前也寫過,但是之前是自己定義了一個新的方法名稱,今天可以給出標準的方法名稱:equals()。
| 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 boolean equals(Object obj) { ?????????????????? if (this == obj) { ??????????????????????????? return true ; ?????????????????? } ?????????????????? if (obj == null) { ??????????????????????????? return false ; ?????????????????? } ?????????????????? if (! (obj instanceof Person)) {??????? // 不是本類對象 ??????????????????????????? return false ; ?????????????????? } ?????????????????? // 因為name和age屬性是在Person類中定義,而Object類沒有 ?????????????????? Person per = (Person) obj ; ?????????????????? if (this.name.equals(per.name) && this.age == per.age) { ??????????????????????????? return true ; ?????????????????? } ?????????????????? return false ; ???????? } } public class TestDemo { ???????? public static void main(String args[]) { ?????????????????? Person per1 = new Person("張三",20) ; ?????????????????? Person per2 = new Person("張三",20) ; ?????????????????? System.out.println(per1.equals("Hello")) ; ?????????????????? System.out.println(per1.equals(per2)) ; ???????? } } |
3.2.3 、使用Object接收所有的引用數據類型
???????? Object是所有類的父類,那么Object類可以接收所有類的對象,但是在Java設計的時候,考慮到引用數據類型的特殊性,所以Object類實際上是可以接收所有引用數據類型的數據,這就包括了數組、接口、類。
范例:使用Object類接收數組,數組和Object沒有任何明確的定義關系
| public class TestDemo { ???????? public static void main(String args[]) { ?????????????????? Object obj = new int [] {1,2,3} ;???? // 接收數組 ?????????????????? if (obj instanceof int []) { ??????????????????????????? int [] data = (int []) obj ;???????? // 向下轉型 ??????????????????????????? for (int x = 0 ; x < data.length ; x ++) { ???????????????????????????????????? System.out.println(data[x]) ; ??????????????????????????? } ?????????????????? } ???????? } } |
范例:接收接口對象,從接口定義而言,它是不能去繼承一個父類的,但是由于接口依然屬于引用類型,所以即使沒有繼承類,也可以使用Object接收。
| interface Message { } class MessageImpl implements Message {??????? // 定義接口子類 ???????? public String toString() { ?????????????????? return "New Message : Hello World ." ; ???????? } } public class TestDemo { ???????? public static void main(String args[]) { ?????????????????? Message msg = new MessageImpl() ;????? // 向上轉型 ?????????????????? Object obj = msg ;??????? // 使用Object接收接口對象,向上轉型 ?????????????????? Message temp = (Message) obj ;??? // 向下轉型 ?????????????????? System.out.println(temp) ;???? // toString() ???????? } } |
???????? 從代碼上講,以上只能算是一個固定的操作概念,不過從實際來講,因為有了Object類的出現,所以的操作的數據就可以達到統一,那么之前的鏈表程序,就應該變的很方便了,所有的數據都使用Object接收,所有的對象比較(刪除、查找)都可以使用equals()。
轉載于:https://www.cnblogs.com/guwenren/archive/2013/04/12/3016934.html
總結
以上是生活随笔為你收集整理的Java_Object类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp.net用户登录 用户验证
- 下一篇: 平衡二叉树(AVL)--查找、删除、插入