gpt4 book ai didi

java - 两种类型的向下转型之间的区别

转载 作者:行者123 更新时间:2023-11-30 08:16:11 26 4
gpt4 key购买 nike

public class {
main() {
// What is the different implications of these 2 down casts

Superclass tRefVar = new SubClass();

// Down cast example 1
SubClass aVar = (SubClass) tRefVar;

// Down cast example 2
((SubClass) tRefVar).someMethodInSubClass();
}
}

言下之意,示例 1 的类型转换和示例 2 的类型转换有什么区别?

最佳答案

几乎没有区别。第一个示例创建了一个新的局部变量,而第二个示例则没有。就是这样。

为了深入了解并验证这一点,让我们考虑这个简单的类,它有两个方法基本上可以完成您在示例中所做的事情:

public class Downcasts {
public int stringLength1(Object o) {
String s = (String) o;
return s.length();
}

public int stringLength2(Object o) {
return ((String) o).length();
}
}

这些方法的字节码(您可以使用javap -c Downcasts查看)是:

public int stringLength1(java.lang.Object);
Code:
0: aload_1
1: checkcast #2 // class java/lang/String
4: astore_2
5: aload_2
6: invokevirtual #3 // Method java/lang/String.length:()I
9: ireturn

public int stringLength2(java.lang.Object);
Code:
0: aload_1
1: checkcast #2 // class java/lang/String
4: invokevirtual #3 // Method java/lang/String.length:()I
7: ireturn

第一个方法执行以下操作:

  • 字符串 s = (字符串) o:
    • o 加载到堆栈
    • 检查它是否是一个字符串
    • 将其存储到寄存器 2
  • 返回 s.length():
    • 将寄存器 2 加载到堆栈(即我们刚刚保存的寄存器)
    • 调用 String::length (虚拟函数)
    • 返回结果

第二种方法的作用是:

  • 返回 ((String) o).length():
    • o 加载到堆栈
    • 检查它是否是一个字符串
    • 调用 String::length (虚拟函数)
    • 返回结果

关于java - 两种类型的向下转型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com