首页 > 代码库 > 转型操作并不改变对象在内存的形式
转型操作并不改变对象在内存的形式
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 */
结果:
总结: 将子类向上转型后,子类对象在内存中依旧是子类对象,即使一个父类变量指向该对象后,该对象依旧是子类对象。
转型操作并不改变对象在内存的形式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。