Java基础——向上转型、向下转型

父类

public class Super{
    public int value = 111;
    public void test(){
        System.out.println("super method");
    }
}

子类

public class Sub extends Super{
    public int value = 222;
    public void test() {
        System.out.println("sub mothod");
    }
}

main方法

Super sup = new Sub();//向上转型
System.out.println(sup.value);
sup.test();
Sub sub = (Sub)sup;//向下转型
System.out.println(sub.value);
sub.test();

结果:

111
sub mothod
222
sub mothod

分析向上转型:

  • 结果显示,向上转型后,sup的属性仍是父类的值,方法却变成子类的。
  • 这是因为Sub重写了test()方法,这是动态连接。如果Sub中没有test()方法,则调用父类的test()。但注意,如果父类中没有test(),而子类中有,sup是无法调用test()的,编译时候就会出错。
  • 关于属性,因为属性是不存在重写的,所以,sup的value还是父类的111。

分析向下转型:

  • 结果显示,sub的属性和方法均是Sub自己的属性和方法。
  • 但是,如果Sub中没有属性value和方法test(),结果是输出Super的value和test(),这是由于继承。
  • 向下转型有什么应用场景呢?我认为以下这个场景是比较常见和实用的。
    首先再定义一个类Sub2,和Sub一模一样:

    public class Sub2 extends Super{
        public int value = 333;
        public void test() {
            System.out.println("sub2 mothod");
        }
    }
    

    然后,使用场景是这样的,一个Super[]数组,里面可以放他的任意子类,取出这些子类的时候,只需要用instanceof判断一下类型,然后根据类型相应的向下转型,就可以取出各种子类以及信息。

    Super[] sups = new Super[]{new Sub(),new Sub2()};//向上转型
    for(Super sup : sups){
        if(sup instanceof Sub){
            Sub sub = (Sub)sup;//向下转型
            System.out.println(sub.value);
        }
        if(sup instanceof Sub2){
            Sub2 sub2 = (Sub2)sup;//向下转型
            System.out.println(sub2.value);
        }
    }
    

    输出:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值