1.是什么
Java 动态绑定(Dynamic Binding)是指程序在运行时,根据对象的实际类型来决定调用哪个方法的过程。这是面向对象编程中的一个核心概念,也是多态性得以实现的基础。
动态绑定的概念:
-
编译时绑定:在编译时,编译器会根据对象的声明类型来决定调用哪个方法。如果对象的声明类型是父类,那么编译器会调用父类中定义的方法。
-
运行时绑定:在运行时,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