1.2 Object类详解
Object類概述
屬性:無
方法:equals() / toString() / getClass() /hashCode() / clone() / finalize()
wait() 、 notify()、notifyAll()
Object類只聲明了一個空參的構(gòu)造器
Object 是 Java 類庫中的一個特殊類,也是所有類的父類。也就是說,Java 允許把任何類型的對象賦給 Object 類型的變量。當(dāng)一個類被定義后,如果沒有指定繼承的父類,那么默認(rèn)父類就是 Object 類。因此,以下兩個類表示的含義是一樣的。
public class MyClass{…}等價于
public class MyClass extends Object {…}由于 Java 所有的類都是 Object 類的子類,所以任何 Java 對象都可以調(diào)用 Object 類的方法。常見的方法如表 1 所示。
| Object clone() | 創(chuàng)建與該對象的類相同的新對象 |
| boolean equals(Object) | 比較兩對象是否相等 |
| void finalize() | 當(dāng)垃圾回收器確定不存在對該對象的更多引用時,對象垃圾回收器調(diào)用該方法 |
| Class getClass() | 返回一個對象運(yùn)行時的實例類 |
| int hashCode() | 返回該對象的散列碼值 |
| void notify() | 激活等待在該對象的監(jiān)視器上的一個線程 |
| void notifyAll() | 激活等待在該對象的監(jiān)視器上的全部線程 |
| String toString() | 返回該對象的字符串表示 |
| void wait() | 在其他線程調(diào)用此對象的 notify() 方法或 notifyAll() 方法前,導(dǎo)致當(dāng)前線程等待 |
其中,toString()、equals() 方法和 getClass() 方法在 Java 程序中比較常用。
toString() 方法
toString() 方法返回該對象的字符串,當(dāng)程序輸出一個對象或者把某個對象和字符串進(jìn)行連接運(yùn)算時,系統(tǒng)會自動調(diào)用該對象的 toString() 方法返回該對象的字符串表示。
Object 類的 toString() 方法返回“運(yùn)行時類名@十六進(jìn)制哈希碼”格式的字符串,但很多類都重寫了 Object 類的 toString() 方法,用于返回可以表述該對象信息的字符串。
哈希碼(hashCode),每個 Java 對象都有哈希碼屬性,哈希碼可以用來標(biāo)識對象,提高對象在集合操作中的執(zhí)行效率。
先看以下代碼:
// 定義Demo類,實際上繼承Object類 class Demo { } public class ObjectDemo01 {public static void main(String[] args) {Demo d = new Demo(); // 實例化Demo對象System.out.println("不加toString()輸出:" + d);System.out.println("加上toString()輸出:" + d.toString());} }輸出結(jié)果為:
不加toString()輸出:Demo@15db9742 加上toString()輸出:Demo@15db9742以上的程序是隨機(jī)輸出了一些地址信息,從程序的運(yùn)行結(jié)果可以清楚的發(fā)現(xiàn),加和不加 toString() 的最終輸出結(jié)果是一樣的,也就是說對象輸出時一定會調(diào)用 Object 類中的 toString() 方法打印內(nèi)容。所以利用此特性就可以通過 toString() 取得一些對象的信息,如下面代碼。
public 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 static void main(String[] args) {Person per = new Person("歪比巴卜", 30);// 實例化Person對象System.out.println("對象信息:" + per);// 打印對象調(diào)用toString()方法} }輸出結(jié)果為:
對象信息:姓名:歪比巴卜:年齡30程序中的 Person 類中重寫了 Object 類中的 toString() 方法,這樣直接輸出對象時調(diào)用的是被子類重寫過的 toString() 方法。
equals() 方法
在前面學(xué)習(xí)字符串比較時,曾經(jīng)介紹過兩種比較方法,分別是==運(yùn)算符和 equals() 方法,
- ==運(yùn)算符是比較兩個引用變量是否指向同一個實例,
- equals() 方法是比較兩個對象的內(nèi)容是否相等,通常字符串的比較只是關(guān)心內(nèi)容是否相等。
其使用格式如下:
boolean result = obj.equals(Object o);其中,obj 表示要進(jìn)行比較的一個對象,o 表示另一個對象。
例 1
編寫一個 Java 程序,實現(xiàn)用戶登錄的驗證功能。要求用戶從鍵盤輸入登錄用戶名和密碼,當(dāng)用戶輸入的用戶名等于 admin 并且密碼也等于 admin 時,則表示該用戶為合法用戶,提示登錄成功,否則提示用戶名或者密碼錯誤信息。
在這里使用 equals() 方法將用戶輸入的字符串與保存 admin 的字符串對象進(jìn)行比較,具體的代碼如下:
import java.util.Scanner; public class Test01 {// 驗證用戶名和密碼public static boolean validateLogin(String uname, String upwd) {boolean con = false;if (uname.equals("admin") && upwd.equals("admin")) { // 比較兩個 String 對象con = true;} else {con = false;}return con;}public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.println("------歡迎使用大數(shù)據(jù)管理平臺------");System.out.println("用戶名:");String username = input.next(); // 獲取用戶輸入的用戶名System.out.println("密碼:");String pwd = input.next(); // 獲取用戶輸入的密碼boolean con = validateLogin(username, pwd);if (con) {System.out.println("登錄成功!");} else {System.out.println("用戶名或密碼有誤!");}} }上述代碼在 validateLogin() 方法中又使用 equals() 方法將兩個 String 類型的對象進(jìn)行了比較,當(dāng) uname 對象與保存 admin 的 String 對象相同時,uname.equals("admin") 為 true;與此相同,當(dāng) upwd 對象與保存 admin 的 String 對象相同時,upwd.equals("admin") 為 true。當(dāng)用戶輸入的用戶名和密碼都為 admin 時,表示該用戶為合法用戶,提示登錄成功信息,否則提示用戶名或密碼有誤的錯誤信息。
該程序的運(yùn)行結(jié)果下所示:
------歡迎使用大數(shù)據(jù)管理平臺------ 用戶名: adinm 密碼: admin 用戶名或密碼有誤! ------歡迎使用大數(shù)據(jù)管理平臺------ 用戶名: admin 密碼: admin 登錄成功!getClass() 方法
getClass() 方法返回對象所屬的類,是一個 Class 對象。通過 Class 對象可以獲取該類的各種信息,包括類名、父類以及它所實現(xiàn)接口的名字等。
例 2
編寫一個實例,演示如何對 String 類型調(diào)用 getClass() 方法,然后輸出其父類及實現(xiàn)的接口信息。具體實現(xiàn)代碼如下:
該程序的運(yùn)行結(jié)果如下:
類名:java.lang.String 父類:java.lang.Object 實現(xiàn)的接口有: interface java.io.Serializable interface java.lang.Comparable interface java.lang.CharSequence接收任意引用類型的對象
既然 Object 類是所有對象的父類,則所有的對象都可以向 Object 進(jìn)行轉(zhuǎn)換,在這其中也包含了數(shù)組和接口類型,即一切的引用數(shù)據(jù)類型都可以使用 Object 進(jìn)行接收。
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();// 對象向上轉(zhuǎn)型Object obj = a;// 對象向下轉(zhuǎn)型A x = (A) obj;System.out.println(x.getInfo());} }輸出結(jié)果為:
Hello World!!!通過以上代碼可以發(fā)現(xiàn),雖然接口不能繼承一個類,但是依然是 Object 類的子類,因為接口本身是引用數(shù)據(jù)類型,所以可以進(jìn)行向上轉(zhuǎn)型操作。
同理,也可以使用 Object 接收一個數(shù)組,因為數(shù)組本身也是引用數(shù)據(jù)類型。
public class ObjectDemo05 {public static void main(String[] args) {int temp[] = { 1, 3, 5, 7, 9 };// 使用object接收數(shù)組Object obj = temp;// 傳遞數(shù)組引用print(obj);}public static void print(Object o) {// 判斷對象的類型if (o instanceof int[]) {// 向下轉(zhuǎn)型int x[] = (int[]) o;// 循環(huán)輸出for (int i = 0; i < x.length; i++) {System.out.print(x[i] + "\t");}}} }輸出結(jié)果為:
1 3 5 7 9以上程序使用 Object 接收一個整型數(shù)組,因為數(shù)組本身屬于引用數(shù)據(jù)類型,所以可以使用 Object 接收數(shù)組內(nèi)容,在輸出時通過 instanceof 判斷類型是否是一個整型數(shù)組,然后進(jìn)行輸出操作。
提示:因為 Object 類可以接收任意的引用數(shù)據(jù)類型,所以在很多的類庫設(shè)計上都采用 Object 作為方法的參數(shù),這樣操作起來會比較方便。
總結(jié)
以上是生活随笔為你收集整理的1.2 Object类详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 1.1 Java包装类、装箱和拆箱
- 下一篇: 1.3 Integer类详解