Руководство по Java Core. Наследование.

Процесс, при котором один класс получает (наследует) свойства другого класса. Если мы говорим о языке программирования Java, то под свойствами класса понимаются его поля и методы.

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

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

Рассмотрим процесс наследования на примере простого приложения.

Пример:
Класс BaseEntity


public class BaseEntity {
    int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Класс Person


public class Person extends BaseEntity{
    String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Класс PersonDemo


public class PersonDemo {
    public static void main(String[] args) {
        Person person = new Person();

        person.setId(1);
        person.setName("Person");

        System.out.println("Person info: ");
        System.out.println("id: " + person.getId());
        System.out.println("Name: " + person.getName());
    }
}

В результате работы программы мы получим, примерно следующий результат:


/*Some system messages*/
Person info: 
id: 1
Name: Person

Как мы видим, в классе Person объявлено только одно поле – name, но благодаря тому, что этот класс наследует класс BaseEntity, он получает и свойство id.

При наследовании важно учитывать тот факт, что конструкторы не являются свойствами класса, поэтому они не наследуются. Но конструктор суперкласса может быть вызван подклассом с помощью ключевого слова super.


Ключевое слово super

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

Пример:
Класс Developer


public class Developer {
    String specialty = "Developer";

    public void displaySpecialty(){
        System.out.println("Specialty: " + this.specialty);
    }
}

Класс JavaDeveloper


public class JavaDeveloper extends Developer{
    String specialty = "Java Developer";

    public void demonstrateSuperKeyword(){
        JavaDeveloper javaDeveloper = new JavaDeveloper();

        System.out.println("Getting subclass specialty:");
        javaDeveloper.displaySpecialty();

        System.out.println("Getting superclass specialty:");
        super.displaySpecialty();
    }
}

Класс DeveloperDemo


public class DeveloperDemo {
    public static void main(String[] args) {
        JavaDeveloper javaDeveloper = new JavaDeveloper();
        javaDeveloper.demonstrateSuperKeyword();
    }
}

В результате работы программы мы получим, следующий результат:


/*Some system messages*/
Getting subclass specialty:
Specialty: Developer
Getting superclass specialty:
Specialty: Developer

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


Вызов конструктора суперкласса

В примере, приведённом ниже класс Person наследует класс BaseEntity. Конструктор класса Person использует конструктор класс BaseEntity.

Пример:
Класс BaseEntity


public class BaseEntity {
    int id;

    public BaseEntity(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Класс Person


public class Person extends BaseEntity{
    String name;

    public Person(int id, String name) {
        super(id);
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Класс PersonDemo


public class PersonDemo {
    public static void main(String[] args) {
        Person person = new Person(1, "Person Name");

        System.out.println("Person info: ");
        System.out.println("id: " + person.getId());
        System.out.println("Name: " + person.getName());
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Person info: 
id: 1
Name: Person Name

Ключевое слово instanceof

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

Рассмотрим пример простого приложения.

Пример:
Класс Developer


public class Developer {
}

Класс JavaDeveloper


public class JavaDeveloper extends Developer{
}

Класс CppDeveloper


public class CppDeveloper extends Developer{

}

Класс InstanceOfDemo


public class InstanceOfDemo {
    public static void main(String[] args) {
        JavaDeveloper javaDeveloper = new JavaDeveloper();
        CppDeveloper cppDeveloper = new CppDeveloper();

        System.out.println("Is javaDeveloper instance of JavaDeveloper class: ");
        System.out.println(javaDeveloper instanceof Developer);

        System.out.println("Is javaDeveloper instance of JavaDeveloper class: ");
        System.out.println(javaDeveloper instanceof JavaDeveloper);

        System.out.println("Is cppDeveloper instance of cppDeveloper class: ");
        System.out.println(cppDeveloper instanceof CppDeveloper);
    }
}

В результате работы программы мы получим следующий результат:


/*Some system messages*/
Is javaDeveloper instance of JavaDeveloper class: 
true
Is javaDeveloper instance of JavaDeveloper class: 
true
Is cppDeveloper instance of cppDeveloper class: 
true

Как мы видим экземпляр класса наследника является также экземпляром суперкласса.

different-types-of-inheritance

На рисунке выше, схематично показаны различные типы наследования.

В этом уроке мы более глубоко изучили наследование и его реализацию в языке программирования Java. Мы также рассмотрели примеры простых приложений с его использованием.

В следующем уроке мы более глубоко изучим другой принцип ООП – полиморфизм и его реализацию в языке программирования Java.