【问题标题】:Java casting implementationJava 强制转换实现
【发布时间】:2011-05-05 00:56:13
【问题描述】:

我知道如何在 Java 中使用强制转换,但有一个更具体的问题;您能否向我解释一下铸造是如何工作的(在内存中)?

  • 在向上转换和向下转换时,变量类型如何变化?

  • JVM 怎么知道向这个对象发送这个方法是安全的?

提前谢谢你。

【问题讨论】:

  • 你可以看看 jvm 的实现,比如 OpenJDK。

标签: java casting jvm


【解决方案1】:

能否请您解释一下铸造的工作原理(在记忆中)?

它在字节码级别工作,而不是真正在内存中

在向上转换和向下转换时如何改变变量类型?

如果它是一个带有特殊字节码指令的原语,例如从长到整数,如:

long l = ...
int i = ( int ) l;

字节码为:l2i,如果是指令checkcast的引用

JVM 是如何知道从这个时候开始向这个对象发送这个方法是安全的?

它不会,它会尝试在运行时执行此操作,如果失败则抛出异常。

这样写是合法的:

String s = ( String ) new Date();

【讨论】:

    【解决方案2】:

    此问题已接受答案的可能重复项: How does the Java cast operator work?

    这里也有相当广泛的解释,涵盖所有数据类型等: http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.5

    【讨论】:

      【解决方案3】:

      基元的所有转换都在寄存器中完成(与大多数操作一样) 对于基元,在许多情况下,向下转换时采用低位,而向上转换时,符号被扩展。有一些极端情况,但您通常不需要知道这些情况。


      向上转换/向下转换引用的工作方式相同,因为它检查实际对象是您转换为的类型的实例。您可以投射既不向上也不向下投射。

      例如

       Number n = 1;
       Comparable c = (Comparable) n; // Number and Comparable are unrelated.
       Serializable s = (Serializable) c; // Serializable and Comparable are unrelated.
      

      【讨论】:

      • 是的,我知道。我对非原始类型的转换更感兴趣。不是因为我有问题要解决 - 只是想更好地了解这种语言。
      【解决方案4】:

      如果您对 jvn 的内部工作原理感兴趣,也可以查看 jvm 规范 http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#25611

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-29
        相关资源
        最近更新 更多