注册 登录
编程论坛 JAVA论坛

继承,父类与子类的问题

zx6861nj 发布于 2016-12-18 02:11, 1753 次点击
public class A {
    public static int y=0;
    public int x=23;
    public A(long x){
    }
    public A(int x){
        this(new Long(x));
        y=y+x;
    }
    public void f(int i, A o){}
    public void f(long lo,A o){}
    public void f(byte b,B o){}
}


public class B extends A{
    int x=17;
    public B(){
        super(1);
        new A(2);
        x++;
    }
    public B(int x){
        super(x);
        y=x+1;
        super.x=y+1;
    }
    public void f(int i,B o){}
    public void f(long lo,B o){}
    public void f(long lo,A o){}
}


public class C {
    public static void main(String[] args) {
        A aa1=new A(1L);
        A aa2=new A(42);
        B bb=new B();
        A ab=new B(3);

        int i=1;
        long lo=2;
        byte b=3;
        
        ab.f(b, bb);
        ab.f(lo, bb);
    }
}
为什么最后 ab.f(lo, bb); 对应的是Class B里面 public void f(long lo,A o){} 这个方法? 求解答,谢谢!
3 回复
#2
lxs_nicecode2016-12-21 12:16
题主的想法应该是它会去调用B类中的“public void f(long lo,B o){}”没错吧
但实际上,B类中的这个方法是B类自己新创的,并没有覆盖A类中的某个方法,所以它不能通过父类的动态绑定来实现调用
以上是结论,下面开始解释原因:
若某个父类的对象引用了某个子类的实例,像题中的ab变量,A引用了B,如果想要调用B类中的方法,那么要被调用的那个方法必须是B类override(覆盖)A类中的某个方法
如果形象点的解释的话,就是想象A类有这么一排12345一共5个方法,其中B类重写了2和3方法为2'和3'自己由重新创建了6、7两个方法,那么在编译器调用某个方法去查找方法表的时候,呈现在它眼前的是12'3'45,没有6和7,也没有2和3。从一个高抽象层面来看的话就是这么理解的。
#3
GrayJerry2016-12-23 23:25
这里涉及到Java的动态绑定机制,建议去翻书看一下或百度,先自己尝试理解,有疑问在发帖,这样提升的比较快
#4
晓kita2017-01-10 17:34
A ab=new B(3) 这就是多态 编译看等号左边 执行看等号右边 所以在执行的时候 你的ab就是B类的
1