首页 新闻 赞助 找找看

Java的重写和重载函数调用的问题

0
悬赏园豆:10 [待解决问题]

代码一:
class A { 
  public String show(D obj){ 
    return ("A and D"); }
  public String show(A obj){ 
    return ("A and A"); }
}
class B extends A{ 
  public String show(B obj){ 
    return ("B and B"); }
  public String show(A obj){ 
    return ("B and A"); }
}
class C extends B{}
class D extends B{}


A a1 = new A();

A a2 = new B();

B b = new B();

C c = new C();

D d = new D();

System.out.println(a2.show(b)); //①
System.out.println(a2.show(c)); //②


代码二:
class A {

public void MethodA(){...} 
public virtual void MethodB(){...} 
}

class B extends A{ 
public new void MethodA(){...} 
public override void MethodB(){...} 


//其中,B类重写了A类的普通方法MethodA,也重写了A类的虚拟方法MethodB,则: 
A a = new B(); 
a.MethodA();//③ 将会调用A类的MethodA方法 
a.MethodB();//④ 将会调用B类的MethodB方法


问题1:代码一:
①②运行的结果都是调用B类的show(A obj),输出B and A。不太明白为什么会返回这个,我自己的理解是①是父类引用指向子类对象,因为a2是A类型,所以先从A类的方法里看,A类的方法里没有show(B obj) 所以去B类里找方法,又因为B类里的show(B obj)是重载,而show(A obj)是重写,重载的部分不能调用,所以只能调用show(A obj)。这样的理解对吗?
问题2:代码二:
为什么代码二中③将会调用A类的MethodA方法,④将会调用B类的MethodB方法?重写之后不是应该都调用B类里的MethodA和MethodB方法吗?有人提到是因为普通方法和虚方法在编译和运行时的绑定问题,普通方法和虚方法又是什么?

JonthanJ的主页 JonthanJ | 初学一级 | 园豆:192
提问于:2015-07-24 16:14
< >
分享
所有回答(3)
0

代码一 问题 :java中的重载和重写和覆盖的概念,你还没搞清楚?B类继承了A类的show方法,就是说B类覆盖了A类的show方法,注意不是重载!覆盖了的理解和你的理解差不多,但是重载是什么你都没搞清楚。

代码二 问题 :我不知道有virtual这个关键子吗?这不是c++的吗?java 一般是用abstract。④将会调用B类的MethodB方法?④将不会调用A类的MethodB方法 和 只会调用调用B类的MethodA方法和MethodB方法。java我是没听过虚拟方法

Pace千雨 | 园豆:204 (菜鸟二级) | 2015-07-24 18:12
0

粘贴一个百度知道上的答案吧

A ab = new B();
这里ab的引用类型是A,但是它指向的内存是类型为B的一个实例

想对ab进行方法调用,你调用的方法都必须在 class A里面有的才行(因为你的引用类型为A)
这里 class A有show(A obj) show(D obj)着两个方法

ab.show(b) 在class A中没有找到类型匹配的方法,但是对b进行类型提升后,可以找到 show(A obj)方法,同理 ab.show(c)也是show(A obj)方法;但是ab内存地址指向一个类型为B内存空间,如果class B Override 了 class A的show(A obj)方法,则调用B的方法,反之,则调用A自己的方法

可以猜测 D d = new D(); ab.show(d)的结果是 A and D
如果注释掉 class A的 show(A obj)方法, ab.show(b) ab.show(c)都会出错。

这里你只要记住,能调用那些方法,由引用类型决定,具体执行情况,由实际内存对象类型决定

无心流泪 | 园豆:202 (菜鸟二级) | 2015-08-19 13:30
0

问题一:

A a2 = new B();

System.out.println(a2.show(b)); //①
System.out.println(a2.show(c)); //②

这是你的调用。你的a2是实例化的B类,然后向上转型为A,这样的话,a2只有调用A类中有的方法,如果A类的方法被继承的B类重写,那么就调用重写的方法!

在你的代码里,B重写了A的public String show(A obj){ 
    return ("B and A"); }这个方法,

而你的这个public String show(B obj){ 
    return ("B and B"); }方法,在A类里是没有的!!,这是B自己的方法,你用a2怎么可能调用!

超超boy | 园豆:202 (菜鸟二级) | 2015-08-25 09:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册