Java拾贝第四天——动态绑定机制

发布时间 2023-10-17 23:39:20作者: ocraft

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

//根据面向对象3中提及的属性看对象,方法看指向。试想如下代码
public class Test4 {
    public static void main(String[] args) {
        Base base = new Sub();
        System.out.println(base.sum());
        System.out.println(base.sum1());
    }
}
class Base {
    int i = 10;
    public int geti() {
        return i;
    }
    public int sum() {
        return geti() + 10;
    }
    public int sum1() {
        return i + 10;
    }
}

class Sub extends Base {
    int i = 20;
    public int geti() {
        return i;
    }
    public int sum() {
        return geti() + 20;
    }
    public int sum1() {
        return i + 10;
    }
}

不难发现,打印结果为40 30。

那如果将Sub类中sum()方法去掉呢?

//试想如下代码
public class Test4 {
    public static void main(String[] args) {
        Base base = new Sub();
        System.out.println(base.sum());
        System.out.println(base.sum1());
    }
}
class Base {
    int i = 10;
    public int geti() {
        return i;
    }
    public int sum() {
        return geti() + 10;
    }
    public int sum1() {
        return i + 10;
    }
}

class Sub extends Base {
    int i = 20;
    public int geti() {
        return i;
    }
    public int sum1() {
        return i + 10;
    }
}

base.sum()过程解析如下:

  1. 根据方法看指向,进入Sub类中寻找sum()方法
  2. 寻找无果,进入其父Base类中寻sum()方法
  3. 找到了!调用sum()方法,发现其调用geti()方法 ⭐
  4. 根据方法看指向,进入Sub类中寻找geti()方法
  5. 调用geti()方法⭐,并返回Sub类中的整型i(20)
  6. 返回Base类类中的sum()方法,进行+10;
  7. 结果为30

所以上述代码打印结果为30 30。

那如果再将Sub类中sum1()方法去掉呢?

//你知道结果吗?
public class Test4 {
    public static void main(String[] args) {
        Base base = new Sub();
        System.out.println(base.sum());
        System.out.println(base.sum1());
    }
}
class Base {
    int i = 10;
    public int geti() {
        return i;
    }
    public int sum() {
        return geti() + 10;
    }
    public int sum1() {
        return i + 10;
    }
}

class Sub extends Base {
    int i = 20;
    public int geti() {
        return i;
    }

打印结果为30 20。

所以Java的动态绑定机制:

  • 当调用方法时,该方法会和该对象的指向类型绑定。
  • 当调用属性时,没有动态绑定机制,属性还是看对象。

上述就是Java的动态绑定机制。