动态绑定机制

例题如下:

class M{
    int i = 10;

    public int sum(){
        return getI()+10;
    }

    public int sum1(){
        return i+10;
    }
    
    public int getI(){
        return i;
    }
}
class N extends M{
    int i = 20;
    
    public int getI(){
        return i;
    }

    public int sum(){
        return i+20;
    }
    
    public int sum1(){
        return i+10;
    }
}

 


M m = new N();
System.out.println(m.sum());//输出结果为40,
System.out.println(m.sum1());//输出结果为30
当调用方法时,方法会和该对象的内存地址即运行类型进行绑定,当调用属性时则没有动态绑定,那里声明,哪里使用。

具体为:当注销N类的sum与sum1方法时:
m调用sum方法,因为m的运行类型为N,所以先去N中找sum方法,N中没有则去到父类M中调用M的sum方法,M的sum方法内返回了一个getId方法,此时M,N中均有该方法,但因存在动态绑定,所以返回的N中的
getId方法,N的getId方法中返回的i为N中的i,所以输出结果为20+10=30
m调用sum1方法,因为m的运行类型为N,所以先去N中找sum1方法,N中没有则去到父类M中调用M的sum1方法,此时sum1方法内返回的i为M中的i,所以输出结果为:10+10=20




posted @ 2022-02-16 16:59  朱不悔  阅读(54)  评论(0)    收藏  举报