Java 对象投射的功能/姿势是什么?

Java 对象投射的功能/姿势是什么?,java,object,casting,Java,Object,Casting,因此,我最近在java中遇到了对象转换,我了解什么是转换,我只是不了解对象转换是如何工作的,或者功能是什么/转换如何修改对象。我非常困惑,甚至不知道如何使用它 以a name=new b()为例,为什么要将b强制转换为a或它所做的任何事情?我很困惑。我真的不明白当b被转换成a时,它是如何变化的。真的有什么理由用这个吗 tl;dr i不明白它是如何工作的,也不明白你为什么要使用它。Cast是对编译器的一个提示(需要编译器来证明类型契约是正确的),你作为一个程序员保证对象是你要将它转换成的类型 对象

因此,我最近在java中遇到了对象转换,我了解什么是转换,我只是不了解对象转换是如何工作的,或者功能是什么/转换如何修改对象。我非常困惑,甚至不知道如何使用它

a name=new b()
为例,为什么要将b强制转换为a或它所做的任何事情?我很困惑。我真的不明白当b被转换成a时,它是如何变化的。真的有什么理由用这个吗


tl;dr i不明白它是如何工作的,也不明白你为什么要使用它。

Cast是对编译器的一个提示(需要编译器来证明类型契约是正确的),你作为一个程序员保证对象是你要将它转换成的类型

对象没有发生任何转换

铸造如何修改对象

强制转换不会修改对象。强制转换引用类型是告诉编译器:“看,我这里有一个类型为a的变量,但我希望您将其视为类型为B的变量”

有时需要这样做,因为您比编译器更了解您正在使用的对象的实际类型。请注意,仍将在运行时进行检查-如果此时对象的类型不正确,您将得到一个
ClassCastException

a name=new b()

这不是铸造。在这里,您只需将
b
类型的对象分配给
a
类型的变量,只有当
a
类型是
b
的超类型时,才允许这样做

铸造是指在圆括号之间使用类型,例如:

Object something = new House();

// At this point, the compiler doesn't know that 'something' refers to a House.
// You can cast it:
House house = (House) something;
在Java出现泛型之前(Java1.4及更早版本),强制转换通常是必要的,因为
ArrayList
等集合不知道它们所持有的对象的类型


您应该尽可能避免强制转换-这实际上是一种绕过编译器类型检查的方法,并使代码的类型安全性降低。仅在绝对必要时使用铸造。

您应该阅读多态性的相关内容,这将有助于您理解其目的。仅供参考,您展示的不是铸造
b另一个=(a)name
将是一个cast。“我理解什么是casting”+“我真的不理解b是如何变化的”=>那么你不理解casting是什么,因为它根本不会改变任何对象。@Amongalen我已经读过polymorphism@anashyean,你问错问题了。您首先需要理解OOPS概念。那么你可以理解这一点。但是如果
b另一个=(a)name
完成,那么
a另一个
会得到类b或类a的方法吗?@anashyean它会得到
b
的方法(如果那段代码开始编译)。但是请记住,如果
name
一开始没有这些方法,那么调用它们时会出现运行时异常。因此,在您的示例中,
something
首先是object类型,然后您将其转换为house类型?@anashyean Yes。你必须明白变量和对象不是一回事。变量是对对象的引用。变量
something
的类型为
Object
,因此它可以引用任何类型的对象。在这种情况下,它指的是
House
类型的对象。如果您需要对它执行任何特定于
House
对象的操作,则需要对其进行强制转换。