JAVA子类赋值到父类,父类成员如何变

classAFinder{publicintID=1;publicvoidFind1(){System.out.println("FindoutA1");}publicv... class AFinder
{
public int ID = 1;
public void Find1()
{
System.out.println("Findout A1");
}
public void Find2()
{
Find1();
}
}

class BFinder extends AFinder
{
public int ID = 2;
public void Find1()
{
System.out.println("Findout B1");
}
public void Find3()
{
System.out.println("Findout B2");
}
}

class Test
{
public static void main(String [] args)
{
BFinder B = new BFinder();
AFinder A = B; //子类赋值给父类,父类对象到底变成怎么样了?
System.out.println(A.ID + ", " + B.ID);
A.Find1();
A.Find2();
B.Find1();
B.Find2();
B.Find3();
}
}

A是父类,B是继承的子类,B赋值给A,句柄A的成员到底怎么变的?是转成BFinder类了还是保持AFinder类?
代码的输出结果是:
1, 2

FIndout B1
FIndout B1
FIndout B1
FIndout B1
FIndout B2

很不理解,可以看到,A.Find1()输出的是Findout B1,说明A的方法Find1已经被覆盖了。
然而,A.Find3()却不存在,说明A没有完全转换成B
再看ID,A.ID也仍然是1,保持了A类初始化的ID,没有被B赋值
有没大神可以对输出的每一个结果帮我分析一下,谢谢!
展开
 我来答
alexmao4
推荐于2016-04-25 · TA获得超过1741个赞
知道大有可为答主
回答量:2350
采纳率:50%
帮助的人:450万
展开全部
1,子类赋值给父类,父类对象到底变成怎么样了? 赋值,只是给一个对象句柄,就像你我给取名字张三,你同学可能叫你小胖,但是你(对象)还是你。
java语言封装了指针,所以对没有c和指针基础的java学习者,的确不容易理解。

System.out.println(A.ID + ", " + B.ID); A.ID肯定直指A类的id,b如此

A.Find1(); a此时是扩展类b的实例,输出肯定是FIndout B1,overridefind1
A.Find2(); b实例没有find2,当然运行的是A.find2,继承的a的find2方法,输出FIndout B1
B.Find1();
B.Find2();
B.Find3();

不一一详述,一句话,向上转型是隐式,向下转型是显示。调用谁,看是谁的实例。
更多追问追答
追问
我明白了为什么A.Find1()输出时B1,但是现在我最疑惑的是A.ID为什么是1。
A是扩展类B的实例,Afinder A = B;说明A是指向实例B的句柄对吧?而实例B的ID是2,既然A是B的句柄,那么A.ID为什么不是2呢?
我有C基础,指针能理解。
追答
AFinder中的public int ID = 1;和BFinder中的public int ID = 2; 没有任何关系,被记录在各自的Class信息中。

你不要把这个问题和多态性混了,这里没有多态性(override,overload)。仅仅是两个类中的同名属性,这时由你左侧的声明类型表达式觉得,BFinder B=。。。就是B的id。
如果我是java语言的设计者,我既然运行这种情况出现,我也会这么处理。
如果在C++的多继承环境下,就会不一样了,好像编译不过去都。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式