【Java】动态绑定机制

本文详细探讨了Java中的动态绑定机制,通过代码示例展示了如何在方法调用时根据对象的实际类型进行绑定。当调用方法时,会根据运行时类型找到对应的方法实现;而访问属性则遵循声明时的类型。文中通过两个演示结论,解释了当子类方法被注释时,如何根据动态绑定机制确定方法的执行逻辑,进而得出输出结果。
摘要由CSDN通过智能技术生成

Java 动态绑定机制

  • Java 重要机制:动态绑定机制
  • Java 动态绑定机制:
  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用
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;
    }

}
  • 代码分析:
  1. 这个时候 a 的运行类型是 Ba.sum() 就会先找子类中的 sum() 方法,而此时子类中的 sum() 方法被注销了,所以只能去父类找 sum() 方法,sum 方法中再去调 getI() 方法,而此时父类和子类都有 getI() 方法。
  2. 因为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;
    }

}
  • 代码分析:
  1. a 的运行类型是 B,所以从子类B开始找,而此时 sum1 方法被注释了,只能去找父类A中的 sum1 方法,在 sum1 方法中 return i + 10,而 i 是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i 属性在父类A中声明,所以 i10,所以 a.sum1 的输出值为 20
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兮动人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值