本文转 “子 孑” 博客:
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:
调用的成员:儿子属性
分享到:
相关推荐
在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...
Java动态绑定和方法重载是面向对象编程中的两个核心概念,它们在Java程序设计中扮演着重要角色。这里我们将深入探讨这两个概念以及它们在实际应用中的实现。 首先,让我们了解什么是方法重载(Method Overloading)...
本篇将深入探讨Java中XML数据绑定的相关概念、技术和实践。 首先,Java中XML数据绑定的主要API有JAXB(Java Architecture for XML Binding)和DOM(Document Object Model)。JAXB允许开发者在Java类和XML之间进行...
在Java编程中,将列表框(JList)与数据库绑定是一项常见的任务,它允许用户从数据库中的数据动态地创建交互式列表。这种技术在开发基于Java的桌面应用程序时非常实用,尤其是在需要显示大量数据供用户选择的情况下...
本文主要探讨了如何利用Castor实现SQL数据绑定,这一特性使得开发者可以更方便地处理Java对象与SQL数据库之间的数据转换,从而简化数据持久化的复杂性。 SQL数据绑定的概念是基于XML数据绑定的延伸,它是在SQL...
本文将详细探讨如何使用Castor实现SQL数据绑定。 首先,理解SQL数据绑定的概念至关重要。它是将Java对象的属性映射到SQL数据库的表、列上的过程,类似于XML数据绑定,只是数据交换的媒介由XML文档替换为SQL数据库。...
本主题将深入探讨Java如何实现线程亲和性,以及其背后的原理和实践应用。 首先,线程亲和性有助于减少因线程在不同核心之间迁移产生的额外开销,这种开销包括缓存失效和上下文切换。当线程长时间运行在同一个核心上...
在本篇文章中,我们将深入探讨Java中的动态任务调度,特别是使用开源库Quartz进行任务管理。 Quartz是一个功能强大的开源作业调度框架,它提供了丰富的API来创建、管理和执行定时任务。Quartz能够与各种持久化存储...
在本文中,我们将深入探讨如何在Java Hibernate应用中实现不同数据库之间的动态切换。 首先,我们需要理解Hibernate的核心配置文件`hibernate.cfg.xml`。在这个文件中,通常会指定数据库连接的信息,如URL、用户名...
下面我们将详细探讨Java在创建动态仪表盘方面的技术要点。 1. **JavaFX或Swing用于图形界面** - JavaFX是Java提供的一种现代GUI工具包,适用于构建桌面应用,具有丰富的图形元素和动画支持,适合创建动态仪表盘。 ...
在标题“java socket nginx tcp转发 用户真实IP测试”中,主要探讨的是如何在Java的Socket连接中,通过Nginx的TCP转发获取到实际用户的IP地址。 在描述中提到的博客文章,很可能是详细介绍了这个问题的解决方案。...
3. **数据绑定和数据驱动**:在Web应用中,动态图表通常需要与后端数据库或服务器端的数据进行绑定。书中可能会讲解如何使用JDBC(Java Database Connectivity)来连接和操作数据库,以及如何将查询结果映射到图表上...
在这个主题中,我们将深入探讨Java WebService服务的动态配置,以及与Oracle数据库备份和后台配置界面相关的知识点。 首先,Java WebService基于标准如SOAP(Simple Object Access Protocol)和WSDL(Web Services ...
本篇文章将详细探讨如何通过RoboVM与libGDX进行绑定,以利用Java调用iOS的静态库.a。 首先,RoboVM是一个开源的Java虚拟机,它允许Java和Scala代码直接在iOS设备上运行,从而打破了Java只能在Android平台上运行的...
总的来说,网络MAC与IP交换机绑定是网络管理中的一个重要环节,它通过Java编程实现,结合交换机的配置,可以增强网络的安全性和可控性。了解并掌握这一技术对于IT专业人士来说是非常必要的,尤其是在维护大型网络...
在本篇文章中,我们将详细探讨如何在Java中为`JButton`设置快捷键。 首先,我们需要了解快捷键的基本概念。快捷键通常由一个或多个按键组成,例如Ctrl+C用于复制,它们可以帮助用户快速执行特定操作而无需通过鼠标...
Java本地代码绑定工具jSegue是一个强大的开发工具,主要用于在Java应用程序中无缝地集成本地(C或C++)代码。这个工具提供了一种高效的方式来调用本地库,使得Java开发者能够利用Java平台无法直接支持的特定功能或者...
在本篇中,我们将深入探讨如何使用Java动态代理来实现Xutils的注入模块。Xutils是一个知名的Android开发框架,它提供了包括网络请求、数据库操作、图片加载等多种功能,而注入机制则是提高代码可读性和可维护性的...