- Java 重要机制:动态绑定机制
- Java 动态绑定机制:
- 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
- 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
package com.xdr630.dynamic_; public class DynamicBinding { public static void main(String[] args) { // a 的编译类型是 A ,运行类型是 B //属性看编译类型是哪个,方法看运行类型是哪个。 A a = new B(); System.out.println(a.sum()); //40 System.out.println(a.sum1()); //30 } } 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 = 20; public int sum() { return i + 20; } public int getI(){ return i; } public int sum1(){ return i + 10; } }
- 演示结论1
- 把上面子类中的 sum() 方法注释掉,main 方法中的 a.sum() 输出什么?
public class DynamicBinding { public static void main(String[] args) { // a 的编译类型是 A ,运行类型是 B A a = new B(); System.out.println(a.sum()); //30 System.out.println(a.sum1()); } } class A { //父类 public int i = 10; //动态绑定机制: public int sum(){ return getI() + 10;// 20 + 10 } public int sum1(){ return i + 10; } public int getI(){//父类 getI() return i; } } class B extends A { //子类 public int i = 20; public int getI(){// 子类 getI() return i; } public int sum1(){ return i + 10; } }
- 代码分析:
- 这个时候 a 的运行类型是 B,a.sum() 就会先找子类中的 sum() 方法,而此时子类中的 sum() 方法被注销了,所以只能去父类找 sum() 方法,sum 方法中再去调 getI() 方法,而此时父类和子类都有 getI() 方法。
- 因为a.sum() 方法的运行类型B,根据动态绑定机制,所以找到子类中的 getI() 方法,而在 getI() 中的return i 这个 i 是属性,没有绑定机制,在子类中声明的,直接返回 20 ,然后回到父类中的 sum() 方法 ,20 + 10,所以最后 a.sum 的输出值为 30
- 演示结论2
- 把上面子类中的 sum1() 方法注释掉,main 方法中的 a.sum1() 输出什么?
public class DynamicBinding { public static void main(String[] args) { // a 的编译类型是 A ,运行类型是 B A a = new B(); System.out.println(a.sum());//30 System.out.println(a.sum1());//20 } } class A { //父类 public int i = 10; //动态绑定机制: public int sum(){ return getI() + 10;//20 + 10 } public int sum1(){ return i + 10; } public int getI(){//父类 getI() return i; } } class B extends A { //子类 public int i = 20; public int getI(){// 子类 getI() return i; } }
- 代码分析:
- a 的运行类型是 B,所以从子类B开始找,而此时 sum1 方法被注释了,只能去找父类A中的 sum1 方法,在 sum1 方法中 return i + 10,而 i 是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i 属性在父类A中声明,所以 i 为10,所以 a.sum1 的输出值为 20
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)