Вопрос по inheritance, overloading, java – Java перегрузка и правила наследования

31

Я учился, потому что у меня экзамен, и у меня нет многих проблем с большей частью Java, но я наткнулся на правило, которое не могу объяснить. Вот фрагмент кода:

public class A {

    public int method(Object o) {
        return 1;
    }

    public int method(A a) {
        return 2;
    }
}

public class AX extends A {

    public int method(A a) {
        return 3;
    }

    public int method(AX ax) {
        return 4;
    }
}

public static void main(String[] args) {
    Object o = new A();
    A a1 = new A();
    A a2 = new AX();
    AX ax = new AX();

    System.out.println(a1.method(o));
    System.out.println(a2.method(a1));
    System.out.println(a2.method(o));
    System.out.println(a2.method(ax));
}

Это возвращает:

1 3 1 3

Пока я бы ожидал его возвращения

1 3 1 4

Почему тип a2 определяет, какой метод вызывается в AX?

Я читал о перегрузке правил и наследования, но это кажется достаточно неясным, так что я не смог найти точное правило. Любая помощь будет принята с благодарностью.

Ваш Ответ

3   ответа
1

a2 упоминается как A и JVM, используя сначала ссылку (а не действительный объект, как вы ожидали).

30

Поведение этих вызовов методов диктуется и описываетсяСпецификация языка Java (ссылка на раздел 8.4.9).

When a method is invoked (§15.12), the number of actual arguments (and any explicit type arguments) and the compile-time types of the arguments are used, at compile time, to determine the signature of the method that will be invoked (§15.12.2). If the method that is to be invoked is an instance method, the actual method to be invoked will be determined at run time, using dynamic method lookup (§15.12.4).

В вашем примере компилятор Java определяет наиболее близкое соответствие по типу компиляции экземпляра, для которого вы вызываете свой метод. В этом случае:

A.method(AX)

Ближайший метод из типа А, с подписьюA.method(A), Во время выполнения динамическая отправка выполняется наactual тип A (который является экземпляром AX), и, следовательно, это метод, который на самом деле вызывается:

AX.method(A)
@Lugaid - это именно так. Сложность в вашем примере заключается в том, что суперкласс не обеспечивает точного соответствия для аргумента, с которым вы вызываете его метод.
Спасибо, я думаю, что понял. Таким образом, по сути, компилятор Java определяет сигнатуру метода, вызываемого во время компиляции, а JVM отправляет вызов наиболее конкретному методу этой сигнатуры, как обычно. Правильно? Lugaid
4

когда вы создаете объект подкласса со ссылкой на супер класс, как здесь.

Всегда помните, что когда вы вызываете со ссылкой на суперкласс, независимо от того, принадлежит ли объект к подклассу, он перейдет в суперкласс, есть метод проверки с этим именем вместе с правильной сигнатурой или нет.

теперь, если он найдет его, чем он будет проверять, не переопределен ли он ?? если да, то он перейдет к методу подкласса, как здесь. с другой стороны, он выполнит тот же метод суперкласса.

Я могу дать вам пример этого ... просто спрятаться

public int method(A a) {
        return 3;
    }

метод & amp; проверив свой ответ, вы получите 1 2 1 2, почему, потому что он отдает первоочередное значение ссылке. потому что вы изменили его & amp; чем называть его, так что дает 3 .. !! надеюсь, это большой, но легко понять. Счастливого обучения

Похожие вопросы