对java强制类型转换的一些理解
概述
\qquad 从我这个编程小白来看,java的强制类型转换并不常用。不同于C/C++语言,可以进行int,double等类型之间的强制转换,java是不支持一下格式的:
double a = 3.14;
int b = (int)a;
\qquad 并且,java编程中的很多对象之间并没有什么关系,贸然进行强制类型转换很容易使程序抛出异常并终止;一般情况下,只会在对equals方法进行override时才会用到强制类型转换。较少且固定的使用使我们对这个过程的本质并不了解,我们掌握的只是一些固定的用法。只有在遇到一些不能理解的结果时,才会静下心来寻找问题的根源。
问题的提出
我们来看下面这个例子:
class A{
public A(){}
void foo(){
System.out.println("A.bar");
}
}
class B extends A{
public B(){}
@override
void foo(){
System.out.println("B.bar");
}
}
public class test{
public static void main(String[] args){
B b = new B();
((A)b).foo();
}
}
\qquad 开始时我以为打印的结果可能是"A.bar",毕竟已经强制类型转换成了A类型的对象,但实际上打印出来的却是"B.bar".
我就开始思考强势类型转换的机制。而这个无外乎有三种可能:
- 只是将引用转换为A类型
- 只是将对象转换为A类型
- 将引用和对象均转换为A类型
想法的验证
\qquad 从理论上来看,第二,三种猜想不成立。根据Java override机制可知,如果对象转换的话,那么b在调用函数时会根据实际的对象来进行选择。所以,如果后两种猜想成立的话,最后打印出来的应该是"A.bar"。而getClass函数可以获得object的引用类型,调用此函数并打印,得到A。故第一种猜想成立。