Процесс, при котором один класс получает (наследует) свойства другого класса. Если мы говорим о языке программирования 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
Как мы видим экземпляр класса наследника является также экземпляром суперкласса.
На рисунке выше, схематично показаны различные типы наследования.
В этом уроке мы более глубоко изучили наследование и его реализацию в языке программирования Java. Мы также рассмотрели примеры простых приложений с его использованием.
В следующем уроке мы более глубоко изучим другой принцип ООП – полиморфизм и его реализацию в языке программирования Java.