instanceof 針對實例
isAssignableFrom針對class對象
isAssignableFrom 是用來判斷一個類Class1和另一個類Class2是否相同或是另一個類的超類或接口。
通常調用格式是
Class1.isAssignableFrom(Class2)
調用者和參數都是 java.lang.Class 類型。
而 instanceof 是用來判斷一個對象實例是否是一個類或接口的或其子類子接口的實例。
格式是:
oo instanceof TypeName
第一個參數是對象實例名,第二個參數是具體的類名或接口名,例如 String,InputStream。
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
System.out.println(list instanceof List);
System.out.println(list instanceof ArrayList);
/* System.out.println(list.getClass());
System.out.println(List.class);
System.out.println(ArrayList.class);*/
System.out.println(list.getClass().isAssignableFrom(List.class));
System.out.println(List.class.isAssignableFrom(list.getClass()));
}
}
結果:
true
true
false
true
其中instanceof是子-->父
isAssignableFrom是父-->子
我們應該儘量少用instanceof 運算符
應該儘量用多態來替代它
public interface Accounts {
}
public class WaterAccounts implements Accounts {
}
public class ElectricityAccounts implements Accounts {
}
//客戶端
public class test {
public static void main(String[] args) {
Accounts accsWater = new WaterAccounts();
Accounts accsElectricity = new ElectricityAccounts();
acceptAcounts(accsWater);
}
// 第一種使用instanceof
public static void acceptAcounts(Accounts accs) {
if (accs instanceof WaterAccounts) {
System.out.println("收水費");
} else if (accs instanceof ElectricityAccounts) {
System.out.println("收電費");
}
}
// 第二種使用多態
public static void acceptAcounts(WaterAccounts accs) {
System.out.println("收水費");
}
public static void acceptAcounts(ElectricityAccounts accs) {
System.out.println("收電費");
}
}