转型操作并不改变对象在内存的形式

 1 /*
 2     需求:设计一个简单的java程序,证明强制转换语句并不能改变其在内存中的形式
 3     思路:设计一个父子类,创建子类对象,将子类向上转型,查看转型前后该对象在内存中是否发生变化
 4 */
 5 
 6 class  ExchangeTest
 7 {
 8     public static void main(String[] args) 
 9     {
10         Child c = new Child(23);
11         System.out.println(c);
12         Father f = (Father)c;
13         c.show();
14         f.show();
15         System.out.println(f);//c和f都是指向了内存中同一个对象,且该对象是Child的实例对象
16     }
17 }
18 
19 class Father
20 {
21     int worknum;
22     Father(int i){
23         worknum = i;
24     }
25     void show(){
26         System.out.println("Father " + worknum);
27     }
28 }
29 
30 class Child extends Father
31 {
32     int studynum;
33     Child(int i){
34         super(i);
35         studynum = i;
36     }
37     void show(){
38         System.out.println("Child " + studynum);
39     }
40 }
41 
42 
43 /*
44 总结:
45     将子类向上转型后,子类对象在内存中依旧是子类对象,即使一个父类变量指向该对象后,该对象依旧是子类对象。
46 
47 
48 运行时出现的bug
49 -----------------------------------------------------------------------------------
50 ExchangeTest.java:31: 错误: 无法将类 Father中的构造器 Father应用到给定类型;
51         Child(int i){
52                     ^
53   需要: int
54   找到: 没有参数
55   原因: 实际参数列表和形式参数列表长度不同
56 1 个错误
57 
58 错误原因:   子类构造函数Child(int i){}中首行有个隐藏的默认语句super();该语句会调用
59             父类的空参构造函数,因为父类写了Father(int i){}  所以原来隐藏的Father(){}
60             没有了,因此子类构造函数中的super()找不到Father(){}  因此报错
61 -----------------------------------------------------------------------------------
62 */
结果:

  转型操作并不改变对象在内存的形式

总结:
   将子类向上转型后,子类对象在内存中依旧是子类对象,即使一个父类变量指向该对象后,该对象依旧是子类对象。

发表评论

电子邮件地址不会被公开。 必填项已用*标注