关于java继承与多态的问题

woshilijinhui 2011-05-20 03:22:25
public class A
{
public void func1()
{
System.out.println("A's func1 is calling.");
}
public void func2()
{
func1();
}
}
class B extends A
{
public void func1()
{
System.out.println("B's func1 is calling.");
}
public void func3()
{
System.out.println("B's func3 is calling.");
}
}
class C
{
public static void main(String[] args)
{
B b=new B();
A a=b;
callA(a);
}
public static void callA(A a)
{
a.func1();
a.func2();
}
}

问为什么最后输出的结果是:
B's func1 is calling.
B's func1 is calling.
求解!!
...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
woshilijinhui 2011-05-20
  • 打赏
  • 举报
回复
那么请问如下代码
class Func1 {
private String str="AB";
public void printStr()
{
System.out.println(str);
}
}
public class Func2 extends Func1
{
public String str="AC";
public static void main(String[] args)
{
Func2 f2 = new Func2();
f2.printStr();
}
}
Func2没有上溯转型为Func1,调用的方法是继承来的;为何输出父类的属性?
langxiashahai 2011-05-20
  • 打赏
  • 举报
回复
首先 new B();会上溯转型为A,然后a.func1();
a.func2();分别调用A的两个方法,但是B重写了A的func1方法,所以会去调用B子类的func1方法,System.out.println("B's func1 is calling.");func2()方法调用func1方法,同理。输出B's func1 is calling.
woshilijinhui 2011-05-20
  • 打赏
  • 举报
回复
我知道调用callA方法传递的参数实际类型为B,但callA调用func2时,func2是继承来的,func2中调用的方法为什么是B的func1,而不是A的func1
langxiashahai 2011-05-20
  • 打赏
  • 举报
回复
A a=b;这句话
turing-complete 2011-05-20
  • 打赏
  • 举报
回复
A a=b;

这一句造成的,a的运行时类型是B。
您是c++程序员?

51,408

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧