При объявлении, класс может наследовать (extends) один класс и реализовывать (implements) несколько классов или интерфейсов. Это значит, что он будет иметь несколько типов одновременно. Например:
Получается, что каждый экземпляр класса D будет иметь тип D, но вы также сможете использовать его там, где требуются экземпляры A, B или С. Это значит, что каждый экземпляр D будет также иметь типы A, B и C.
===== Расширение (наследование) =====
Когда вы расширяете (extends) класс, ваш класс наследует все публичные и приватные не-статические поля. Поэтому вы можете использовать их в своём классе, как будто они были объявлены в нём. Также вы можете переопределить метод, заново описав его (для этого он должен иметь такое-же кол-во аргументов с теми же типами). Ваш класс не наследует статические поля.
Из переопределённого метода, вы всё ещё имеете доступ к методу суперкласса, используя super :
В конструкторе вашего класса вы можете вызывать конструктор суперкласса, также используя super :
===== Реализация =====
Если ваш класс реализует (implements) класс или интерфейс, ваш класс обязан реализовать все поля, объявленные или унаследованные реализуемым классом, с тем же типом и названием. При этом поле может уже быть унаследованным от суперкласса.
===== Интерфейсы =====
Интерфейсы это прототипы классов. Они объявляются с помощью ключевого слова interface. По умолчанию все поля интерфейсов являются публичными (public). Интерфейсы не могут иметь экземпляров.