【Java】动态绑定机制
【摘要】 【Java】动态绑定机制
Java 动态绑定机制
- 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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者

评论(0)