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赋值
有没大神可以对输出的每一个结果帮我分析一下,谢谢! 展开
{
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赋值
有没大神可以对输出的每一个结果帮我分析一下,谢谢! 展开
1个回答
展开全部
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();
不一一详述,一句话,向上转型是隐式,向下转型是显示。调用谁,看是谁的实例。
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++的多继承环境下,就会不一样了,好像编译不过去都。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询