解析java中的instanceof关键字

解析java中的instanceof关键字

1 含义

用于判断对象是否是某个类的实例(实例化对象)

2 为什么用?

2.1 分析

在向下转型时,如果不是父子类关系的,编译是可以通过的,但是运行通不过,会出现ClassCastException(类型转换)异常,我们为了规避这个问题,一般会在向下转型前进行判断,判断该对象是否是要向下转型的那个类的实例,若是,才可以进行转换,否则不能向下转换

2.2 错误示例代码

Animal01
package Work;

public class Animal01 {
    private String name;
    //姓名
    private int age;
    //年龄
    private String sex;
    //性别

    public Animal01() {
    }

    public Animal01(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void say(){
        System.out.println("动物在说话!!!");
    }
}

Cat01
package Work;
public class Cat01 extends  Animal01{
    public Cat01() {
    }

    public Cat01(String name, int age, String sex) {
        super(name, age, sex);
    }

    @Override
    public void say() {
        System.out.println("喵喵喵!!!");
    }
}

Dog01
package Work;
public class Dog01 extends Animal01{
    public Dog01() {
    }

    public Dog01(String name, int age, String sex) {
        super(name, age, sex);
    }

    @Override
    public void say() {
        System.out.println("汪汪汪!!!");
    }
}

Test
package Work;
public class Test {
    public static void main(String[] args) {
         Animal01 animal01=new Dog01("旺财",12,"雄性");
         //向下转型是想要用子类特有的属性和方法,只能是有父子关系的去进行转换
        Cat01 d=((Cat01)animal01);
    }
}

2.3 错误示例代码运行截图

在这里插入图片描述

3 如何使用instanceof关键字?

3.1 语法

对象 instanceofA//当对象是类A或者是类A的父类(直接、间接)的实例化对象(实例)时,才返回true
//否则返回false,注意匿名对象(new Dog())也是符合前面的判断规则 
//当对象所指向的空间就是类A类型时.如new Cat() instanceof Cat是true
// new Cat() instanceof Animal也是true,   

3.2 用途

3.2.1 用途1
a 内容

使用多态后,想要根据对象的不同,调用相同的方法去表现出不同形态(自己独特的)

b 示例代码
Animal01
package Work;

public class Animal01 {
    private String name;
    //姓名
    private int age;
    //年龄
    private String sex;
    //性别

    public Animal01() {
    }

    public Animal01(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public void say(Animal01 animal01){
        if(animal01 instanceof Dog01){
            //如果animal01对象是Dog01类的一个实例化对象时,就输出汪汪汪
            System.out.println("汪汪汪");
        }else if(animal01 instanceof Cat01){
            //如果animal01对象是Cat01类的一个实例化对象时,就输出喵喵喵
            System.out.println("喵喵喵");
        }
    }
}

Cat01
package Work;

public class Cat01 extends  Animal01{
    public Cat01() {
    }

    public Cat01(String name, int age, String sex) {
        super(name, age, sex);
    }
}

Dog01
package Work;
public class Dog01 extends Animal01{
    public Dog01() {
    }

    public Dog01(String name, int age, String sex) {
        super(name, age, sex);
    }
}

Test
package Work;
public class Test {
    public static void main(String[] args) {
        Animal01 test=new Animal01();
         Animal01 animal01=new Dog01("旺财",12,"雄性");
         test.say(animal01);
        Animal01 animal02=new Cat01("铃铛",8,"雌性");
        test.say(animal02);
    }
}

c 示例代码运行截图

在这里插入图片描述

3.2.2 用途2
a 内容

使用多态后,想要根据对象的不同,去执行自己特有的属性和方法(子类中有,父类中没有)

b 示例代码
Animal01
package Work;

public class Animal01 {
    private String name;
    //姓名
    private int age;
    //年龄
    private String sex;
    //性别

    public Animal01() {
    }

    public Animal01(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void action(Animal01 animal01){
        if(animal01 instanceof Dog01){
            //如果animal01对象是Dog01类的一个实例化对象时,就输出狗特有的方法
            ((Dog01)animal01).guardHourse();
        }else if(animal01 instanceof Cat01){
            //如果animal01对象是Cat01类的一个实例化对象时,就输出猫特有的方法
            ((Cat01)animal01).catchMouse();
        }
    }
}

Cat01
package Work;

public class Cat01 extends  Animal01{
    public Cat01() {
    }

    public Cat01(String name, int age, String sex) {
        super(name, age, sex);
    }
    //Cat类型特殊的方法是抓老鼠
    public void catchMouse(){
        System.out.println("名字为: "+getName()+"年龄为: "+getAge()+"性别为: "+getSex()+"的猫在捉老鼠");
    }
}

Dog01
package Work;
public class Dog01 extends Animal01{
    public Dog01() {
    }

    public Dog01(String name, int age, String sex) {
        super(name, age, sex);
    }
    //Dog类型特殊的方法是看门
    public void guardHourse(){
        System.out.println("名字为: "+getName()+"年龄为: "+getAge()+"性别为: "+getSex()+"的狗在看门");
    }
}

Test
package Work;
public class Test {
    public static void main(String[] args) {
        Animal01 test=new Animal01();
         Animal01 animal01=new Dog01("旺财",12,"雄性");
         test.action(animal01);
        Animal01 animal02=new Cat01("铃铛",8,"雌性");
        test.action(animal02);
    }
}

c 示例代码运行截图

在这里插入图片描述

3.3 记忆规则

对象 instanceof 类A,若对象指向的堆内存的开辟的空间的类型是A类型或者A类型的父类时,就返回true,否则返回false;

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值