您的位置:首页 > 其它

对象类型转换的总结

2005-01-15 14:13 393 查看
看下面一条例子!

import java.lang.*;
public class j02090504
{
public static void main(String para[])
{
A obj1 ;
System.out.println("A 对象引用 A 实例");
obj1 = new A();
obj1.printX();
//((B)obj1).test(); //执行时期例外,obj1 之实例不满足 B 类,但在编译时期不会发现
System.out.println("obj1.Y = " + obj1.Y ); // A 定义的 Y

System.out.println("===========================");
System.out.println("(A)B==> A 对象引用 B 实例");
obj1 = (A)(new B());
// 通常不需自己作此转型,因 obj1 = new B() 能自动转型
obj1.printX(); // 唤起的是 B 的 printX() 方法实现
//obj1.test(); //编译错误,A 类没有 test() 方法
System.out.println("obj1.Y = " + obj1.Y );
System.out.println("将 A 类之对象引用转型为 B ...");
((B)obj1).printX();
// 唤起的是 B 的 printX() 方法实现,前者与之同,不需这样做
((B)obj1).test(); // 转为 B 类就有 test() 方法
System.out.println("((B)obj1).Y = " + ((B)obj1).Y );

System.out.println("===========================");
//B testObj = (B)new A(); //执行时期例外,A 类之实例不满足 B 类
System.out.println("(B)((A)B)==> B 对象引用 B 实例"); // B对象实例
B obj2 = (B)obj1;
// obj1 目前引用 B 类之实例,其对象引用可转为 B 类
obj2.printX();
obj2.test();
System.out.println("obj2.Y = " + obj2.Y ); // B 类定义的 Y
System.out.println("将 B 类之对象引用转型为 A ...");
((A)obj2).printX(); //唤起的还是 B 的 printX() 方法实现
//((A)obj2).test(); //编译错误,A 类没有 test() 方法
System.out.println("((A)obj2).Y = " + ((A)obj2).Y ); // A 类定义的 Y
}
}
class A
{
int X = 199;
int Y = 333;
public void printX()
{
System.out.println("X+100 = " + (X+100) );
}
}
class B extends A
{
double X =255.51;
double Y = 11.23;
public void printX()
{
System.out.println("X = " + X );
}
public void test()
{
System.out.println("test() in B");
}
}

看完后搞出结果的心得是:
1、转型无妨,但是否可以调用该引用所指的对像中的变最要看最原始New的
那一个对像是哪一个类的。
2、不可将父类的实例转型为子类?因为父类不满足子类。
而子类可转型为父类,因为子类有父类的结构。而此时父类的引用可以引用
子类的变量(因为Override!!!!)。

最后,总结了一下。问题是出现在一个实例在创建时的类型上啊!
我们可以看到整个主程序里,一共出现了两次创建新类的语句,见有色部分既New语句。
得出以下结论:
一、若New出来的对象是父类类型,不能将父类类型转为子类类型。
二、若New出来的对象是子类类型,可以将其转为父类类型。而且该引用存
取的变量是子类定义的,原因为Override了。但是引用父类没有而子类有的变量
时出错原因是父类没有这样的变量,别忘了我们把子类转成了父类了。这么一来,这种情况就很清楚啦。
(即按照用父类一样地用子类。而子类超出父类的东西不能用。呵呵,这就是父类引用引用子类实例的实质,不过就一句话!)
而这样的父类类型可以再转成子类类型,只不过是子类回到来原来的状态罢了。
到此为止,类型转换的情况一清二楚。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: