一 instanceof运算符
- instanceof 运算符 用于:判断 该运算符前面引用类型变量指向的对象是否是后面类,或者其子类、接口实现类创建的对象。如果是则返回true,否则返回false
- 注:instanceof前一个操作数通常是一个引用类型变量,后面一个操作数通常是一个类(接口),它用于判断前面对象是否是后面的类,或者其子类、实现类的实例。如果是,则返回true,否则返回false。
二代码示例
1 public class InstanceofTest 2 { 3 public static void main(String[] args) 4 { 5 // 声明hello时使用Object类,则hello的编译类型是Object, 6 // Object是所有类的父类, 但hello变量的实际类型是String 7 Object hello = "Hello"; 8 // String与Object类存在继承关系,可以进行instanceof运算。返回true。 9 System.out.println("字符串是否是Object类的实例:" 10 + (hello instanceof Object)); 11 System.out.println("字符串是否是String类的实例:" 12 + (hello instanceof String)); // 返回true。 13 // Math与Object类存在继承关系,可以进行instanceof运算。返回false。 14 System.out.println("字符串是否是Math类的实例:" 15 + (hello instanceof Math)); 16 // String实现了Comparable接口,所以返回true。 17 System.out.println("字符串是否是Comparable接口的实例:" 18 + (hello instanceof Comparable)); 19 String a = "Hello"; 20 // // String类与Math类没有继承关系,所以下面代码编译无法通过 21 // System.out.println("字符串是否是Math类的实例:" 22 // + (a instanceof Math)); 23 } 24 }
运行结果
字符串是否是Object类的实例:true
字符串是否是String类的实例:true
字符串是否是Math类的实例:false
字符串是否是Comparable接口的实例:true
三应用场景
下面我来模拟一个简单的应用场景,加深记忆并与同学们分享交流
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 public class Test{ 5 6 public static void main(String[] args) { 7 Object object = new Date(); 8 print(object); 9 } 10 11 public static void print(Object object) { 12 Date date = (Date) object; 13 String format = "yyyy-MM-dd HH:mm:ss"; 14 String result = new SimpleDateFormat(format).format(date); 15 System.out.println(result); 16 } 17 }
场景分析:无法保证传入print方法的实参一定为Date对象,如果传入的不是由Date或其子类创建的对象,那么以上代码就会引发“java.lang.ClassCastException”异常,这时我们可以使用instanceof运算符,用于强制类型转换之前检查对象的真实类型以避免类型转换异常,从而提高代码健壮性。
1 import java.text.SimpleDateFormat; 2 import java.util.Date; 3 4 public class Test{ 5 6 public static void main(String[] args) { 7 Object object = new String(); 8 print(object); 9 } 10 11 public static void print(Object object) { 12 if (object instanceof Date) { 13 Date date = (Date) object; 14 String format = "yyyy-MM-dd HH:mm:ss"; 15 String result = new SimpleDateFormat(format).format(date); 16 System.out.println(result); 17 }else { 18 System.out.println("请传入由Date类或其子类创建的对象。"); 19 } 20 } 21 }
参考链接:https://blog.csdn.net/qq_40831381/article/details/81288457