instanceof和类型转换

一、instanof

创建以下几个类

Person(父类)  Studengt(子类)  Teacher(子类)

Student继承Person,Teacher继承Person

则有以下关系:

  • Object->String
  • Object->Person->Student
  • Object->Person->Teacher

(在Java中,所有的类都默认直接或者间接继承Object类)

通过instanceof应用可以得到公式:

            //System.out.println(X instanceof Y);

            X,Y之间有父子关系编译通过,没有父子关系编译报错

            X所指向的实际类型是不是Y的子类型

Object a = new Student();//祖父类
System.out.println(a instanceof Student);//True
        System.out.println(a instanceof Person);//True
        System.out.println(a instanceof Object);//True
        System.out.println(a instanceof Teacher);//False  
        //Teacher不在Object->Person->Student这一条原型链上
        //只在Object->Person->Teacher这一条链上
        System.out.println(a instanceof String);//False   
        //String不在Object->Person->Student这一条原型链上
        //只在Object->String这条链上
Student student = new Student();
        System.out.println(student instanceof Student);//True
        System.out.println(student instanceof Person);//True
        System.out.println(student instanceof Object);//True
        //System.out.println(student instanceof Teacher);//编译报错 
        //Student和Teacher没有父子关系,无法通过编译
        //System.out.println(student instanceof String);//编译报错
        //Student和String没有父子关系,无法通过编译
        

        //Object->Person->Student
Person b = new Person();
        System.out.println(b instanceof Student);//false
        System.out.println(b instanceof Person);//True
        System.out.println(b instanceof Object);//True
        System.out.println(b instanceof Teacher);//false
        //都能通过编译,但b不是Student的子类,所以false
        //b不是Teacher子类,结果也是false

二、类型转换

低--->高    自动转化

高--->低    强制转化

在Java中强制转换会丢精度,同理在类型转换中强制转换会丢失一些方法。

父类:

public class Person {
    public void run(){
        System.out.println("run");
    }
}

子类:

public class Student extends Person{
    public void go(){
        System.out.println("go");
    }
}

类型之间的转化:基本类型转化      高——>低 强制转化                低——>高 自动转化

子类转换为父类会丢失自己的一些方法。

父(高)    子(低)

//父(高)      子(低)
//高转低   强制转化
Person obj = new Student();
Student obj1 = (Student) obj;
        obj1.go();
//或者
((Student) obj).go();


//低转高   自动转化
Student student1 = new Student();
        student1.go();

//子类转化为父类  可能丢失自己本类的一些方法
Person person1 = student1;
        person1.run();//只能调用Person中的 run 方法
        //person1.go();      报错

丢失go();方法

1、父类的引用指向子类的对象
2、把子类转化为父类   向上转型:直接转化
3、把父类转化为子类   向下转型:强制转型(在Java中强制转换会丢失精度,在类型转换中,强制转换,会丢失一些方法。)
4、方便方法的调用,通过升级或者降级使用其他方法  可以减少重复的代码  提高代码利用率

抽象 : 封装  继承  多态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值