java声明显式转换_Java中的显式类型转换示例

引用vs对象vs类型

对我而言,关键是理解对象及其引用之间的区别,换句话说,就是对象及其类型之间的区别。

当我们用Java创建对象时,我们声明了它的真实本质,它将永远不会改变。但是Java中的任何给定对象都可能具有多种类型。这些类型中的某些显然归功于类层次结构,而其他类型则不是那么明显(即泛型,数组)。

专门针对引用类型,类层次结构规定了子类型化规则。例如,在您的示例中,所有卡车均为重型车辆,所有重型车辆均为。因此,这种is-a关系层次结构指示卡车具有多种兼容类型。

创建时Truck,我们定义一个“引用”来访问它。该引用必须具有这些兼容类型之一。

Truck t = new Truck(); //or

HeavyVehicle hv = new Truck(); //or

Vehicle h = new Truck() //or

Object o = new Truck();

因此,这里的关键是要认识到对对象的引用不是对象本身。创建的对象的性质永远不会改变。但是我们可以使用各种兼容的引用来访问该对象。这是这里多态性的特征之一。可以通过引用不同“兼容”类型的对象来访问同一对象。

当我们进行任何类型的转换时,我们只是假设不同类型的引用之间具有这种兼容性。

向上转换或扩展参考转换

现在,有了类型引用Truck,我们可以轻松得出结论,它始终与类型引用兼容Vehicle,因为所有卡车都是Vehicles。因此,我们可以不使用显式强制转换就向上引用该参考。

Truck t = new Truck();

Vehicle v = t;

这也称为扩展引用转换,基本上是因为当您进入类型层次结构时,类型会变得更加通用。

如果需要,可以在此处使用显式转换,但这不是必需的。我们可以看到t和所引用的实际对象v是相同的。是,并且将永远是Truck。

向下转换或缩小参考转换

现在,有了类型的引用,Vechicle我们不能“安全地”得出结论,它实际上引用了Truck。毕竟,它也可以引用其他形式的车辆。例如

Vehicle v = new Sedan(); //a light vehicle

如果您v在代码中的某处找到引用,却不知道引用的是哪个特定对象,则不能“安全地”论证它是指向a Truck还是指向a Sedan或任何其他种类的车辆。

编译器很清楚,它不能对所引用对象的真实性质提供任何保证。但是程序员通过阅读代码可以确定他/她正在做什么。像上述情况一样,您可以清楚地看到它Vehicle v引用了Sedan。

在这些情况下,我们可以进行下调。之所以这样称呼,是因为我们要沿着类型层次结构前进。我们也称此为缩窄参考转换。我们可以说

Sedan s = (Sedan) v;

这总是需要显式的强制转换,因为编译器不能确定这样做是否安全,这就是为什么这就像问程序员“您确定自己在做什么吗?”。如果您对编译器撒谎,则ClassCastException在执行此代码时会在运行时得到。

其他种类的分型规则

Java中还有其他子类型化规则。例如,还有一个称为数字提升的概念,它可以自动强制表达式中的数字。像

double d = 5 + 6.0;

在这种情况下,由两种不同类型(整数和双精度型)组成的表达式在评估该表达式之前将整数强制转换/强制为双精度型,从而产生双精度值。

您也可以进行原始的向上转换和向下转换。如

int a = 10;

double b = a; //upcasting

int c = (int) b; //downcasting

在这些情况下,当信息可能丢失时,需要进行显式转换。

某些子类型化规则可能不那么明显,例如在数组的情况下。例如,所有引用数组都是的子类型Object[],而原始数组则不是。

对于泛型,尤其是使用通配符(如super和)时extends,情况变得更加复杂。像

List a = new ArrayList<>();

List extends Number> b = a;

List c = new ArrayList<>();

List super Number> d = c;

其中的类型b是的类型的子类型a。的类型d是的类型的子类型c。

装箱和拆箱也受制于某些强制转换规则(不过,在我看来,这也是一种强制形式)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值