1)要点:当调用对象方法时,该方法会和对象的内存地址/运行类型绑定,称为动态绑定机制,调用属性则不存在绑定机制,哪里声明的就使用哪里
2)案例演示:B类继承于A类
class A { //父类 public int i = 10; //动态绑定机制: public int sum() { //父类 sum() return getI() + 10;//20 + 10 } public int sum1() { //父类 sum1() return i + 10;//10 + 10 } public int getI() { //父类 getI return i; } } class B extends A { //子类 public int i = 20; public int sum() { return i + 20; } public int getI() { //子类 getI() return i; } public int sum1() { return i + 10; } }
public class text{ public static void main(String[] args) { //a 的编译类型 A, 运行类型 B A a = new B();//向上转型 System.out.println(a.sum()); System.out.println(a.sum1()); } }
class A { //父类 public int i = 10; //动态绑定机制: public int sum() { //父类 sum() return getI() + 10;//20 + 10 } public int sum1() { //父类 sum1() return i + 10;//10 + 10 } public int getI() { //父类 getI return i; } } class B extends A { //子类 public int i = 20; //public int sum() { // return i + 20; // } public int getI() { //子类 getI() return i; } public int sum1() { return i + 10; } }
此时走a.sum();会从B类调用sum方法,返回一个40,若是把B类的sum方法注销,由于继承机制,会到A类去找sum方法,此时A类的sum方法调用了一个getI方法,该方法与运行类型绑定,也称为动态绑定机制,所以会回到B类去找getI方法,输出30
属性无动态绑定机制
class A { //父类 public int i = 10; //动态绑定机制: public int sum() { //父类 sum() return getI() + 10;//20 + 10 } public int sum1() { //父类 sum1() return i + 10;//10 + 10 } public int getI() { //父类 getI return i; } } class B extends A { //子类 public int i = 20; //public int sum() { // return i + 20; // } public int getI() { //子类 getI() return i; } // public int sum1() { // return i + 10; // } }
public static void main(String[] args) { //a 的编译类型 A, 运行类型 B A a = new B();//向上转型 System.out.println(a.sum()); System.out.println(a.sum1()); }
此时走a.sum1();会从B类找sum1方法,发现找不到,由于继承机制,会到A类去找sum1方法,A类的sum1方法return了一个 i + 10 ,此时的i是没有动态绑定机制的,故i在A类中声明,故返回20