java - Java 对象转换如何在幕后工作?

标签 java casting polymorphism

Possible Duplicate:
How does the Java cast operator work?
Java casting implementation

我一直想知道对象转换在 Java 中是如何工作的。我理解原始类型更像是二进制表示级别,但是对象呢?是不是有点像 Polymorphismdynamic binding,因为一切都将在运行时确定?例如:

class Parent{
     void A(){}
}
class Child extends Parent{
     @Override
     void A(){}
}

Parent p = new Parent();
Child c = (Child) p;

这在幕后是如何运作的?它会创建一个新的 Child 实例吗?此外,如果您尝试转换会发生什么:

Child b = (Child) new Object();

最后一个,将原语转换为包装类时:

Double d = (Double) 3.3;

我知道你不需要强制转换它,但如果你这样做了怎么办?后端发生了什么重要的事情吗?

最佳答案

当您使用显式转换时,系统中不会创建新对象(除了在最后一种情况下,您将原始类型转换为 object wrapper ,因为 double 不是像 Double 那样的对象)。请注意,由于 Java 的 autoboxing feature,不需要显式转换。 .

在您的(Child) new Object()方案,您将收到 ClassCastException因为 Object不是 Child (虽然情况正好相反)。

第一个场景的答案是最复杂的。本质上,父类被视为接口(interface)。当您施放 ChildParent , 只有 Parent API 可用。但是,the overridden method will still be called .所以,如果你这样做:

Parent p = (Parent) new Child();
p.a();

...Childpublic void a()将被调用,即使它是通过 Parent 的镜头看到的类(class)。但是,如果您要在 Child 中使用第二种方法那个Parent没有(例如 public void b()),您将 能够在不将对象转换回 Child 的情况下调用它.

“幕后”,正如你所说,唯一创造的新事物是另一个object reference它指向同一个对象。您可以对同一个单一对象有任意多的引用。考虑这个例子:

Parent p = new Parent();
Parent p1 = p;
Parent p2 = p;
Parent p3 = p2;

这里有四个引用(pp1p2p3),每一个都指向您使用 new Parent() 创建的同一对象声明。

不过,我可能会在哲学观点上争论,当您说 Parent p = something 时,这种新引用的创建实际上是明确的,而不是在幕后。 .

链接:

关于java - Java 对象转换如何在幕后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405377/

相关文章:

java - 主要方法是空的?

polymorphism - 为什么在 iife 中包装函数会导致弱类型?

c++ - 在 C++ 中基于大小的运行时类型转换

C# 简化并可能概括了我的对象克隆方法

oop - Fortran 2003,选择类型以区分 'real' 和 'real array'

java - 从 JWS 签名的 jar 中获取用户主文件夹

Java检测字符串中的双双引号

java - 克隆 Java 对象

c# - 指定的转换无效

c# - 在 C# 中,我是否必须执行显式向上转换?