日期:2014-05-20  浏览次数:20688 次

求教对象转换的问题
我是一java新学习的人,请教个问题:

如果Father 是父类,Son 是子类
Son s=new Son();
Father f=s;

我要问的问题是,这时产生了几个对象?
谢谢高手解答!

------解决方案--------------------
产生了一个对象 ,s f这两个对象都指向一个对象的引用
------解决方案--------------------
栈中有两个引用
堆中有一个对象实例
------解决方案--------------------
探讨

那为什么对父类和子类的属性和方法的存取存在很大差别呢?

------解决方案--------------------
一个对象。
new Son();比喻成狗,
Son s 和Father f只是牵狗的绳,绳子肯定不是狗。

只要是new时,才生产一个对象。你句子只有一个new,就一个对象。
------解决方案--------------------
因为子类中存在父类中不存在的方法
------解决方案--------------------
你要搞清楚java里面的运行时类型和声明类型

你说的属性和方法存在差别 其实仅仅是存在 代码编译期间,声明为父类的变量 (实际上是子类的实现)无法调用 子类独有的方法,这是因为java编译器不允许,也是多态的一种保护机制

如果是上面的情况,你自己清楚是子类的实现,可以将父类类型的实例再强制装换为子类,这样就可以完整调用

Java code

Son s=new Son();
Father f=s;
Son s2=(Son)f; //通过s2可以调用完整的子类方法与属性

------解决方案--------------------
一个对象,两个引用。你可以画个图那样更直观。
------解决方案--------------------
搞清楚堆内存和栈内存分别存什么东西对程序理解很有帮助的
------解决方案--------------------
一个对象,两个引用,对象存在堆里,引用存在栈中