| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
共有 617 人关注过本帖
标题:继承,父类与子类的问题
只看楼主 加入收藏
zx6861nj
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2016-11-29
结帖率:0
  已结贴   问题点数:3  回复次数:3   
继承,父类与子类的问题
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){} 这个方法? 求解答,谢谢!
搜索更多相关主题的帖子: public  super  
2016-12-18 02:11
lxs_nicecode
Rank: 2
等 级:论坛游民
威 望:1
帖 子:9
专家分:32
注 册:2015-12-27
  得分:2 
题主的想法应该是它会去调用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。从一个高抽象层面来看的话就是这么理解的。
2016-12-21 12:16
GrayJerry
Rank: 4
等 级:贵宾
威 望:10
帖 子:59
专家分:233
注 册:2015-10-20
  得分:2 
这里涉及到Java的动态绑定机制,建议去翻书看一下或百度,先自己尝试理解,有疑问在发帖,这样提升的比较快
2016-12-23 23:25
晓kita
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2017-1-10
  得分:0 
A ab=new B(3) 这就是多态 编译看等号左边 执行看等号右边 所以在执行的时候 你的ab就是B类的
2017-01-10 17:34







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024415 second(s), 8 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved