`
idealab
  • 浏览: 198196 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Java动态绑定探讨

    博客分类:
  • Java
阅读更多
本文转 “子 孑” 博客:http://zhangjunhd.blog.51cto.com/113473/49452

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

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

这个结果没有疑问,声明的是父类的引用(句柄),但准确的调用了子类的对象,调用method,在子类中没有该方法,所以去父类中寻找到并调用之。
现在修改子类,重写(override)method方法。
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,并试图输出该变量的值。
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形式。
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:
调用的成员:儿子属性
分享到:
评论
1 楼 C_J 2009-04-20  
在讨论那个绑定的时候

我觉得我忽略了 new Son() 时候是先构造父类的  呵呵  不过不影响我们讨论的大致结果

相关推荐

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

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

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

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

    Java与XML数据绑定

    本篇将深入探讨Java中XML数据绑定的相关概念、技术和实践。 首先,Java中XML数据绑定的主要API有JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)。JAXB允许开发者在Java类和XML之间进行...

    Java列表框与数据库绑定

    在Java编程中,将列表框(JList)与数据库绑定是一项常见的任务,它允许用户从数据库中的数据动态地创建交互式列表。这种技术在开发基于Java的桌面应用程序时非常实用,尤其是在需要显示大量数据供用户选择的情况下...

    实现 Castor 数据绑定,第 4 部分 把 Java 对象绑定到 SQL 数据库.docx

    本文主要探讨了如何利用Castor实现SQL数据绑定,这一特性使得开发者可以更方便地处理Java对象与SQL数据库之间的数据转换,从而简化数据持久化的复杂性。 SQL数据绑定的概念是基于XML数据绑定的延伸,它是在SQL...

    实现Castor数据绑定,第4部分把Java对象绑定到SQL数据库.pdf

    本文将详细探讨如何使用Castor实现SQL数据绑定。 首先,理解SQL数据绑定的概念至关重要。它是将Java对象的属性映射到SQL数据库的表、列上的过程,类似于XML数据绑定,只是数据交换的媒介由XML文档替换为SQL数据库。...

    Java-Thread-Affinity:将Java线程绑定到给定的内核

    本主题将深入探讨Java如何实现线程亲和性,以及其背后的原理和实践应用。 首先,线程亲和性有助于减少因线程在不同核心之间迁移产生的额外开销,这种开销包括缓存失效和上下文切换。当线程长时间运行在同一个核心上...

    动态任务调用_java动态任务_beltduu_

    在本篇文章中,我们将深入探讨Java中的动态任务调度,特别是使用开源库Quartz进行任务管理。 Quartz是一个功能强大的开源作业调度框架,它提供了丰富的API来创建、管理和执行定时任务。Quartz能够与各种持久化存储...

    java hibernate不同数据库之间的动态切换

    在本文中,我们将深入探讨如何在Java Hibernate应用中实现不同数据库之间的动态切换。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`。在这个文件中,通常会指定数据库连接的信息,如URL、用户名...

    java动态仪表盘显示

    下面我们将详细探讨Java在创建动态仪表盘方面的技术要点。 1. **JavaFX或Swing用于图形界面** - JavaFX是Java提供的一种现代GUI工具包,适用于构建桌面应用,具有丰富的图形元素和动画支持,适合创建动态仪表盘。 ...

    java socket 用户真实IP测试

    在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx的TCP转发获取到实际用户的IP地址。 在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。...

    《精通java web动态图表编程》源代码.rar

    3. **数据绑定和数据驱动**:在Web应用中,动态图表通常需要与后端数据库或服务器端的数据进行绑定。书中可能会讲解如何使用JDBC(Java Database Connectivity)来连接和操作数据库,以及如何将查询结果映射到图表上...

    Java webservice服务动态配置

    在这个主题中,我们将深入探讨Java WebService服务的动态配置,以及与Oracle数据库备份和后台配置界面相关的知识点。 首先,Java WebService基于标准如SOAP(Simple Object Access Protocol)和WSDL(Web Services ...

    RoboVM和libGDX的绑定[用java调用ios的静态库.a]

    本篇文章将详细探讨如何通过RoboVM与libGDX进行绑定,以利用Java调用iOS的静态库.a。 首先,RoboVM是一个开源的Java虚拟机,它允许Java和Scala代码直接在iOS设备上运行,从而打破了Java只能在Android平台上运行的...

    网络mac 与ip交换机绑定

    总的来说,网络MAC与IP交换机绑定是网络管理中的一个重要环节,它通过Java编程实现,结合交换机的配置,可以增强网络的安全性和可控性。了解并掌握这一技术对于IT专业人士来说是非常必要的,尤其是在维护大型网络...

    基于java的本地代码绑定工具 jSegue.zip

    Java本地代码绑定工具jSegue是一个强大的开发工具,主要用于在Java应用程序中无缝地集成本地(C或C++)代码。这个工具提供了一种高效的方式来调用本地库,使得Java开发者能够利用Java平台无法直接支持的特定功能或者...

    Java动态代理运用之实现Xutils注入模块

    在本篇中,我们将深入探讨如何使用Java动态代理来实现Xutils的注入模块。Xutils是一个知名的Android开发框架,它提供了包括网络请求、数据库操作、图片加载等多种功能,而注入机制则是提高代码可读性和可维护性的...

    精通Java Web动态图表编程

    在“精通Java Web动态图表编程”这一主题中,我们将深入探讨如何使用Java技术在Web环境中创建交互式的动态图表。这不仅包括基本的图表绘制,还包括数据动态更新、用户交互以及性能优化等多个方面。掌握这些技能将使...

Global site tag (gtag.js) - Google Analytics