向上转型与向下转型

Java转型用于继承或者在接口上,实现业务场景使用。转型分为向上转型和向下转型。

向上转型为自动转型

向下转型需要强制转型

向上转型

向上转型是从一个较专用类型(子类),向通用类型转换(父类),所以总是安全的。因为向上的父类存放的方法都是公共方法。

父类引用子类对象

Cate obj = new Say();

向上转型后,obj可以调用子类重写父类的方法,如果子类没有重写父类的方法,才会去调用父类的公共方法,这就是动态绑定关系。但是向上转型后不能调用子类的特有方法。

向上转型可以详细看这篇

父类引用子类对象

向下转型

将原本属于父类的对象强制转换为子类,就叫做向下转型。向下转型并不是每个对象都可以的,只有这个对象原本属于子类向上转型后的成为父类的对象,才能重新向下转回变成子类。

向下转型可能会导致丢失一些属性信息,所以不推荐向下转型。除非是业务需要。

语法

// 子类类型 引用名 = (子类类型)父类引用名
Say Gt = (Say)obj;

通过向下转型后,子类对象可以调用子类的所有属性及方法。

Cate obj = new Say();    // 父类引用子类对象,属于向上转型

// 从向上转型强制转为向下
Say Gt = (Say)obj;    // 只有向下转型了,才能使用子类的所有属性及方法
 System.out.println(Gt.Name);    // 输出子类的Name;
Gt.Dt();    // 调用子类的方法

class Cate{
    String Name = "zhowHua";
    public void Met(){
        System.out.println("这是父类");
    }
}

class Say extends Cate{
    String Name = "JZ";
    public void Met(){
         System.out.println("子类重写父类的方法");
    }
    public void Dt(){
         System.out.println("子类特有的方法");
    }
}

判断对象是否属于子类

instanceof关键字

instanceof会返回一个对象是否属于某个子类的布尔值。如果是则返回true,不是返回false。

我们通过instanceof逻辑判断后,再对该对象进行强制转换,保证安全性。

PRO S = new Stud("居正", 27, 95.5);

// 通过instanceof进行判断S是否Stud的子类对象
if(S instanceof Stud){
    Stud Dt = (Stud)S;
}

通过数组对象遍历向上转型

可以将所有对象统一放进数组对象里,进行遍历

// 创建数组对象
PRO[] arr = new PRO[6];
arr[0] = new Stud("居正", 27, 95.5);
arr[1] = new Tech("陈刚", 35, 10000);
arr[2] = new Stud("小明", 25, 76.5);
arr[3] = new Tech("李莉", 43, 15000);

 for (int i = 0; i < arr.length; i++) {
    arr[i].res();    // 遍历数组调用当前数组元素的方法
 }

通过数组遍历批量完成向下转型

for (int a = 0; a < arr.length; a++) {
    if(arr[a] instanceof Stud){    // 通过instanceof对当前元素进行判断是否为某个子类
        Stud aa = (Stud)arr[a];    // 判断正确则进行向下转换。
            aa.Dt();
    }else if(arr[a] instanceof Tech){
        Tech bb = (Tech)arr[a];
            bb.Dt();
    }else{
        System.out.println("异常");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值