对象方法的执行过程:
1).编译器查看对象的声明类型和方法名。假设调用x.f(param),对象x中可能会存在多个f方法,它们有不同的参数类型,比如f(int), f(String), f(double)等,编译器会列举x类中所有名为f的方法和其超类中访问属性为public且名为f的方法。
经过上述过程,编译器获得所有可能被调用的候选方法。
2).编译器查看调用方法时提供的参数类型。如果所有名为f的方法中存在一个与提供的参数类型完全匹配,就选择该方法。这个过程被称为重载解析(overloading resolution)
注:方法的签名指的是方法名字,加上方法的参数列表。
1)子类覆盖父类的方法,但该方法不能拥有比父类更严格的访问控制。特别是当父类方法是public时,子类一定要是public,否则编译器将认为该方法使用的是默认的访问控制修饰符,降低了访问控制权限,因此报错了。
2)返回类型不是方法签名的一部分,在进行方法覆盖的时候,javase5之前要求返回类型要一致。但是javase5以后允许覆盖方法的返回类型为原返回类型的子类型,称之为可协变的返回类型(covariant return type)
举个例子:
public class Demo {
public static void main(String[] args) {
A a = new B();
C c = a.display() ;
c.display() ;
}
}
class A {
public C display() {
System.out.println("this is from A!");
return new C();
}
}
class B extends A {
public D display() {
System.out.println("this is from B!");
return new D() ;
}
}
class C {
public void display() {
System.out.println("this is from C!!!");
}
}
class D extends C {
public void display() {
System.out.println("this is from D!");
}
}
程序的返回结果:
this is from B!
this is from D!
这其中的B和A的display方法就是具有协变的返回类型,因为B的display方法覆盖了A的display方法,然后B的display返回的结果类型是D,D是C的子类,而A的display返回结果正好是C。因此构成可协变的返回类型(covariant return type)
3)当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用所引用对象的实际类型最合适的那个类的方法。
例如:C x = new D(); // D extends C
x.f(String);
x引用的实际类型是D,它是C的子类。如果D定义了方法f(String),就直接调用他,否则在其超类中寻找f(String),以此类推。
每次调用方法都要进行搜索,时间开销相当大。虚拟机的解决方法是,为每个类创建一个方法表(method table),列出所有方法的签名,和实际调用的方法。以后,每次调用一个方法,虚拟机只需要找这个表就可以了。
分享到:
相关推荐
Java动态绑定和内联是Java编程中的两个关键概念,它们对于理解Java的面向对象特性,尤其是多态性和性能优化有着重要的作用。 动态绑定,又称晚期绑定或运行时绑定,是Java语言的一个核心特性。它指的是在运行时而非...
在Java编程语言中,动态绑定和静态绑定是两个重要的概念,它们涉及到方法调用和多态性。了解这两个概念对于深入理解面向对象编程至关重要。本文将详细探讨它们的区别,并通过实例来阐述它们的工作原理。 首先,让...
"Java动态绑定和静态绑定用法实例详解" Java中的绑定机制是指将一个方法的调用与方法所在的类(方法主体)关联起来。Java中存在两种类型的绑定机制:静态绑定和动态绑定。 静态绑定是指在程序执行以前已经被绑定...
Java动态绑定和方法重载是面向对象编程中的两个核心概念,它们在Java程序设计中扮演着重要角色。这里我们将深入探讨这两个概念以及它们在实际应用中的实现。 首先,让我们了解什么是方法重载(Method Overloading)...
Java动态绑定的方法重载的实现.pdf
这篇文章我们将揭露JVM方法调用的静态(static binding) 和动态绑定机制(auto binding) 。 静态绑定机制 //被调用的类 package hr.test; class Father{ public static void f1(){ System.out.println(...
在Java编程语言中,静态绑定和动态绑定是两种不同的方法调用机制,它们与面向对象编程密切相关。这两种绑定方式决定了程序在运行时如何选择和执行特定的方法。 静态绑定(早期绑定),也称为编译时绑定,是指在程序...
### Java代码绑定时间:深入理解Oracle绑定变量的重要性 在Java编程中,特别是在处理与数据库交互的应用场景下,正确地使用数据库绑定变量对于提升系统性能、减少资源消耗具有至关重要的作用。本文将围绕“Java代码...
在Java编程语言中,静态绑定和动态绑定是两个至关重要的概念,它们关乎程序的执行效率和灵活性。了解这两个概念对于提升Java开发技能至关重要。 首先,我们来解释一下静态绑定(也称为早期绑定)。静态绑定主要涉及...
"Java多态中动态绑定原理解析" Java多态中动态绑定原理解析是Java面向对象程序设计中非常重要的特性,它让程序拥有更好的可读性和可扩展性。在Java中,多态是发生在继承关系中的,需要子类重写父类的方法。父类类型...
对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定。 静态绑定: 在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现。例如:C。 针对java简单的可以理解为程序编译期的...
Java中的静态绑定与动态绑定是面向对象编程中的关键概念,它们决定了方法调用的方式和时机。静态绑定(也称为早期绑定或编译时绑定)和动态绑定(也称为晚期绑定或运行时绑定)是Java中多态性实现的基石。 **静态...
以下是一些关于XML和Java绑定的关键知识点: 1. **Java API for XML Processing (JAXB)**: JAXB是Java平台标准的一部分,它提供了将Java对象转换为XML文档(对象到XML),以及从XML文档还原Java对象(XML到对象)的...
### Java绑定XML架构的技术内涵 #### 一、引言 在现代软件开发中,XML(Extensible Markup Language)被广泛应用于数据交换与存储。而Java作为一种主流的编程语言,在处理XML方面有着丰富的工具和技术支持。Java...
java实现公众号绑定域名,微信消息接收和token验证功能
在Java中实现Oracle变量的绑定方法,主要是为了优化SQL语句的执行效率,减少数据库解析负担,提升系统性能。Oracle数据库在处理SQL语句时,会先进行解析,然后将解析后的SQL语句存储在共享池(Shared Pool)中。如果...
Java与XML数据绑定是将XML文档中的数据结构映射到Java对象的过程,反之亦然。这一技术使得在Java应用程序中处理XML数据变得更加便捷,避免了手动解析和构建XML字符串的繁琐工作。本篇将深入探讨Java中XML数据绑定的...
Java中的静态绑定与动态绑定是面向对象编程中的两个核心概念,它们关系到程序的编译与运行时行为。理解这两个概念对于写出高效、灵活的代码至关重要。 首先,静态绑定(也称为前期绑定或编译时绑定)是指在编译期间...
java实现对echarts 属性全动态设置 数据动态绑定。封装echarts 的绘图方法,使得js只需要getLine(data),getBar(data)等就可以绘制图形。echarts上的所有属性都可以在java中设置。
本实例是关于如何将`Sql2000`数据库中的数据与`JComboBox`进行动态绑定,通过`JDBC`(Java Database Connectivity)接口来实现数据库连接和数据交互。 首先,我们需要理解`JComboBox`的基本用法。`JComboBox`是...