自学内容网 自学内容网

动态绑定机制

1.是什么

        Java 动态绑定(Dynamic Binding)是指程序在运行时,根据对象的实际类型来决定调用哪个方法的过程。这是面向对象编程中的一个核心概念,也是多态性得以实现的基础。

动态绑定的概念:

  1. 编译时绑定:在编译时,编译器会根据对象的声明类型来决定调用哪个方法。如果对象的声明类型是父类,那么编译器会调用父类中定义的方法。

  2. 运行时绑定:在运行时,JVM 会根据对象的实际类型来决定调用哪个方法。如果对象的实际类型是子类,那么会调用子类中重写的方法。

动态绑定的条件:

  • 继承:动态绑定通常发生在继承关系中,子类继承父类的方法。
  • 方法重写:子类重写父类的方法。
  • 父类引用指向子类对象:使用父类的引用类型变量来引用子类的对象。

总结:

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用


例题1:(问输出结果是什么?)

public class A {
    public int i = 10;

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

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

    public int get() {
        return i;
    }
}

class B extends A {
    public int i = 20;

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

    public int get() {
        return i;
    }

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

class Test {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }

}

 答案:

40
30

解释:A a = new B();向上转型,所以a指向的对象是B,a调用子类B中的方法


例题2:更改一下(将子类的sum和sum1方法都移除,那么现在的输出结果是什么呢?)

public class A {
    public int i = 10;

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

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

    public int get() {
        return i;
    }
}

class B extends A {
    public int i = 20;

    public int get() {
        return i;
    }
}
class Test {
    public static void main(String[] args) {
        A a = new B();
        System.out.println(a.sum());
        System.out.println(a.sum1());
    }

}

解释A a = new B();向上转型,a调用sum方法,先看子类B,因为子类B类没有sum方法所以调用父类A的sum方法,在sum方法中,return 返回的是get()方法,那么调用的是父类的get还是子类的get方法呢?

根据总结:当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定,所以先看子类B有没有get方法,有则调用,无则调用父类的方法,因为子类有那么调用子类的get方法,子类的get方法返回的是i属性,又根据总结:当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用,所以i=20,最后返回结果i+10=30

同理可得a调用sum1方法得到结果为20

答案:

30
20

原文地址:https://blog.csdn.net/2401_83418369/article/details/142690145

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!