关键字instanceof

简介: 关键字instanceof

关键字instanceof

*有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
*如何才能调用子类所特有的属性和方法?

向下转型,使用强制类型转换符


Man m1 = (Man)p2;

m1.earnMoney();

m1.isSmoking=true;


*使用强转时,可能出现ClassCastException的异常。


Woman w1=(Woman)p2;

w1.goshopping();//Exception in thread “main” java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61)


instanceof关键字的使用


a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。

使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。




  • 如果a instanceof A返回true,则a instanceof B也返回true, 其中类B是类A的父类。

在B站学习java写的代码

代码如下

PersonTestl类

package com.day0126_1;
//import java.util.Date;
public class PersonTest {
  public static void main(String[] args) {
    //有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致
    //编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
    //如何才能调用子类所特有的属性和方法?
    //向下转型,使用强制类型转换符
    Man m1 = (Man)p2;
    m1.earnMoney();
    m1.isSmoking=true;
    //使用强转时,可能出现ClassCastException的异常。
//    Woman w1=(Woman)p2;
//    w1.goshopping();//Exception in thread "main" java.lang.ClassCastException: com.day0126_1.Man cannot be cast to com.day0126_1.Womanat com.day0126_1.PersonTest.main(PersonTest.java:61)
    /*
     * instanceof关键字的使用
     *  
     * a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
     * 
     * 使用情境:为了避免在向下转型时出现ClassCastException的异常,我们在向下转型之前,先
     * 进行instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
     * 
     * 如果a instanceof A返回true,则a instanceof B也返回true,
     * 其中类B是类A的父类。
     * 
     */
    if(p2 instanceof Woman) {
      Woman w1=(Woman)p2;
      w1.goshopping();
      System.out.println("*******Woman*****");
    }
    if(p2 instanceof Man) {
      Man m2 = (Man)p2;
      m2.earnMoney();
      System.out.println("********Man******");
    }
    if(p2 instanceof Person) {
      System.out.println("******Person******");
    }
        if(p2 instanceof Object) {
      System.out.println("******Object******");
    }
        //练习:
        //问题一:编译时通过,运行时不通过
        //举例一:
//        Person p3=new Woman();
//        Man m3 =(Man)p3;
        //举例二
//        Person p4=new Person();
//        Man m4=(Man)p4;
        //问题二:编译时通过,运行时也通过
//        Object obj=new Woman ();
//        Person p=(Person)obj;
        //问题三:编译不通过
//        Man m5=new Woman();//Type mismatch: cannot convert from Woman to Man
//        String str=new Date();//Type mismatch: cannot convert from Date to String
//        Object o=new Date();
//        String str1=(String)o;
  }
}

Person类

package com.day0126_1;
public class Person {
  String name;
  int age;
  int id=1001;
  public void eat() {
    System.out.println("人:吃饭");
  }
  public void walk() {
    System.out.println("人:走路");
  }
}

Man类

package com.day0126_1;
public class Man extends Person{
  boolean isSmoking;
  int id=1002;
  public void earnMoney() {
    System.out.println("男人负责挣钱养家");
  }
  public void eat() {
    System.out.println("男人多吃肉,长肌肉");
  }
  public void walk() {
    System.out.println("男人霸气的走路");
  }
}

Woaman类

package com.day0126_1;
public class Woman extends Person{
  boolean isBeauty;
  public void goshopping() {
    System.out.println("女人喜欢购物");
  }
  public void eat() {
    System.out.println("女人少吃,为了减肥");
  }
  public void walk() {
    System.out.println("女人窈窕的走路");
  }
}
相关文章
|
网络协议 C++
websocket数据帧格式
websocket数据帧格式
371 2
|
3天前
|
SQL 人工智能 分布式计算
【产品升级】Dataphin V5.3 全新上线:四大能力升级,数据管理更统一、更智能!
V5.3版本,Dataphin推出众多重磅功能:例如,全新的智能应用:X-数据标准、X-数据安全以及智能应用反馈看板;更前沿的数据研发能力:利用SelectDB/Doris/StarRocks查询加速Hive和MaxCompute的离线引擎、全面支持Paimon格式的数据湖构建;资产运营和数据服务持续提效。全新的智能应用:X-数据标准、X-数据安全以及智能应用反馈看板;更前沿的数据研发能力:利用SelectDB/Doris/StarRocks查询加速Hive和MaxCompute的离线引擎。
110 2
|
10月前
|
安全 网络安全 网络架构
解释子网为零和全一子网:概念、原理与应用
解释子网为零和全一子网:概念、原理与应用
303 1
|
8月前
|
机器学习/深度学习 搜索推荐 PyTorch
基于昇腾用PyTorch实现传统CTR模型WideDeep网络
本文介绍了如何在昇腾平台上使用PyTorch实现经典的WideDeep网络模型,以处理推荐系统中的点击率(CTR)预测问题。
431 66
|
编解码 iOS开发 Windows
B站电脑版,原来还隐藏着这个白嫖福利|Windows如何打开heic图片?
B站电脑版,原来还隐藏着这个白嫖福利|Windows如何打开heic图片?
|
SQL 缓存 关系型数据库
MySQL 深潜 - Semijoin 丛林小道全览
作者深入内核讲述了 MySQL semijoin 从识别到优化器根据代价决定最优执行策略,以及执行方式的全过程,掌握 MySQL semijoin 这一篇就够了!
|
算法 调度
处理机(CPU)调度
处理机(CPU)调度
427 1
|
缓存 JavaScript 前端开发
WEB前端高频面试题(五)—— Vue 八股文
WEB前端高频面试题(五)—— Vue 八股文
576 0
|
监控 安全 物联网
「安全战略」2020年最新最实用的12项最佳网络安全实践
「安全战略」2020年最新最实用的12项最佳网络安全实践
|
Ubuntu 数据安全/隐私保护 虚拟化
win11使用WSL2配置Ubuntu 环境
打开cmd 输入wsl,提示我们系统不支持wsl。
533 0

热门文章

最新文章