首页 > 编程语言 >Java动态绑定机制

Java动态绑定机制

时间:2022-10-18 22:14:11浏览次数:76  
标签:getI return 10 int sum 绑定 Java 动态 public

本文主要记录韩顺平老师讲解动态绑定机制过程中提到的重点,本文转载此篇博客【Java】动态绑定机制,并对其进行一定的补充,如有侵权会删除。

特点

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

首先上述代码执行过后的结果是很容易看出的

40
30

演示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;
    }
  
}

此时输出的结果是

30

分析

  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;
    }

}

此时输出结果是

20

分析

a 的运行类型是 B,所以从子类B开始找,而此时 sum1 方法被注释了,只能去找父类A中的 sum1 方法,在 sum1 方法中 return i + 10,而 i 是属性,没有动态绑定机制,哪里声明,哪里使用,此时 i 属性在父类A中声明,所以 i10,所以 a.sum1 的输出值为 20

额外补充

  1. Java学习笔记之深入理解动态绑定和静态绑定

标签:getI,return,10,int,sum,绑定,Java,动态,public
From: https://www.cnblogs.com/pluto-/p/16804378.html

相关文章

  • Java 集合简介 一
    什么是集合?集合就是由若干个确定的元素所构成的整体。例如,5只小兔构成的集合:在数学中,我们经常遇到集合的概念。例如:●有限集合○一个班所有的同学构成的集合;○一......
  • JavaScript学习--Array数组对象
    定义1.var变量名=newArray(元素列表);如vararr=newArray(1,2,3);2.常用:var变量名=[元素列表];如vararr=[1,2,3];访问arr[索引]=值;如arr[0]=1;ps:数组长度类型均可变 len......
  • JavaScript学习--基础语法03
    流程控制语句if,switch,for,while,dowhile。与之前学过的一样。 函数定义:通过function关键词定义语法:functionfunctionName(参数1,参数2) {  具体代码 }例子fu......
  • JavaScript学习--03
    运算符除了==和===其他和c语言都一样==:1.判断类型是否一样,如果不一样,则进行类型转换2.再去比较其值===:全等于1.判断类型是否一样,如果不一样,直接返回fa......
  • javaSE基础-抽象
    抽象(abstract)java关键字abstract,可用于修饰类、方法。抽象类格式:修饰符abstractclass类名{}1、此类不能实例化2、抽象类中一定有构造器,便于子类实例化时调用3、......
  • javaSE基础-接口
    接口(Interface)使用implements关键字使一个类遵循某个特定接口(或一组接口),它表示:接口只是外形。接口决定方法名、参数列表和返回类型,但是无法确定方法体。接口只提......
  • 通过netty把百度地图API获取的地理位置从Android端发送到Java服务器端
    本篇记录我在实现时的思考过程,写给之后可能遇到困难的我自己也给到需要帮助的人。写的比较浅显,见谅。在写项目代码的时候,需要把Android端的位置信息传输到服务器端,通过Ne......
  • Java 快速排序之一的 冒泡排序 效率较低 但是对新手比较友好
    packagetest;importjava.util.Scanner;importjava.util.Arrays;//把数组的内容全打印出来,并且加上中括号而且中间自己加入逗号。publicclassDay_19{publicstaticvo......
  • Java第五讲异常处理总结
    1.在运行上述代码时javac产生idiv字节码指令,在运行下面的程序时javac产生ddiv字节指令,导致了两段代码运行结果不同。2.      3.finally语句块一定会执行吗......
  • Java第四讲动手动脑
    1.  在以上的代码中,main方法调用的是publicvoidprintln(Objectx),这一方法调用了String类的valueOf方法,valueOf方法内部调用Object.toString方法:1publicString......