Java 面向对象:instanceof和类型转换的理解

Java 面向对象:instanceof和类型转换的理解

一、instanceof

1.定义:

instanceof A 判断一个引用所指向的对象,是否是A类型,或者A的子类

instanceof 的格式:
变量名 instanceof 数据类型,能不能编译通过是取决于,变量"指向的类型""数据类型"是否存在父子关系,如果存在父子关系则编译通过

换言之:X instanceof Y ,变量X指向的类型如果是Y的子类型则编译通过

instanceof 的使用
如果变量属于该数据类型,返回true。
如果变量不属于该数据类型,返回false。

所以,转换前,我们最好使用instanceof 先做一个判断

2. 实例

Person类(父类)
package Day0204.Demo03;

public class Person {

}
Student类(子类)继承Person类
package Day0204.Demo03;

public class Student extends Person{
}

Teacher类(子类)继承Person类
package Day0204.Demo03;

public class Teacher extends Person{
}
测试类
package Day0204.Demo03;
public class Test {
    public static void main(String[] args) {
        //Object > Person > Teacher
        //Object > String
        //Object > Person > Student
        Object o = new Student();
        System.out.println(o instanceof Student);//true
        System.out.println(o instanceof Person);//true
        System.out.println(o instanceof Teacher);//false
        System.out.println(o instanceof String);//false

        System.out.println("======================");
        //Person > Teacher
        //String
        //Person > Student
        Person p = new Student();
        System.out.println(p instanceof Student);//true
        System.out.println(p instanceof Person);//true
        System.out.println(p instanceof Teacher);//false
//        System.out.println(p instanceof String);//编译不通过
        System.out.println("======================");

        Student s = new Student();
        System.out.println(s instanceof Student);//true
        System.out.println(s instanceof Person);//true
//        System.out.println(s instanceof Teacher);//编译不通过
//        System.out.println(p instanceof String);//编译不通过

    }
}

类之间的继承关系:
Object > Person > Teacher
Object > String
Object > Person > Student

变量o指向的是Student类型,
Student类是Person类和Object类的子类,与String类、Teacher类无关
所以前两个输出结果为true,而后两个为false


        Object o = new Student();
        System.out.println(o instanceof Student);//true
        System.out.println(o instanceof Person);//true
        System.out.println(o instanceof Teacher);//false
        System.out.println(o instanceof String);//false

以此类推

二、类型转换

1. 向上转型

向上转型:多态本身是子类类型向父类类型向上转换的过程,其中,这个过程是默认的。你可以把这个过程理解为基本类型的小类型转大类型自动转换,不需要强制转换。

当父类引用指向一个子类对象时,便是向上转型。

向上转型格式:

父类类型 变量名 = new 子类类型(); 如:Father f= new Son();

2.向下转型

向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。同样可以把这个过程理解为基本类型的自动转换,大类型转小类型需要强制转换。一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,向下转使用格式:

Father father = new Son();
子类类型 变量名 = (子类类型) 父类变量名; 如:Son s =(Son) father;

划重点:向下转型的前提是父类对象指向的是子类对象(也就是说,在向下转型之前,它得先向上转型)

  • 向下转型的意义:
    想要调用子类特有的方法,必须做向下转型。

参考宜春的“深入理解java多态没有烤山药的存在,java就不香了吗?”

以及【狂神说Java】Java零基础学习视频通俗易懂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值