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

Наследование дает возможность одному классу получить доступ к полям и методам другого класса. Однако между этими классами должна быть логическая связь: от общего к частному.

Например, в программе ниже создаётся класс Animal (Животное).

Затем создаётся класс Cat (Кот), который с помощью ключевого слова extends наследует Animal, потому что кот — это частный случай животного, то есть кот является животным.

Животными, разумеется, являются и собака, и птица, и кенгуру и т.д., поэтому они тоже могут наследовать от Animal. То есть класс Animal общий в том плане, что от него могут наследовать классы разных конкретных животных.

При наследовании класса Animal, класс Cat получает доступ напрямую ко всем полям и методам класса Animal.

Например, если у класса Animal есть поля: количество ног, тип питания и т.д., то класс Cat, наследующий Animal, также будет обладать этими полями. И если мы создадим объект кота в методе main, то сможем обращаться к этим полям через объект кота — как будто они определены непосредственно в классе Cat. Таким образом, можно сказать, что создаётся единый объект, состоящий из данных класса Animal и класса Cat.

Рассмотрим пример:

// Это класс Животное class Animal { // У него два поля: тип питания и количество ног private String eats; private int noOfLegs; public Animal(){} public Animal(String food, int legs){ this.eats = food; this.noOfLegs = legs; } //геттеры и сеттеры public String getEats() { return eats; } public void setEats(String eats) { this.eats = eats; } public int getNoOfLegs() { return noOfLegs; } public void setNoOfLegs(int noOfLegs) { this.noOfLegs = noOfLegs; } } //Наследование реализуется с помощью //ключевого слова extends. //Cat наследует Animal. class Cat extends Animal{ private String name; private String color; Cat(){} Cat (String catName, String catColor) { name = catName; color = catColor; System.out.println(color); } public String getName(){ return name; } public void setName(String catName){ name = catName; } public String getColor(){ return color; } public void setColor(String catColor){ color = catColor; } void sayMeow(){ System.out.println(“Meow”); } } class Inheritance { public static void main(String[] args){ Cat somecat = new Cat(); //Через объект класса Cat //имеем доступ к методам //setNoOfLegs и getNoOfLegs класса Animal //благодаря наследованию. somecat.setNoOfLegs(4); System.out.println(somecat.getNoOfLegs()); } }

Вывод:

Основное преимущество наследования очевидно — уменьшение количества кода за счет того, что довольно большая часть кода может быть вынесена в класс родитель, а наследники этот код могут просто использовать, так сказать, “подключаясь” с помощью extends к классу родителю.

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

Полиморфизм

Полиморфизм в Java: переопределение методов, использование одного имени для разных задач. Практические примеры.

Time to read: 15

Абстрактный класс

Разберитесь с абстрактными классами в Java: общие концепты, абстрактные методы, ключевое слово abstract. Практические примеры.

Time to read: 16

Интерфейсы в Java

Изучите интерфейсы в Java: как определять поведение классов, ключевые слова interface и implements, отличие от абстрактных классов. Примеры кода и сравнение.

Time to read: 13