instanceof 与isAssignableFrom(转)
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("收电费");
- }
- }