Java - методы связываются во время выполнения - PullRequest
0 голосов
/ 06 августа 2020
public class Any {

    public static void main(String[] args) {
        A ab = new **B**();
        System.out.println(ab.calc(2.0, 3.1));
    }
}

class A {
    public int calc(int a, int b) {
        return a+b;
    }
}

class B extends A {
    public double calc(double a, double b) {
        return a+b;
    }
}

Может кто-нибудь, пожалуйста, помогите мне понять, почему строка 4 выдает ошибку: «Метод cal c (int, int) в типе A не применим для аргументов (double, double)»

Я понимаю, что методы связаны во время выполнения; какой метод выполнить, зависит от типа объекта, для которого он вызван. Метод cal c вызывает в классе B . Почему компилятор ищет метод в классе A.

Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 06 августа 2020

Компилятор ищет в классе A, потому что ab имеет тип

Вам необходимо понимать разницу между полиморфизмом времени компиляции и полиморфизмом времени выполнения.

Перегрузка метода - это полиморфизм времени компиляции, а компилятор всегда проверьте для справки. Поскольку ab имеет ссылку (тип) A, компилятор проверит соответствие метода в классе A. В этом случае он не найдет соответствующий метод, который принимает в качестве аргумента double. Следовательно, это вызывает ошибку.

0 голосов
/ 07 августа 2020

У вас может быть полиморфизм времени выполнения в Java, когда вы внезапно загружаете подкласс A по имени, которое было написано кем-то другим и которое никогда не было замечено во время вашей компиляции. Поскольку это может произойти, HotSpot может не выбирать встроенный код или выполнять другие агрессивные оптимизации, которые должны быть отменены в случае динамической загрузки класса. Хотите верьте, хотите нет, но HotSpot все еще может оптимизировать и встраивать такие горячие методы. Он резко тормозит и отменяет оптимизацию, когда подкласс динамически загружается! Позже он может даже повторно встроить код. Настоящая уловка. Если вы хотите, чтобы ваш код выполнялся быстрее, дайте HotSpot больше шансов на оптимизацию, сохраняя участников как можно более приватными и окончательными. В любом случае это хорошо для вашего дизайна. Например, создание класса B final - это обещание, что ни один класс не сможет дополнительно специализировать метод cal c. Затем, если вы работаете с B, точка доступа может встроить код для этого метода, если он находится на al oop, и можно быть уверенным, что это безопасно и эффективно.

...