对象类型转换的总结
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了。但是引用父类没有而子类有的变量
时出错原因是父类没有这样的变量,别忘了我们把子类转成了父类了。这么一来,这种情况就很清楚啦。
(即按照用父类一样地用子类。而子类超出父类的东西不能用。呵呵,这就是父类引用引用子类实例的实质,不过就一句话!)
而这样的父类类型可以再转成子类类型,只不过是子类回到来原来的状态罢了。
到此为止,类型转换的情况一清二楚。
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了。但是引用父类没有而子类有的变量
时出错原因是父类没有这样的变量,别忘了我们把子类转成了父类了。这么一来,这种情况就很清楚啦。
(即按照用父类一样地用子类。而子类超出父类的东西不能用。呵呵,这就是父类引用引用子类实例的实质,不过就一句话!)
而这样的父类类型可以再转成子类类型,只不过是子类回到来原来的状态罢了。
到此为止,类型转换的情况一清二楚。
相关文章推荐
- C++对象类型转换问题概括总结
- 通讯转换工具开发_webservice储值卡项目总结之webservice复杂对象类型
- C#总结————无法将类型为“DAL.DALLookForRecharge”的对象强制转换为类型“IDAL.IDA
- 读<<CLR via C#>>总结(2) 对象创建的原理和两种类型转换方法
- C++ 对象构造, 拷贝, 赋值和隐式类型转换总结
- VC++中数据类型转换总结[转]
- java数据类型转换____Gson框架对象和JSON转换
- Java基本类型转换总结
- MFC中将Ctring类型强制转换为char*(LPSTR)方法总结
- spring源码探究---beanFactory为bean对象设置属性时涉及到的类型转换
- C语言中强制数据类型转换的总结
- java日期类型转换总结date timestamp calendar string
- JavaScript 时间 格式 转换 及 Date对象 总结
- Qt对象类型转换(char* int与Qstring间的转换)
- C++类型转换总结
- C++内置类型对象转换
- 使用jackson对Java对象与JSON字符串相互转换的一些总结。
- java中类对象之间的类型转换
- VC++中经常用到的类型转换(总结)
- 使用stringstream对象简化类型转换