关于变量类型、对象类型和强制类型转换的对话
来源:互联网 发布:软件开发 翻译 编辑:程序博客网 时间:2024/05/17 22:03
问:在类型转换时,引用对象的类型是它所属的类,还是它所指的类?
答:对象的类型只有一个,就是调用它的 getClass() 方法获得的类型。在被引用时,引用它的变量可以是该类型,也可以是该类型的父类。例如一个 Integer 对象,引用它的变量可以是 Integer 类型,也可以是它的父类 Number 类型,甚至就是 Object 也可以。
问:在以下代码中:
Class T1 {}
Class T2 extends T1 {}
Class T3 extends T2 {}
Class Test {
public static void main(String [ ] args) {
T1 t1=new T3();
T2 t2=(T2)t1; //在类型转换时,是由T1向T2转换,还是由T3向T2转换?
//因此,它是不是强制转换呢?
}
}
答:t1 是一个变量,这个变量的类型是 T1;t1 指向一个对象,这个对象的类型是 T3。t2 是一个变量,这个变量的类型是 T2;t2 指向一个对象,这个对象同样是 t1 指向的对象。所以这个类型转换实际上是将 T3 类型的对象引用为 T2 类型。
问:因此,它是向上提升了,所以不是强制转换是吗?
答:可以这么理解,因为所有的强制类型转换是在继承链中转换。例如:Object<-Comparable<-Date<-Timestamp 这个继承链,对于任何一个 Timestamp 对象,你可以将指向它的变量强制转换为 Object、Comparable 或 Date 类型而不会出错;但如果强制转换为其他类型,如 String,就会出错了。
问:不是说向上转换都是自动转换吗?
答:是的,向上转换不需要强制。不管向上向下,其实都不过是变量的类型和其指向的对象类型的匹配问题。
问:我还是不明白。那么在:
T1 t1=new T3();
T2 t2=(T2)t1;
中,第一句是自动转换我明白,它是由T3到T1;
第二句为什么是强制转换呢?不是从T3到T2吗?应该是自动转换啊?
答:变量的类型在它定义的时候就决定了,而与它实际指向的对象的类型无关。因为变量 t1 的类型是 T1,所以在编译时只能判定 t1 指向的是一个 T1 对象。虽然它在运行的某一时刻时指向一个 T3 对象,但不能因此把 t1 变量看成是 T3 类型的。
问:噢,我明白了,谢谢!
- 关于变量类型、对象类型和强制类型转换的对话
- 变量类型的强制转换
- 关于类型和强制类型转换的理解
- 关于强制类型转换:强制类型转换
- 关于强制类型转换
- 关于强制类型转换
- 关于强制类型转换
- 关于强制类型转换
- 关于强制类型转换
- 引用类型变量的强制转换
- PHP 变量类型的强制转换
- 引用变量的强制转换类型
- 引用变量的强制类型转换:
- 引用变量的强制类型转换_instanceof
- Python变量类型的强制转换
- 关于Java和CPP强制类型转换
- 强制的类型转换
- 强制类型的转换
- MySQL和MongoDB的性能测试
- ubuntu包管理
- ghkl,jk
- 架构问题的探寻
- 解决页面中不让提交按钮获取焦点的方法,
- 关于变量类型、对象类型和强制类型转换的对话
- MFC Combo Box(组合框)控件的用法
- NIM(1) 一排石头的游戏
- 拥抱十万亿移动大变革
- 递归下降的表达式解析器
- 说说大型高并发高负载网站的系统架构
- 以服务的形式在后台执行某个脚本
- Test XSS
- qemu模拟arm并调试汇编的方法和注意事项