代码一:
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方法吗?有人提到是因为普通方法和虚方法在编译和运行时的绑定问题,普通方法和虚方法又是什么?
代码一 问题 :java中的重载和重写和覆盖的概念,你还没搞清楚?B类继承了A类的show方法,就是说B类覆盖了A类的show方法,注意不是重载!覆盖了的理解和你的理解差不多,但是重载是什么你都没搞清楚。
代码二 问题 :我不知道有virtual这个关键子吗?这不是c++的吗?java 一般是用abstract。④将会调用B类的MethodB方法?④将不会调用A类的MethodB方法 和 只会调用调用B类的MethodA方法和MethodB方法。java我是没听过虚拟方法
粘贴一个百度知道上的答案吧
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)都会出错。
这里你只要记住,能调用那些方法,由引用类型决定,具体执行情况,由实际内存对象类型决定
问题一:
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怎么可能调用!