`

Java的动态绑定

    博客分类:
  • java
阅读更多

http://blog.sina.com.cn/s/blog_59c9412d0100g7is.html

运行时绑定也叫动态绑定,它是一种调用对象方法的机制。Java调用对象方法时,一般采用运行时绑定机制。
1.Java的方法调用过程
编译器查看对象的声明类型和方法名(对象变量的声明类型)。通过声明类型找到方法列表。
编译器查看调用方法时提供的参数类型。
如果方法是private、static、final或者构造器,编译器就可以确定调用那个方法。这是静态绑定。
如果不是上述情况,就要使用运行时(动态)绑定。在程序运行时,采用动态绑定意味着:虚拟机将调用对象实际类型所限定的方法。
2.运行时(动态)绑定的过程
虚拟机提取对象的实际类型的方法表;
虚拟机搜索方法签名;
调用方法。
注意,这里说的是对象的实际类型。即在多态的情况下,虚拟机可以找到所运行对象的真正类型。
3.在向上转型情况下的动态绑定示例

Code:
  1. publicclassFather{
  2. publicvoidmethod(){
  3. System.out.println("父类方法,对象类型:"+this.getClass());
  4. }
  5. }
  6. publicclassSonextendsFather{
  7. publicstaticvoidmain(String[]args){
  8. Fathersample=newSon();//向上转型
  9. sample.method();
  10. }
  11. }

结果1:

父类方法,对象类型:class samples.Son

这个结果没有疑问,声明的是父类的引用(句柄),但准确的调用了子类的对象,调用method,在子类中没有该方法,所以去父类中寻找到并调用之。

现在修改子类,重写(override)method方法。

Java代码
Code:
  1. publicclassSonextendsFather{
  2. publicvoidmethod(){
  3. System.out.println("子类方法,对象类型:"+this.getClass());
  4. }
  5. publicstaticvoidmain(String[]args){
  6. Fathersample=newSon();//向上转型
  7. sample.method();
  8. }
  9. }
public class Son extends Father {     public void method() {        System.out.println("子类方法,对象类型:" + this.getClass());     }         public static void main(String[] args) {        Father sample = new Son();//向上转型        sample.method();     } } 

结果2:

子类方法,对象类型:class samples.Son

这个结果也是意料之中的。调用method时,在子类中寻找到了该方法,所以直接调用之。

4.静态绑定成员变量

在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性 还是父类的属性。

现在再进一步变化,在父类和子类中同时定义和赋值同名的成员变量name,并试图输出该变量的值。

Java代码
Code:
  1. publicclassFather{
  2. protectedStringname="父亲属性";
  3. publicvoidmethod(){
  4. System.out.println("父类方法,对象类型:"+this.getClass());
  5. }
  6. }
  7. publicclassSonextendsFather{
  8. protectedStringname="儿子属性";
  9. publicvoidmethod(){
  10. System.out.println("子类方法,对象类型:"+this.getClass());
  11. }
  12. publicstaticvoidmain(String[]args){
  13. Fathersample=newSon();//向上转型
  14. System.out.println("调用的成员:"+sample.name);
  15. }
  16. }
public class Father {     protected String name="父亲属性";         public void method() {        System.out.println("父类方法,对象类型:" + this.getClass());     } }   public class Son extends Father {     protected String name="儿子属性";         public void method() {        System.out.println("子类方法,对象类型:" + this.getClass());     }         public static void main(String[] args) {        Father sample = new Son();//向上转型        System.out.println("调用的成员:"+sample.name);     } } 

结果3:

调用的成员:父亲属性

这个结果表明,子类的对象(由父类的引用handle)调用到的是父类的成员变量。所以必须明确,运行时(动态)绑定针对的范畴只是对象的方法。

现在试图调用子类的成员变量name,该怎么做?最简单的办法是将该成员变量封装成方法getter形式。

Java代码
Code:
  1. publicclassFather{
  2. protectedStringname="父亲属性";
  3. publicStringgetName(){
  4. returnname;
  5. }
  6. publicvoidmethod(){
  7. System.out.println("父类方法,对象类型:"+this.getClass());
  8. }
  9. }
  10. publicclassSonextendsFather{
  11. protectedStringname="儿子属性";
  12. publicStringgetName(){
  13. returnname;
  14. }
  15. publicvoidmethod(){
  16. System.out.println("子类方法,对象类型:"+this.getClass());
  17. }
  18. publicstaticvoidmain(String[]args){
  19. Fathersample=newSon();//向上转型
  20. System.out.println("调用的成员:"+sample.getName());
  21. }
  22. }
public class Father {     protected String name = "父亲属性";       public String getName() {        return name;     }       public void method() {        System.out.println("父类方法,对象类型:" + this.getClass());     } }   public class Son extends Father {     protected String name="儿子属性";         public String getName() {        return name;     }         public void method() {        System.out.println("子类方法,对象类型:" + this.getClass());     }         public static void main(String[] args) {        Father sample = new Son();//向上转型        System.out.println("调用的成员:"+sample.getName());     } } 

结果4:

调用的成员:儿子属性

分享到:
评论

相关推荐

    Java动态绑定和内联

    Java动态绑定和内联是Java编程中的两个关键概念,它们对于理解Java的面向对象特性,尤其是多态性和性能优化有着重要的作用。 动态绑定,又称晚期绑定或运行时绑定,是Java语言的一个核心特性。它指的是在运行时而非...

    Java动态绑定和静态绑定.doc

    在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...

    java动态绑定和静态绑定用法实例详解

    "Java动态绑定和静态绑定用法实例详解" Java中的绑定机制是指将一个方法的调用与方法所在的类(方法主体)关联起来。Java中存在两种类型的绑定机制:静态绑定和动态绑定。 静态绑定是指在程序执行以前已经被绑定...

    Java动态绑定的方法重载的实现.zip

    Java动态绑定和方法重载是面向对象编程中的两个核心概念,它们在Java程序设计中扮演着重要角色。这里我们将深入探讨这两个概念以及它们在实际应用中的实现。 首先,让我们了解什么是方法重载(Method Overloading)...

    Java动态绑定的方法重载的实现.pdf

    Java动态绑定的方法重载的实现.pdf

    Java动态绑定机制的内幕

    这篇文章我们将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。  静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println(...

    理解Java中的静态绑定和动态绑定

    在Java编程语言中,静态绑定和动态绑定是两种不同的方法调用机制,它们与面向对象编程密切相关。这两种绑定方式决定了程序在运行时如何选择和执行特定的方法。 静态绑定(早期绑定),也称为编译时绑定,是指在程序...

    java代码绑定时间

    ### Java代码绑定时间:深入理解Oracle绑定变量的重要性 在Java编程中,特别是在处理与数据库交互的应用场景下,正确地使用数据库绑定变量对于提升系统性能、减少资源消耗具有至关重要的作用。本文将围绕“Java代码...

    Java中的静态绑定和动态绑定Java开发Java经验技巧

    在Java编程语言中,静态绑定和动态绑定是两个至关重要的概念,它们关乎程序的执行效率和灵活性。了解这两个概念对于提升Java开发技能至关重要。 首先,我们来解释一下静态绑定(也称为早期绑定)。静态绑定主要涉及...

    Java多态中动态绑定原理解析

    "Java多态中动态绑定原理解析" Java多态中动态绑定原理解析是Java面向对象程序设计中非常重要的特性,它让程序拥有更好的可读性和可扩展性。在Java中,多态是发生在继承关系中的,需要子类重写父类的方法。父类类型...

    Java方法的动态绑定与静态绑定

    对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。  静态绑定:  在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。  针对java简单的可以理解为程序编译期的...

    Java 静态绑定与动态绑定深入分析

    Java中的静态绑定与动态绑定是面向对象编程中的关键概念,它们决定了方法调用的方式和时机。静态绑定(也称为早期绑定或编译时绑定)和动态绑定(也称为晚期绑定或运行时绑定)是Java中多态性实现的基石。 **静态...

    xml和java绑定

    以下是一些关于XML和Java绑定的关键知识点: 1. **Java API for XML Processing (JAXB)**: JAXB是Java平台标准的一部分,它提供了将Java对象转换为XML文档(对象到XML),以及从XML文档还原Java对象(XML到对象)的...

    Java绑定XML架构的技术内涵

    ### Java绑定XML架构的技术内涵 #### 一、引言 在现代软件开发中,XML(Extensible Markup Language)被广泛应用于数据交换与存储。而Java作为一种主流的编程语言,在处理XML方面有着丰富的工具和技术支持。Java...

    java公众号绑定域名,微信消息接收和token验证

    java实现公众号绑定域名,微信消息接收和token验证功能

    在Java中实现Oracle变量的绑定方法 .doc

    在Java中实现Oracle变量的绑定方法,主要是为了优化SQL语句的执行效率,减少数据库解析负担,提升系统性能。Oracle数据库在处理SQL语句时,会先进行解析,然后将解析后的SQL语句存储在共享池(Shared Pool)中。如果...

    Java与XML数据绑定

    Java与XML数据绑定是将XML文档中的数据结构映射到Java对象的过程,反之亦然。这一技术使得在Java应用程序中处理XML数据变得更加便捷,避免了手动解析和构建XML字符串的繁琐工作。本篇将深入探讨Java中XML数据绑定的...

    《剑指offer》Java理解静态绑定与动态绑定.pdf

    Java中的静态绑定与动态绑定是面向对象编程中的两个核心概念,它们关系到程序的编译与运行时行为。理解这两个概念对于写出高效、灵活的代码至关重要。 首先,静态绑定(也称为前期绑定或编译时绑定)是指在编译期间...

    echarts 属性全动态设置 数据动态绑定

    java实现对echarts 属性全动态设置 数据动态绑定。封装echarts 的绘图方法,使得js只需要getLine(data),getBar(data)等就可以绘制图形。echarts上的所有属性都可以在java中设置。

    JComboBox动态绑定数据库

    本实例是关于如何将`Sql2000`数据库中的数据与`JComboBox`进行动态绑定,通过`JDBC`(Java Database Connectivity)接口来实现数据库连接和数据交互。 首先,我们需要理解`JComboBox`的基本用法。`JComboBox`是...

Global site tag (gtag.js) - Google Analytics