Скачать книгу

и перегрузка

      Теперь давайте рассмотрим две концепции, которые выглядят взаимосвязанными, но на самом деле являются разными, это перегрузка и переопределение.

      Обе эти концепции применяются к методам.

      Ранее мы говорили о конструкторах.

      Помните, что у нас был автомобиль с двумя полями, lights и color.

      И мы определили в одном классе не один, а несколько конструкторов.

      Имена этих конструкторов были одинаковыми, но параметры были разные.

      И это важно, чтобы список параметров был другим.

      Вы не можете определить два конструктора с одним и тем же именем, и одним и тем же списком параметров.

      Фактически, Java понимает, какой конструктор вызвать, просматривая параметры.

      И то, что мы делали для конструкторов, также применимо для методов.

      Мы говорим о перегрузке, когда у нас есть разные методы с тем же именем, но разным списком параметров.

      С другой стороны, мы ввели переопределение, когда мы хотели изменить поведение метода, унаследованного от суперкласса.

      В этом примере метод toString суперкласса переопределяется в подклассе с помощью метода с тем же именем, и теми же параметрами, и возвращаемым типом, но другим телом метода.

      Важно, чтобы параметры и возвращаемый тип были одинаковыми.

      Отличалось только тело метода.

      И в пределах одного класса мы можем перегрузить метод.

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

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

      Неправильно пытаться перегрузить метод, просто изменив возвращаемый тип.

      Если мы это сделаем, мы получим ошибку компилятора.

      То же самое произойдет, если мы просто изменим имена параметров.

      В этом случае определенный метод не изменится вообще.

      И мы также получим ошибку компилятора.

      Когда мы определяем метод, мы связываем идентификатор – имя метода – с некоторым кодом – телом метода.

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

      Например, используя объявление метода, мы связываем идентификатор sq с методом, который отображает целые числа в целые числа, возводя число в квадрат.

      Идентификатор sq всегда привязан к методу в соответствующей области кода.

      Во многих языках, которые не являются объектно-ориентированными, эта привязка выполняется обычно во время компиляции.

      Во время выполнения эта привязка зафиксирована.

      И это называется «ранним» или «статическим» связыванием.

      Но этот способ не соответствует концепции полиморфизма и переопределения методов в производных классах.

      Здесь мы хотим точно противоположного – чтобы часть кода была не привязана

Скачать книгу