Java中的强制类型转换

class One {
    public void foo() {
        System.out.println("One");
    }
}

class Two extends One {
    public void foo() {
        System.out.println("Two");
    }
    public void dosth(){
        System.out.println("Two again");
    }
}

 一、向上转型

One t = new Two(); //向上转型,即父类引用指向子类对象,此时子类对象的类型为父类的类型
t.foo();
t.dosth();//编译错误

 

    结论:向上转型是安全的,但可能会丢失子类的某些特性

 

二、向下转型

One t = new Two();
t.foo();
t = (Two)t;
t.dosth();//编译错误

    这样强制转换不成功,t 的类型仍然是One。

One t = new Two(); //向上转型
Two t1 = (Two)t; // 向下转型
t1.dosth();

    向下转型成功。再例如:

Object obj = new int[] { 1, 2, 3 };
int[] someArray = (int[])obj;
for (int i : someArray) System.out.print(i + " ");

 

 

 

 

再举个例子:有两个类,Father是父类,Son类继承自Father。

 

Father f1 =new Son() ; //这就叫upcasting(向上转型)

//现在f1 引用一个指向一个Son 对象

Son s1 = (Son)f1 ;  //这个叫downcasting(向下转型)

//现在f1还是指向Son对象

 

第二个例子:

Father f2 =new Father();

Son s2=(Son)f2;     //出错,子类引用不能直接指向父类对象

 

你或许会问,在第一个例子中:Son s1=(Son)f1;为什么是正确的呢?

很简单因为f1指向指向一个子类对象,Father f1=new Son();子类s1引用当然可以指向子类对象了。

而f2被传给了一个Father对象,Father f2=new Father();子类s1引用不能指向父类对象。

 

总结:

1.父类引用指向子类对象,子类引用不能指向父类对象。

2.把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。

如Father f1=new Son();

3.把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型。

如f1就是一个指向子类对象的父类引用,把f1赋给子类引用s1 即Son s1=(Son)f1;

其中f1前面的(Son)必须添加,进行强制转换。


4.upcasting 会丢失子类特有的方法(下面有说明),但是子类overriding 父类的方法,子类方法有效

5.向上转型的作用, 减少重复代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值