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

Java-方法选择算法[复制]

况安然
2023-03-14

我在摆弄方法,并在寻找,如果我创建两个名为“hello”的方法,使用它们想要的不同对象,并将“null”传递给该方法,将执行哪个方法:

    public static void main(String... args) {
        hello(null);
    }

    public static void hello(Window w) {
        System.out.println("Hello");
    }

    public static void hello(Frame f) {
        System.out.println("Bye");
    }

每次输出都是“再见”,但我仍然不明白这背后的逻辑。在与谷歌进行了简短的研究后,没有任何解释,我决定在这里提出这个问题。

我希望有人可以解释选择算法或给我一个链接到一个解释。

共有2个答案

冯澄邈
2023-03-14

Java将选择所提供的两种方法中最具体的一种(参见Java语言规范)

如果一个方法调用可以访问并应用多个成员方法,则需要选择一个成员方法来为运行时方法调度提供描述符。Java编程语言使用的规则是选择最具体的方法。

Frame的类层次结构是

java.lang.Object
    java.awt.Component
        java.awt.Container
            java.awt.Window
                java.awt.Frame

Windows的类层次结构是

java.lang.Object
    java.awt.Component
        java.awt.Container
            java.awt.Window

Frame是最具体的方法,然后将选择您的公共静态void hello(Frame f)。

丌官皓君
2023-03-14

编译器首选最专用的类型:

public class Parent {
    public static void main(String... args) {
        hello(null); // takes `Child`
    }

    public static void hello(Parent _) {
        System.out.println("SuperClass");
    }

    public static void hello(Child _) {
        System.out.println("SubClass");
    }
}

class Child extends Parent {

}

海登在评论中已经提到了原因,看看这个帖子。

 类似资料:
  • 问题内容: 我试图弄清楚Java如何选择执行哪种方法: 我在这里学到的是 方法签名是根据编译时数据类型确定的 实际调用的方法取决于调用该方法的对象的动态类型。 基于此,前两个调用的结果符合预期。但是,我不理解示例3和4的结果。 它似乎是在Java语言规范中指定的,但我不理解。 问题答案: 但是,我不理解示例3和4的结果。 好吧,让我们单独看一下。 例子3 重要的部分是表达式和的 编译时 类型。 仅

  • 我试图了解在数组中查找重复键时如何选择轴。我看到的大多数示例总是选择第一个元素作为轴心,假装这个元素在数组中是重复的。如果不是这样呢?如何正确选择轴? 假设一个数组和v分区元素,。我们还有2个指数gt和lt 小于v 所以我们的想法是从左到右扫描,直到我

  • 主要内容:选择排序算法的具体实现对数据量较少的序列实现升序或降序排序,可以考虑使用 选择排序算法,它对应的时间复杂度为 。 排序排序算法对含有 n 个元素的序列实现排序的思路是:每次从待排序序列中找出最大值或最小值,查找过程重复 n-1 次。对于每次找到的最大值或最小值,通过交换元素位置的方式将它们放置到适当的位置,最终使整个序列变成有序序列。 举个例子,我们使用选择排序算法对 {14, 33, 27, 10, 35, 19,

  • 所以我有这个代码,它应该为我提供一行的id。 我得到了以下错误: 有什么问题吗?

  • 假设当前存在一个 int 类型的数组 number,该数组中的元素依次是 13、15、 24、99、4 和 1。如果使用冒泡排序进行两两相邻比较,第一趟排序后的结果如下: 第二趟排序后的结果如下: 第三趟排序后的结果如下: 第四趟排序后的结果如下: 第五趟排序后的结果如下: 使用选择排序法也可以对上述数组中的元素进行排序,但是它与冒泡排序不同。 选择排序是指每一趟从待排序的数据元素中选出最大(或最

  • 我试图制作一个混合应用程序(使用Bridging-Header的objective c和swift),但仅将objective c用于类SWRevealViewController(左侧菜单)。我的另一个类和其他代码是Swift。 我陷入了菜单按钮(左侧的revealViewController)的操作中,更具体地说,这是objective C: 现在想在我的Swift课上用这个,我有这个: 但我