当前位置: 首页 > 知识库问答 >
问题:

Java中的方法绑定

吴丁雷
2023-03-14

我最近在读Java中的思维(第四版)时,遇到了一个关于Java中方法绑定的问题。首先让我们看看书中的两个定义:

  1. 将方法调用连接到方法体称为绑定。
  2. Java中的所有方法绑定都使用后期绑定,除非方法是静态的或最终的。

您可以在多态性章节的方法调用绑定一节中找到这些定义。(第281-282页)

public class Test3{
    public static void main(String[] args) {
        BindingTest_Sub sub1 = new BindingTest_Sub();
        BindingTest_Base sub2 = new BindingTest_Sub();

        sub1.ovrLd(new Integer(1));       //  statement 1
        sub2.ovrLd(new Integer(2));       //  statement 2
        sub2.ovrRd();                     //  statement 3
    }
}

class BindingTest_Base {
    void ovrLd(Object obj){
        System.out.println("BindingTest_Base ovrLd()");
    }
    void ovrRd(){
        System.out.println("BindingTest_Base ovrRd()");
    }
}

class BindingTest_Sub extends BindingTest_Base{
    void ovrLd(Integer i){
        System.out.println("BindingTest_Sub ovrLd()");
    }
    void ovrRd(){
        System.out.println("BindingTest_Sub ovrRd()");
    }
}
BindingTest_Sub ovrLd()
BindingTest_Base ovrLd()
BindingTest_Sub ovrRd()
    null

共有1个答案

屠锦
2023-03-14

TL;DR;您并没有真正重载ovrld(Object),而不是在运行时重载。编译器使用编译时类型信息来决定哪个是要调用的最佳虚方法sub1sub2具有不同的编译时类型。sub1的类型与OVRLB(Integer)有不同的最佳匹配。

解释。你在想:

  • 如果sub1.ovrld(新整数(1))调用bindingtest_sub.ovrld(整数)
  • 那么为什么sub2.ovrld(new Integer(2))调用bindingtest_base.ovrld(Object)
aload 1   // sub1
// ... blah blah blah creating the integer
// the last opcode issued by the compiler for "statement 1"
INVOKEVIRTUAL com/ea/orbit/actors/samples/helloworld/BindingTest_Sub.ovrLd (Ljava/lang/Integer;)V

aload 2  // sub2
// ... blah blah blah creating the integer
// the last opcode issued by the compiler for "statement 2"
INVOKEVIRTUAL com/ea/orbit/actors/samples/helloworld/BindingTest_Base.ovrLd (Ljava/lang/Object;)V
 类似资料:
  • 绑定不匹配:类型的泛型方法不适用于参数()。推断的类型不是有界参数的有效替代品。 使用以下代码: 为什么这个无效?扩展,那么为什么与不匹配呢? 我如何约束element()方法接受资源类对象或任何资源子类对象作为参数?

  • 相信 Python 程序员多多少少都和我一样遇到过 Method Unbound Error,直译过来就是 “方法未绑定错误”,虽然搜索之后知道了使用 @classmethod 这样的装饰起后就可以解决问题, 但是一直没有得到完全解惑。 我们知道,Python 是一个动态语言,在类的创建过程中甚至实例化以后都能动态地修改其方法、 属性,这种做法通常被称为“Monkey Patching”,虽然我们

  • 本文向大家介绍Python中绑定与未绑定的类方法用法分析,包括了Python中绑定与未绑定的类方法用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python中绑定与未绑定的类方法。分享给大家供大家参考,具体如下: 像函数一样,Python中的类方法也是一种对象。由于既可以通过实例也可以通过类来访问方法,所以在Python里有两种风格: 未绑定的类方法:没有self 通过类来引用方

  • 本文向大家介绍详解python方法之绑定方法与非绑定方法,包括了详解python方法之绑定方法与非绑定方法的使用技巧和注意事项,需要的朋友参考一下 写在之前 在 Python 的类里面除了属性之外,还有方法,当然也有文档和注释这类东西,但是这个只是人来看,计算机则不关心。我们之前说过,我们一般用实例调用方法,既然我们说了是一般,那么就说明还有其他调用方法的方式,今天我们就来说一下「绑定方法和非绑定

  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py

  • 问题内容: 昨天我接受了两个小时的技术电话面试(我通过了,woohoo!),但是我完全想出了以下有关Java动态绑定的问题。令人困惑的是,几年前我曾当过助教时曾向大学生教授这一概念,所以我给他们提供错误信息的前景有点令人不安… 这是给我的问题: 我断言输出应该是覆盖方法中的两个单独的打印语句:和。后一种情况是显而易见的,而在前一种情况下,即使t1具有Object类型的引用,也将其实例化为Test类