方法重载和重载

时间:2019-06-14 07:09:34

标签: java eclipse overriding overloading

我有下面列出的代码。为什么打印:“ 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);
    }
}

2 个答案:

答案 0 :(得分:0)

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

a.greet(b);

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

a.greet(a);

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

b.greet(a);

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

b.greet(b);

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

答案 1 :(得分:0)

初始化时

  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。