作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
加载到堆栈返回 s.length()
:
String::length
(虚拟函数)第二种方法的作用是:
返回 ((String) o).length()
:
o
加载到堆栈String::length
(虚拟函数)关于java - 两种类型的向下转型之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638703/
在Java编程中经常碰到类型转换,对象类型转换主要包括向上转型和向下转型。 向上转型 我们在现实中常常这样说:这个人会唱歌。在这里,我们并不关心这个人是黑人还是白人,是成人还是小孩,也就是说我们
当使用使用 C 风格继承的 C API 时,(利用 C 结构的标准布局),例如 GLib ,我们通常使用 C 风格的转换来向下转换: struct base_object { int x;
我是一名优秀的程序员,十分优秀!