Possible Duplicate:
How does the Java cast operator work?
Java casting implementation
我一直想知道对象转换在 Java 中是如何工作的。我理解原始类型更像是二进制表示级别,但是对象呢?是不是有点像 Polymorphism
或 dynamic 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)。当您施放 Child
到Parent
, 只有 Parent
API 可用。但是,the overridden method will still be called .所以,如果你这样做:
Parent p = (Parent) new Child();
p.a();
...Child
的public 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;
这里有四个引用(p
、p1
、p2
和 p3
),每一个都指向您使用 new Parent()
创建的同一对象声明。
不过,我可能会在哲学观点上争论,当您说 Parent p = something
时,这种新引用的创建实际上是明确的,而不是在幕后。 .
链接:
- http://en.wikipedia.org/wiki/Primitive_wrapper_class
- http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
- http://docs.oracle.com/javase/7/docs/api/java/lang/ClassCastException.html
- http://docs.oracle.com/javase/tutorial/java/IandI/override.html
- Is Java "pass-by-reference" or "pass-by-value"?
关于java - Java 对象转换如何在幕后工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405377/