您的位置:首页 > 新闻 > 会展 > 优化网站推广教程整站_企业咨询管理师_百度在线客服系统_信息流广告代理商排名

优化网站推广教程整站_企业咨询管理师_百度在线客服系统_信息流广告代理商排名

2024/12/26 21:29:23 来源:https://blog.csdn.net/2401_83418369/article/details/142690145  浏览:    关键词:优化网站推广教程整站_企业咨询管理师_百度在线客服系统_信息流广告代理商排名
优化网站推广教程整站_企业咨询管理师_百度在线客服系统_信息流广告代理商排名

1.是什么

        Java 动态绑定(Dynamic Binding)是指程序在运行时,根据对象的实际类型来决定调用哪个方法的过程。这是面向对象编程中的一个核心概念,也是多态性得以实现的基础。

动态绑定的概念:

  1. 编译时绑定:在编译时,编译器会根据对象的声明类型来决定调用哪个方法。如果对象的声明类型是父类,那么编译器会调用父类中定义的方法。

  2. 运行时绑定:在运行时,JVM 会根据对象的实际类型来决定调用哪个方法。如果对象的实际类型是子类,那么会调用子类中重写的方法。

动态绑定的条件:

  • 继承:动态绑定通常发生在继承关系中,子类继承父类的方法。
  • 方法重写:子类重写父类的方法。
  • 父类引用指向子类对象:使用父类的引用类型变量来引用子类的对象。

总结:

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用


例题1:(问输出结果是什么?)

public class A {public int i = 10;public int sum() {return get() + 10;}public int sum1() {return i + 10;}public int get() {return i;}
}class B extends A {public int i = 20;public int sum() {return i + 20;}public int get() {return i;}public int sum1() {return i + 10;}
}class Test {public static void main(String[] args) {A a = new B();System.out.println(a.sum());System.out.println(a.sum1());}}

 答案:

40
30

解释:A a = new B();向上转型,所以a指向的对象是B,a调用子类B中的方法


例题2:更改一下(将子类的sum和sum1方法都移除,那么现在的输出结果是什么呢?)

public class A {public int i = 10;public int sum() {return get() + 10;}public int sum1() {return i + 10;}public int get() {return i;}
}class B extends A {public int i = 20;public int get() {return i;}
}
class Test {public static void main(String[] args) {A a = new B();System.out.println(a.sum());System.out.println(a.sum1());}}

解释A a = new B();向上转型,a调用sum方法,先看子类B,因为子类B类没有sum方法所以调用父类A的sum方法,在sum方法中,return 返回的是get()方法,那么调用的是父类的get还是子类的get方法呢?

根据总结:当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定,所以先看子类B有没有get方法,有则调用,无则调用父类的方法,因为子类有那么调用子类的get方法,子类的get方法返回的是i属性,又根据总结:当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用,所以i=20,最后返回结果i+10=30

同理可得a调用sum1方法得到结果为20

答案:

30
20

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com