【发布时间】:2011-05-05 00:56:13
【问题描述】:
我知道如何在 Java 中使用强制转换,但有一个更具体的问题;您能否向我解释一下铸造是如何工作的(在内存中)?
在向上转换和向下转换时,变量类型如何变化?
JVM 怎么知道向这个对象发送这个方法是安全的?
提前谢谢你。
【问题讨论】:
-
你可以看看 jvm 的实现,比如 OpenJDK。
我知道如何在 Java 中使用强制转换,但有一个更具体的问题;您能否向我解释一下铸造是如何工作的(在内存中)?
在向上转换和向下转换时,变量类型如何变化?
JVM 怎么知道向这个对象发送这个方法是安全的?
提前谢谢你。
【问题讨论】:
能否请您解释一下铸造的工作原理(在记忆中)?
它在字节码级别工作,而不是真正在内存中
在向上转换和向下转换时如何改变变量类型?
如果它是一个带有特殊字节码指令的原语,例如从长到整数,如:
long l = ...
int i = ( int ) l;
字节码为:l2i,如果是指令checkcast的引用
JVM 是如何知道从这个时候开始向这个对象发送这个方法是安全的?
它不会,它会尝试在运行时执行此操作,如果失败则抛出异常。
这样写是合法的:
String s = ( String ) new Date();
【讨论】:
此问题已接受答案的可能重复项: How does the Java cast operator work?
这里也有相当广泛的解释,涵盖所有数据类型等: http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5
【讨论】:
基元的所有转换都在寄存器中完成(与大多数操作一样) 对于基元,在许多情况下,向下转换时采用低位,而向上转换时,符号被扩展。有一些极端情况,但您通常不需要知道这些情况。
向上转换/向下转换引用的工作方式相同,因为它检查实际对象是您转换为的类型的实例。您可以投射既不向上也不向下投射。
例如
Number n = 1;
Comparable c = (Comparable) n; // Number and Comparable are unrelated.
Serializable s = (Serializable) c; // Serializable and Comparable are unrelated.
【讨论】:
如果您对 jvn 的内部工作原理感兴趣,也可以查看 jvm 规范 http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#25611
【讨论】: