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

объектов, но разнообразие в том, что выполняется.

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

      Это будет считываться во время выполнения программы.

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

      Теперь посмотрим на другой пример.

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

      У них есть один параметр, который является объектом разных классов.

      И теперь мы вызываем метод p для всех элементов этого массива.

      Помните, что аргумент метода p – это vehicle в массиве vehicle.

      Поскольку каждый элемент является vehicle, строка будет напечатана для vehicle, так как метод p привязывается к телу во время компиляции.

      Помимо примера, который мы видели, private, final, и static методы также привязываются статически.

      Кроме того, атрибуты всегда привязываются статически.

      Возникает вопрос, почему все не привязывать динамически?

      Имеет смысл связывать идентификаторы с данными или кодом во время компиляции по двум причинам.

      Во-первых, чтобы выполнить первую проверку кода и выявить ошибки, а во-вторых, оптимизировать генерируемый код.

      Вот почему эта стратегия используется чаще в языках программирования.

      Однако это не работает, когда мы переопределяем метод.

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

      Тогда имеет смысл применить динамическое связывание.

      Динамическое связывание также называется «поздним связыванием».

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

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

      Небольшое напоминание, исключения – это события, которые происходят во время выполнения программы и которые нарушают нормальный поток выполнения инструкций программы.

      Мы уже видели три исключения: ArithmeticException, ArrayIndexOutOfBoundsException и NumberFormatException.

      Следующее исключение, которое мы увидим, – это исключение NullPointerException.

      Это исключение возникает при попытке программы использовать переменную, которая не имеет примитивного типа, и которая еще не была инициализирована.

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

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

      Тогда мы получим такое же исключение NullPointerException.

      Имейте в виду, что «length» – это метод в случае класса String, но поле в случае массива.

      И, если мы попытаемся получить доступ к позиции в массиве, который не был инициализирован, программа будет генерировать исключение NullPointerException, а не исключение ArrayIndexOutOfBoundsException.

      В этих

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