Java: Почему метод, вызываемый внутри другого метода, вызывается автоматически с текущим вызывающим объектом в Java? - PullRequest
0 голосов
/ 08 мая 2020

У меня есть метод, который возвращает логическое значение, если два объекта (массива) имеют одинаковое среднее значение. Внутри тела метода вызывается сторонний метод (average ()). Когда вызывается сторонний метод, он вызывается автоматически для текущего объекта. Это почему?

boolean sameAvg(GenBoundedType<?> i){
        if(average() == i.average()) {
            return true;
        }
        else return false;
    }

Избыточно вызывать среднее с помощью «this»: if (this.average () == i.average ()), потому что вызов выполняется автоматически для текущего вызывающего объекта. Если кто-нибудь по доброй воле может объяснить, почему метод average () внутри sameAvg () вызывается автоматически для текущего вызывающего объекта.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

Потому что так определяется язык.

В соответствии со спецификациями

Если форма MethodName - то есть просто идентификатор - тогда:

  • [...] пусть T будет объявлением включающего типа, членом которого является метод, и пусть n будет целым числом, так что T будет n 'ое объявление лексически включающего типа класса, объявление которого сразу содержит вызов метода. Целевая ссылка - это n '-й лексически включающий экземпляр this.

Это длинный (и формальный) способ сказать, что в вашем случае this неявно добавляется перед вызовом этого метода.

1 голос
/ 08 мая 2020

В Java все объекты имеют какое-то поведение (методы). При вызове метода вы, в основном, используете конкретный объект c для выполнения определенного поведения.

В случае, если разработчик пропускает (не указывает) объект, компилятор Java предполагает, что метод вызывается на текущий объект, то есть «это».

Код вопроса можно было бы значительно улучшить, чтобы он стал более чистым и выразительным:

boolean sameAvg(GenBoundedType<?> i){
        return average() == i.average();
    }

Upd. Также следует иметь в виду, что сравнение чисел с плавающей запятой - вещь относительная. Таким образом, рассматриваемый метод может дать неожиданные результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...