【问题标题】:Why is overloaded method selected with direct superclass parameter rather than Object? [duplicate]为什么选择使用直接超类参数而不是 Object 的重载方法? [复制]
【发布时间】:2020-04-07 17:19:52
【问题描述】:
public class Main {
    static void method(A a){
        System.out.print("one");
    }

    static void method(B b){
        System.out.print("two");
    }

    static void method(Object obj){
        System.out.print("three");
    }

    public static void main(String[] args) {
        C c = new C(); 

        method(c);
    }
}
class A {}
class B extends A{}
class C extends B{}

正如您看到的标题,我认为它显示“三”,但真正的答案是“二”。任何人都可以解释我吗?谢谢!

【问题讨论】:

  • 为什么不自己跑debug呢?
  • 重载将解析为适用于参数的最具体的类型。适用于类型 C 的引用的最具体的类型是 B。
  • 我想学习java的顺序。我找不到相关教程,所有教程都显示2+2 = 4。
  • @khelwood 所以,它去最接近的类来引用,从下到上。不是吗?
  • @EmreKÖK 这取决于您在这种情况下所说的“底部”和“顶部”是什么意思。如果您的意思是继承层次结构的最底层,超类在子类之上,那么是的。

标签: java inheritance methods static overload-resolution


【解决方案1】:

重载将解析为适用于参数的最具体的类型。所有ABObject 都可以应用于C,但其中最具体的是B。所以method(B)会被调用。

如果C 没有扩展AB,则将调用method(Object)

【讨论】:

  • 感谢您的回答,这个话题的标题是什么?如何找到相关示例甚至更多?
  • 我称之为重载解析。
猜你喜欢
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-07-09
  • 1970-01-01
  • 2020-07-03
  • 2016-04-24
  • 1970-01-01
相关资源
最近更新 更多