我知道如何在Java中使用强制转换,但我有一个更具体的问题:您能否解释一下强制转换是如何工作的(在内存中)?
在向上转型和向下转型时,变量类型如何改变?
JVM如何知道将此方法发送到此对象是安全的?
提前感谢您。
请问一下内存中的类型转换是如何工作的?
它在字节码级别上运行,而不是真正的内存中进行。
变量类型在向上转型和向下转型时如何改变?
如果它是一个原始类型,并且有一个特殊的字节码指令,例如从长整型到整型,如:
long l = ...
int i = ( int ) l;
字节码为:checkcast
指令引用时使用l2i
。
JVM 如何知道从这个时间点起将该方法发送给此对象是安全的?
它不知道,它在运行时尝试操作,如果失败将抛出异常。
以下写法是合法的:
String s = ( String ) new Date();
所有原始数据类型的转换都在寄存器中完成(就像大多数操作一样)。对于原始数据类型,在许多情况下,向下转换时会取低位,而向上转换时会扩展符号。虽然存在一些特殊情况,但通常您不需要知道这些。
在编程中,引用的向上转型/向下转型的工作方式相同,因为它检查实际对象是否是您要转换的类型的实例。您可以进行既不是向上转型也不是向下转型的转换。
例如:
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