【问题标题】:Method overriding and overloading方法覆盖和重载
【发布时间】:2019-06-14 07:09:34
【问题描述】:

我有下面列出的代码。为什么打印:“V”-“greet(Z)”-“greet(Z)”?我会说“V”-“greet(V)”-“greet(Z)”,但似乎我在方法重载和覆盖方面遗漏了一些要点,有人可以解释我和/或链接一些资源来掌握这个?

class Z {

    public void me() {
        System.out.print(" Z");

    }

    public void greet(Z z) {
        System.out.print ("greet(Z)");
    }

}
class V extends Z {

    @Override
    public void me() {
        System.out.println("V");
    }

    public void greet(V v) {
        System.out.println("greet(V)");
    }
}
public  class Quiz{
    public  static void main(String[] args) {

        Z a = new V();
        V b = new V();
        a.me();
        System.out.print("-");
        a.greet(b);
        System.out.print("-");
        a.greet(a);
    }
}

【问题讨论】:

  • 您的误解是关于声明和实例化,而不是关于覆盖/重载。 a 被声明为 Z 类型,而不是 V 类型。
  • 这个我知道,但是当我使用方法a.greet(b)时为什么它使用Z的greet方法。这不是应该使用动态类型方法吗?
  • aZ 类型的对象,并且只有 Z 类型的对象,没有可能的覆盖方法可以在那里调用。
  • @karalis1 正如我在第一条评论中所说:a 被声明为 Z 类型,而不是 B 类型。所以它正在使用它应该使用的东西。
  • 你覆盖me(),因为它的签名被完全复制,但重载great(),因为使用了不同的参数类型。所以 a.great(...) 在类 Z 上被调用,无论传递的值如何,总是打印“greet(Z)”

标签: java eclipse overriding overloading


【解决方案1】:

public void greet(V v)public void greet(Z z) 的重载版本:前者不会覆盖后者。

a.greet(b);

aZ 类型,只有一种方法可供选择:greet(Z z)

a.greet(a);

aZ 类型,仍然只有一种方法可供选择:greet(Z z)

b.greet(a);

bV 类型,有两种方法可供选择。由于aZ 类型,因此将选择最合适的greet(Z z)

b.greet(b);

bV 类型,有两种方法可供选择。由于bV 类型,因此将选择最合适的greet(V V)

【讨论】:

    【解决方案2】:

    当你初始化时

      V b = new V();
    

    b 有一个 V 的引用,并且创建了 V 类型的对象 所以当你打电话时

     a.greet(b);
    

    它将首先查看接受 V 类型参数的 V 类。

    但是在第一行

    Z a = new V();
    

    您正在创建 V 的对象,但类型是 Z。所以调用时

    a.greet(b);
    

    只会接受类型Z。因为V中的greet方法被重载接受类型V。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      相关资源
      最近更新 更多