Переопределение метода и перегрузка - PullRequest
1 голос
/ 14 июня 2019

У меня есть код, указанный ниже.Почему он печатает: "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 голосов
/ 14 июня 2019

При инициализации

  V b = new V();

b имеет ссылку на V и объект создается типа V поэтому, когда ты звонишь

 a.greet(b);

Сначала он изучит класс V, принимающий параметр типа V.

Но в первой строке

Z a = new V();

Вы создаете объект V, но тип Z. Поэтому при вызове

a.greet(b);

будет принимать только тип Z. Поскольку метод greet в V перегружен для приема типа V.

0 голосов
/ 14 июня 2019

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).

...