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

При переопределении в подклассе методы экземпляра, не являющиеся частными, переопределяются, а переменные (поля) скрываются (т. Е. Затенены).
Java поддерживает множественное наследование типа и поведения (путем расширения нескольких интерфейсов), но не состояния (только single суперкласс может быть расширен подклассом).

- Ник Беннетт

Множественное наследование состояния - это возможность наследовать поля экземпляра от нескольких классов. (Java не поддерживает множественное наследование состояний.) (enthuware.com)

Множественное наследование типа / поведения - это возможность реализовать несколько интерфейсов и / или возможность расширения из нескольких классов. (Enthuware.com)

  • Единственный способ вызвать нестатический метод внутри суперкласса из подкласса - использовать ключевое слово super для ссылки на непосредственный суперкласс.
  • При вызове метода с объявленным или сгенерированным исключением, которое не было обработано, я либо объявляю то же самое, либо более общее исключение, либо оборачиваю код блоком try-catch в вызывающем методе.

Создание объекта

  • При создании любого объекта вызывается только один конструктор класса и каждый суперкласс.
  • Если у объекта нет определенного конструктора, будет вызван его конструктор по умолчанию, который, в свою очередь, вызывает конструктор без аргументов суперкласса или конструктор по умолчанию, если конструктор не создан.
  • Конструктор класса может вызывать другой конструктор в том же классе, используя ключевое слово this, за которым следует () или (аргумент).

Ошибки компиляции

База b = новая подпрограмма ();

  1. b.someMethod (); // это не будет компилироваться, если вызываемый метод не существует внутри суперкласса. Компилятор смотрит только на ссылочный тип при определении допустимости вызова метода во время компиляции.

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

Исключение

  • Пока вызывающий метод имеет объявленное более общее исключение в своем предложении throws, код должен компилироваться, даже если вызываемые методы объявили исключение в своем собственном предложении throws.
  • Допустимо переопределить базовый метод, объявляющий исключение в своих подклассах, без включения предложения throws.
  • Правило состоит в том, что метод переопределения не может вызвать исключение, которое является суперклассом исключения, созданного переопределенным методом. (Enthuware.com)
  • «Переопределяющий метод может добавлять непроверенные исключения в свое предложение throws, даже если метод в суперклассе вообще не имеет предложения throws». - Ник Беннетт

Наследование

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

Версия используемых полей определяется ссылочным типом переменной.

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

«Реализация нестатического защищенного или общедоступного метода, используемого во время выполнения (при условии, что он переопределяется одним или несколькими подклассами), определяется типом объекта (экземпляра) во время выполнения». - Ник Беннетт

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

Переопределение метода

Можно изменить тип возвращаемого значения переопределенного метода, если выполняются следующие условия:

  • Это объект (String, примитивные типы оберток, Exception).
  • Типы возвращаемых значений как для базового, так и для производного класса должны быть ковариантными.

Абстрактные методы

Если класс расширяет абстрактный класс, содержащий явные абстрактные методы, или реализует интерфейс, содержащий (неявные, явные) абстрактные методы, класс, который расширяет или реализует абстрактный класс или интерфейс, должен выполнять одно или оба из следующих действий:

  1. реализовать абстрактный метод
  2. явно объявить себя абстрактным классом

Список методов

Объект суперклассаReferenceNameA = новый суперкласс ();

Объект суперклассаReferenceNameB = новый подкласс ();

objectReferenceNameA = objectReferenceNameB

Systerm.out.println (objectReferenceNameA .getClass ())

  1. печатает базу
  2. .getClass - это общедоступный метод экземпляра в классе Object.
  3. Этот метод использует тип экземпляра или фактически созданный объект (не ссылочный тип), чтобы определить, что печатать.

PS. Если вы видите какую-либо ошибку или чувствуете себя более запутанным по поводу наследования в java. Пожалуйста, дайте мне знать. Я делюсь этим, чтобы учиться и помогать другим учиться.