更新時間:2022-12-21 12:15:16 來源:動力節點 瀏覽6091次
Java判斷對象類型的方法是什么?動力節點小編來告訴大家。
關鍵字instanceof
不僅可以判斷對象是否是某個類的實例
甚至連該類繼承的基類和實現的接口也都能夠被識別為true
public static void main(String args[]) {
Object i = new Integer(7);
if (i instanceof Number) {
System.out.println("Integer i is a Number");
} else {
System.out.println("Integer i isn't a Number");
}
if (i instanceof Serializable) {
System.out.println("Integer i is a Serializable");
} else {
System.out.println("Integer i isn't a Serializable");
}
if (i instanceof Integer) {
System.out.println("Integer i is an Integer");
} else {
System.out.println("Integer i isn't an Integer");
}
if (i instanceof Float) {
System.out.println("Integer i is a Float");
} else {
System.out.println("Integer i isn't a Float");
}
}
類定義為:
public abstract class Number implements java.io.Serializable {}
public final class Integer extends Number implements Comparable<Integer> {}
運行結果:
Integer i is a Number
Integer i is a Serializable
Integer i is an Integer
Integer i isn't a Float
根據結果可知:雖然instanceof在邏輯上沒有任何問題,是可以把Integer當做一個Number來看來用,也當做一個Serializable來看來用,但是這樣返回的結果就沒有針對性了,太過于模糊,如果僅僅需要i instanceof Integer為true該怎么做呢?
Java有一個叫做Class的類,這是一個用來描述類信息的類,我們如果要精確判斷一個對象是否是具體的一個類的實例,可以這么做:
public static void main(String[] args) {
Object i = new Integer(7);
if (i.getClass().equals(Number.class)) {
System.out.println("Integer i is a Number");
} else {
System.out.println("Integer i isn't a Number");
}
if (i.getClass().equals(Serializable.class)) {
System.out.println("Integer i is a Serializable");
} else {
System.out.println("Integer i isn't a Serializable");
}
if (i.getClass().equals(Integer.class)) {
System.out.println("Integer i is an Integer");
} else {
System.out.println("Integer i isn't an Integer");
}
if (i.getClass().equals(Float.class)) {
System.out.println("Integer i is a Float");
} else {
System.out.println("Integer i isn't a Float");
}
}
運行結果:
Integer i isn't a Number
Integer i isn't a Serializable
Integer i is an Integer
Integer i isn't a Float
這樣就能達到我們的目的了,從equals函數上就可以看出,上述代碼是比較兩個類的類信息是否一致,全相等,這其中不考慮繼承父類、實現接口的關系,當且僅當該對象是要比較的那個類的實例才返回true。
查看源代碼發現,equals函數用的就是Object中的方法,沒有重寫:
public boolean equals(Object obj) {
return (this == obj);
}
由此可知:
無論我們用Integer實例化多少個對象,當我們調用getClass()方法時返回的總是同一個類對象,即Integer.class。所以上面的i.getClass().equals(Number.class) 和 i.getClass == Number.class 是等價的。事實上每個類都會有且只有一個對應Class的對象,我們正是用這個Class對象來實例化該類的所有對象的,也就是Class中的newInstance()方法。
如果想獲取更多有關于對象i的類型信息呢?比如獲取它的基類呢?Class的對象中還有些方法用于獲取父類、實現接口、類型名稱的方法:
獲取父類的類型信息:getSuperclass()
獲取實現的接口的類型信息:getInterfaces()
獲取類型名稱:getName()、getSimpleName()、getCanonicalName()
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習