一个方法可以在父类中定义而在它的子类中覆盖。考虑下面的代码:
Object o new GeometricObject();
System.out.println(o.toString());
这里的o调用哪个toString()呢?为了回答这个问题,我们首先介绍两个术语:声明类型和实际类型。一个变量必须被声明为某种类型。变量的这个类型称为它的声明类型。这里,o的声明类型是Object。一个引用类型变量可以是一个null值或者是一个对声明类型实例的引用。实例可以使用声明类型或它的子类型的构造方法创建。变量的实际类型是被变量引用的对象的实际类。这里,o的实际类型是GeometricObject,因为o指向使用new GeometricObject()创建的对象。o调用的到底是哪个toString()方法是由o的实际类型所决定的。这称为动态绑定。
动态绑定工作机制如下:假设对象o是类C1,C2,...,Cn的实例,其中C1是C2的子类,C2是C3的子类,...,Cn-1是Cn的子类。也就是说,Cn是最通用的类,C1是最特殊的类。在Java中,Cn是Object类。如果对象o调用一个方法p,那么Java虚拟机会依次在类C1,C2,...,Cn-1,Cn中查找方法p的实现,起到找到为止。一旦找到一个实现,就停止查找然后调用这个第一次找到的实现。
例如:
public class DynamicBindingDemo {
public static void main(String[] args) {
m(new GraduateStudent());
m(new Student());
m(new Person());
m(new object());
}
public static void m(Object x) {
System.out.println(x.toString());
}
}
class GraduateStudent extends Student {
}
class Student extends Person {
public String toString() {
return "Student";
}
}
class Person extends Object {
public String toString() {
return "Person";
}
}
输出:
Student
Student
Person
java.lang.Object@130c19b
匹配方法的签名和绑定方法的实现是两个独立的事情。引用变量的声明类型决定了编译时匹配哪个方法。编译器会在编译时,根据参数类型,参数个数和参数顺序找到匹配的方法。一个方法可能在几个子类中都被实现。Java虚拟机在运行时动态绑定方法的实现,这是由变量的实际类型决定的。
分享到:
相关推荐
在前端开发中,动态绑定事件是一项非常重要的技术,尤其是在处理动态创建的DOM元素时。本文将介绍使用layui框架来实现动态绑定事件的方法,并探讨其中的关键技术点。 首先,我们需要了解动态创建DOM元素后,原有的...
在 Delphi 编程环境中,动态绑定事件处理函数是一个强大的特性,它允许程序在运行时动态地连接事件和对应的处理函数,而不是在编译时静态地确定。这为开发提供了更大的灵活性,特别是在处理不确定数量的对象或者需要...
在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...
在Vue.js中,样式动态绑定是实现界面变化的关键特性之一。Vue.js提供了灵活的方式来根据数据的变化动态地切换和应用CSS类和内联样式。 首先,Vue.js核心概念之一是数据驱动。数据驱动意味着当你修改数据时,视图会...
完美的数据报表reportViewer动态绑定DataTable数据, 1.创建窗体form1 2.拖入reportViewer1 3.解决方案中添加-数据-数据集(dataset1)-工具栏中拖入DataTable到xsd界面-添加列 DataColumn1-DataColumn4 4.解决方案...
本话题将深入探讨如何实现“dataGridView动态绑定数据下拉框”的功能,即在dataGridView的某一列展示一个动态生成的下拉框,其内容来源于数据库字段,并且能够与文件列名建立对应关系,从而实现数据的导入。...
在C++编程语言中,动态绑定和静态绑定是两种关键的多态实现方式,它们对于理解和编写高效、灵活的代码至关重要。多态性允许我们通过一个共同的基类接口访问不同派生类的对象,从而提高了代码的重用性和可扩展性。 ...
通过动态绑定数据源,开发者能够轻松地更新UI以反映数据的变化,同时通过自定义模板和列布局,可以灵活地展示各种类型的数据。在实际开发中,掌握这些技巧对于创建用户友好的数据驱动应用至关重要。
VS 自带报表的创建和动态绑定数据源 VS 自带报表的创建和动态绑定数据源是指在 Visual Studio 中使用 ReportViewer 控件创建报表并动态绑定数据源的过程。本篇文章将详细介绍创建报表文件、绑定数据源和动态生成...
### 遍历CheckBoxList,获得选中项的值动态绑定CheckBoxList #### 知识点一:CheckBoxList概述及应用场景 **CheckBoxList** 是ASP.NET Web Forms中一个非常有用的控件,它允许用户选择一个或多个选项。CheckBoxList...
java实现对echarts 属性全动态设置 数据动态绑定。封装echarts 的绘图方法,使得js只需要getLine(data),getBar(data)等就可以绘制图形。echarts上的所有属性都可以在java中设置。
Delphi 中 StringGrid 动态绑定下拉列表 Delphi 中的 StringGrid 控件不同于 DbGrid 控件,它不具有内置的 PickList 属性来显示下拉列表。但是,我们可以通过编程的方式来实现 StringGrid 中的下拉列表绑定。下面将...
### WPF动态绑定不在项目中的图片 在WPF(Windows Presentation Foundation)开发中,动态绑定不在项目中的图片是一项常见的需求,特别是在需要从数据库或其他外部来源加载图片时。本文将详细介绍如何实现这一功能...
接下来,我们来谈谈如何动态绑定数据。动态绑定通常涉及以下步骤: 1. 加载数据:从数据库或其他数据源获取数据,可以使用ADO.NET、Entity Framework等工具。 2. 设置DataSource:将加载的数据赋值给GridControl的...
【ASP.Net实现SQL动态绑定Echarts图表Demo完整源码】是一个示例项目,它演示了如何在ASP.Net环境中结合Echarts图表库、C#、SQL和JSON技术来动态展示数据库中的数据。该项目的核心目标是利用后端服务器处理程序获取...
### 动态绑定DataGridView知识点详解 #### 一、概述 在.NET Framework中,`DataGridView` 控件是Windows Forms中用于展示数据的一种非常强大的工具。它能够以表格的形式展示各种类型的数据,并提供了丰富的功能来...
在iOS开发中,"动态绑定+cell自适应高度"是一个重要的技术点,它涉及到UITableView的高效使用和用户体验的提升。动态绑定是指在程序运行时,根据数据模型动态地设置UITableViewCell的内容,而cell自适应高度则是指让...
本示例中,我们将深入探讨如何实现动态绑定ASPxGridView,以便根据用户的选择从不同的数据库中加载数据。 首先,`fywtest.aspx`是ASP.NET的页面文件,其中包含ASPxGridView控件的定义。在HTML部分,你可以看到ASPx...
在Windows Forms(WinForm)应用程序开发中,动态绑定控件数据是一种常见的需求,特别是当数据来自数据库时。这里我们关注的是如何将数据库中的记录动态地显示在TreeView控件中。TreeView控件通常用于呈现层次结构的...
本项目是基于ReportViewer控件和C#编程语言实现的动态绑定RDLC数据报表程序,让我们来深入探讨这个系统的实现原理及关键知识点。 1. **ReportViewer控件**:ReportViewer是Microsoft提供的一种用于创建、设计和查看...