一、基本介紹
Java中有兩種常用的類型比較方法:isAssignableFrom與instanceof,它們都可以用來判斷一個Java對象是否是一個類或接口的實例。它們的共同點是都可以進行類型比較,但是它們的使用場景和一些區別也需要我們認真了解。
二、isAssignableFrom的使用
isAssignableFrom是Class類中的方法。isAssignableFrom方法的作用是判定是否為某個類的父類,即判斷是否可以從參數類型轉換到調用方法的類的類型。
public boolean isAssignableFrom(Class cls)
例如:
Object obj = new String(); Class clz = String.class; boolean bool1 = clz.isAssignableFrom(obj.getClass()); //true boolean bool2 = obj.getClass().isAssignableFrom(clz); //false
在這個例子中,我們可以看到Class String和Object之間的繼承關係。由於String是Object的子類,所以String可以賦值給Object類型的變量。這也是為什麼bool1返回true的原因。
bool2是false的原因是因為String不能被賦值給Class Object。String是Class String的一個實例,而Class Object是Class String的父類,所以bool2是false。
三、instanceof的使用
instanceof是java關鍵字,它用來判斷一個對象是否是一個類的實例,或者是該類及其子類的實例。
Object obj = new String(); boolean bool1 = obj instanceof String; //true boolean bool2 = obj instanceof Object; //true boolean bool3 = obj instanceof Integer; //false
在這個例子中,我們可以看到obj是一個String的實例,所以bool1是true。由於String是Object的子類,而obj是String和Object的共同祖先Object的子類,所以bool2是true。由於obj不是一個Integer類型,所以bool3是false。
四、isAssignableFrom和instanceof的區別
雖然isAssignableFrom和instanceof都可以用來進行類型比較,但是它們的使用場景和實現方式是不同的。
1. 使用場景:
isAssignableFrom一般用來進行類型轉換,判斷一個類型是否可以轉換成另外一個類型。
Class clazz = String.class; Object obj = clazz.newInstance(); if(clazz.isAssignableFrom(obj.getClass())){ String str = (String)obj; //轉換成功 }
而instanceof一般用來判斷一個類的實例是否為另外一個類或者接口的實例。
Object obj = new String(); if(obj instanceof String){ String str = (String)obj; //類型判斷通過 }
2. 原理實現:
isAssignableFrom的實現方式:判斷調用方是否是參數的父類或者實現的接口。
public boolean isAssignableFrom(Class cls) { return (cls != null) && (cls.isSubclassOf(this) || this == cls); }
instanceof的實現方式:使用Java虛擬機中的checkcast指令。
Object obj = new String(); if(obj instanceof String){ String str = (String)obj; } //上面的代碼大致相當於 String str = (String)obj; //Java虛擬機在執行這行代碼時會執行類似於下面這樣的指令 if(!obj.getClass().isInstance(str)){ throw new ClassCastException(); }
五、總結
雖然isAssignableFrom和instanceof都是用於Java類型比較的,但是它們是有區別的。isAssignableFrom主要用於判斷一個類是否是另外一個類或者接口的父類,而instanceof主要用於判斷一個對象是否為一個類或者其子類的實例。需要根據具體情況選擇合適的類型比較方法。
原創文章,作者:LOBYX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/370366.html