instanceof和类型转换

目录

instanceof

作用

用法

instanceof的返回值

举个栗子

对类进行类型转换类型转换

类型转换用于类可以怎么使用

进行类的类型转换的注意点

栗子1:将子类转换为父类

栗子2:将父类转换为子类


instanceof

作用

判断两个引用类型的类型是否一致

用法

引用类型1 instanceof 引用类型2

instanceof的返回值

boolean result;
result = 引用类型1 instanceof 引用类型2

//当引用类型1的类型和引用类型2的类型相同时,返回true值
//当引用类型1的类型和引用类型2的类型不相同时,返回false值

举个栗子

public class class1 {
    public static void main(String[] args) {
        String str1 = "hello";
        int[] arr = {1, 2, 3};
        class1 c1 = new class1();
        class1 c2 = null;

        System.out.println(str1 instanceof String);    //true
        System.out.println(arr instanceof int[]);    //true
        System.out.println(c1 instanceof class1);    //true
        System.out.println(c2 instanceof class1);    //false
    }
}

可以看到在上面的代码中,分别创建了四个引用类型的变量str1、arr、c1、c2,并且分别判断了str1和String的类型是否相等、arr和int[ ]的类型是否相等、c1和class1的类型是否相等、c2和class1的类型是否相等。

判断的结果是:

  • str1和String的类型相等
  • arr和int[ ]的类型相等
  • c1和class1的类型相等
  • c2和class2的类型不相等

需要注意的是,虽然在定义中c1和c2都定义为了class1类型,但是c1指向的是一个实例化的class1类,而c2指向的是null值,并没有指向class1类。很明显,指向null值的c2必然和class1类不相等。


对类进行类型转换类型转换

类型转换用于类可以怎么使用

以下两种转换方法都是可行的:

  • 将子类转换为父类
  • 将父类转换为子类

进行类的类型转换的注意点

  • 将子类转换为父类时,会向上转型,因此进行类型转换后会丢失子类自身原有的方法
  • 将父类转换为子类时,会向下转型,此时父类可以调用子类的方法

栗子1:将子类转换为父类

//class1.java
public class class1 {
    void show() {
        System.out.println("这是父类的show方法");
    }
}

//class2.java
public class class2 extends class1 {
    void show1() {
        System.out.println("这是子类的show方法");
    }
}

//class3.java
public class class3 {
    public static void main(String[] args) {
        //创建一个子类
        class2 c1 = new class2();
        //将子类转换为父类
        class1 c2 = (class1) c1;

        //调用c1的方法
        c1.show();
        c1.show1();

        //调用c2的方法
        c2.show();
    }
}

可以看到,在main()方法中,首先创建了一个子类对象c1,之后将c1通过类型转换转换为了父类对象,并用c2表示。

此时调用两个对象,通过上面的代码可以发现,子类对象c1可以正常地调用子类的方法show1()和父类的方法show()。但是转换后的父类对象c2只能调用父类的方法而无法调用子类的方法,因此此时它的类型是父类的类型。

栗子2:将父类转换为子类

//class1.java
public class class1 {
    void show() {
        System.out.println("这是父类的show方法");
    }
}

//class2.java
public class class2 extends class1 {
    void show1() {
        System.out.println("这是子类的show方法");
    }
}

//class3.java
public class class3 {
    public static void main(String[] args) {
        //创建一个父类
        class1 c1 = new class2();
        //将父类转换为子类
        class2 c2 = (class2) c1;

        //调用c1的方法
        c1.show();

        //调用c2的方法
        c2.show();
        c2.show1();
    }
}

可以看到,在main()方法中,创建了一个父类的实例c1(对为什么可以这么创建的可以回过头去看看多态的内容),随后,通过类型转换将父类转换为子类并交给c2。

此时调用两个对象,通过上面的代码可以发现,c1只能调用show()方法,并且在实际执行时执行的是父类的show()方法(因为子类中并没有重写父类的show()方法,因此只会调用父类的show()方法)。而c2可以调用父类的show()方法以及子类的show1方法。这样便通过类型转换实现了父类对象调用子类方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值