多态03 动态绑定机制

多态03 动态绑定机制

一、引入

主方法输出什么

	A a = new B();
	System.out.println(a.sum());
	System.out.println(a.sum1());
class A {
    public int i = 10;
    public int sum() {return getI() + 10;}
    public int sum1() {return i + 10;}
    public int getI() {return i;}
}

class B extends A {
    public int i = 10;
    public int sum() {return i + 10;}
    public int sum1() {return i + 10;}
    public int getI() {return i;}
}

out:
40
30

如果把B类的sum方法注销,主方法又会输出什么?

class A {
    public int i = 10;
    public int sum() {return getI() + 10;}
    public int sum1() {return i + 10;}
    public int getI() {return i;}
}

class B extends A {
    public int i = 10;
    //public int sum() {return i + 10;}
    public int sum1() {return i + 10;}
    public int getI() {return i;}
}

a的编译类型A,运行类型B
a.sum() =>首先在运行类型B类中寻找sum方法,找不到,就去父类A中寻找,找到了 public int sum() {return getI() + 10;}
但是这里的getI(),会调用子类的还是父类的呢?

二、java的动态绑定机制

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,那里使用

接上文,会调用B类中的getI() 方法

如果把B类的sum方法注销,主方法 a.sum1() 又会输出什么?

class A {
    public int i = 10;
    public int sum() {return getI() + 10;}
    public int sum1() {return i + 10;}
    public int getI() {return i;}
}

class B extends A {
    public int i = 10;
    //public int sum() {return i + 10;}
    //public int sum1() {return i + 10;}
    public int getI() {return i;}
}

a1.sum() =>
(1)首先a的运行类型是B,在B中寻找sum1方法,(用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定)。
(2)没找到,接着继承机制发挥作用,去父类A中寻找sum1方法,找到了。public int sum1() {return i + 10;}
(3)注意这里的 i 是属性,属性没有动态绑定机制,i 取的是A类中的 i 值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值