JAVA 中的 instanceof 用法

叁歲伎倆 2024-03-31 13:20 181阅读 0赞

JAVA 中的 instanceof 用法

instanceof 概念在多态中引出,因为在多态发生时,子类只能调用父类中的方法(编译时类型的方法),而子类自己独有的方法(运行时类型的方法)无法调用,如果强制调用的话就需要向下转型,语法和基本类型的强制类型转换一样。

但是向下转型具有一定的风险,很有可能无法成功转化,为了判断能否成功转化,就需要 instanceof 先进行一个判断,然后再进行转换操作。

instanceof 基本介绍

instanceof 是一个运算符,语法为:

  1. 引用类型变量(object) instanceof 类(class)

< 功能 >

**判断前面的对象是否属于后面的类,或者属于其子类,**如果是,返回 true,不是返回 false

< 注意事项 >

使用 instanceof 时需要保证,instanceof 前面的引用变量编译时的类型要么与后面的类型相同,要么与后面的类型具有父子继承关系,例如:

  1. Object test = "Hello"; // test实际类型是String,但是Object是所有类的父类
  2. System.out.println(test instanceof Object); // 返回true ,因为test编译时时Object类,test可以是Object类实例
  3. System.out.println(test instanceof String); // 返回true ,因为Object是String的父类,test可以是String类的实例
  4. System.out.println(test instanceof Math); // 返回false ,因为Object是Math的父类,但是test不是Math类的实例
  5. // 不符合instanceof语法规则:
  6. String test02 = "Hello"; // test02是String类
  7. System.out.println(test02 instanceof Math); // 编译出错,String类和Math类无继承关系

其实对于 instanceof 可以理解为:什么什么…是否是…什么什么

下面看一个测试代码:

  1. // 抽象一个人类作为父类
  2. class Person {
  3. String name;
  4. public void classes() {
  5. }
  6. public void doWork() {
  7. }
  8. }
  9. // 学生类
  10. class Students extends Person {
  11. Students(String myName) {
  12. this.name = myName;
  13. }
  14. // 子类重写父类方法,覆盖了父类方法
  15. public void classes() {
  16. System.out.println(this.name + "在听课");
  17. }
  18. // 子类重写父类方法,覆盖了父类方法
  19. public void doWork() {
  20. System.out.println(this.name + "在写作业");
  21. }
  22. // 子类独有方法
  23. public void playing() {
  24. System.out.println(this.name + "在玩游戏");
  25. }
  26. }
  27. // 老师类
  28. class Teachers extends Person {
  29. Teachers(String myName) {
  30. this.name = myName;
  31. }
  32. // 子类重写父类方法,覆盖了父类方法
  33. public void classes() {
  34. System.out.println(this.name + "在上课");
  35. }
  36. // 子类重写父类方法,覆盖了父类方法
  37. public void doWork() {
  38. System.out.println(this.name + "在改作业");
  39. }
  40. // 子类独有方法
  41. public void shopping() {
  42. System.out.println(this.name + "在逛街");
  43. }
  44. }
  45. public class PolymorphismTest02 {
  46. public static void main(String[] args) {
  47. //此处发生多态
  48. Person s = new Students("张三");
  49. Person t = new Teachers("李四");
  50. s.classes();
  51. s.doWork();
  52. // 无法调用students特有的方法,这时需要向下转型
  53. //s.playing();
  54. trans(s);
  55. // 同理Teachers
  56. t.classes();
  57. t.doWork();
  58. trans(t);
  59. }
  60. // 这个函数能很好的体现出为什么需要用instancof,
  61. // 因为你不能确定传入函数的参数到底是Teachers还是Students
  62. public static void trans(Person p) {
  63. if (p instanceof Students) {
  64. Students s2 = (Students)p;
  65. // 通过向下转型便可以调用Students特有方法了
  66. s2.playing();
  67. }
  68. else if (p instanceof Teachers) {
  69. Teachers t2 = (Teachers)p;
  70. t2.shopping();
  71. }
  72. }
  73. }

输出:

  1. 学生在听课
  2. 学生在写作业
  3. 学生在玩游戏
  4. 老师在上课
  5. 老师在改作业
  6. 老师在逛街

看完这个代码,你应该明白为什么需要 instanceof 了吧;

因为在实际开发中,如果需要向下转型的话,你无法保证你所要转换的可以成功,所以一定要记住:

只要是向下转型,一定要先用 instanceof 判断,再进行转换!!!!切记

这样你的代码就不会出现各种奇怪的 bug 了,这也是一个优秀的程序员应该掌握的。

总结

instanceof 总的来说就是在向下转型中必须使用的,可以保证自己代码的健壮性;

所以向下转型步骤是:

  1. 先判断(instanceof)
  2. 再转换(type)

发表评论

表情:
评论列表 (有 0 条评论,181人围观)

还没有评论,来说两句吧...

相关阅读

    相关 javainstanceof

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一

    相关 javainstanceof

    1. java 中的instanceof介绍: 首先,java 中的instanceof是一个运算符,而且是二目运算符,即有两个操作数。该运算符是用来在运行时指出对象是否是特

    相关 javainstanceof

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一

    相关 javainstanceof

    Java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一