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

Еще одна важная концепция объектно-ориентированного программирования Java - наследование. Что такое наследование, станет понятнее с определенными примерами программирования.

По сути, наследование в Java имеет один родительский класс (называемый super), и второй класс как дочерний элемент родителя (подкласс).

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

В качестве примера наследования мы создадим подкласс, который будет обрабатывать информацию о бонусах за должность. Если работник занимает должность Супервайзера, он получит бонус 100$; если должность Директора филиала, бонус уже составит 200$. Если другая должность - бонус не предоставляется.

Но главное в подклассе - хранить данные бонусов отдельно от данных зарплаты.

Итак, чтоб проверить как работает наследование в Java, создайте новый класс, кликнув File > New File в меню NetBeans. Когда появится диалоговое окно, выберите Java под заголовком Categories и Java Class в разделе File Types. Нажмите Next и введите Bonuses в качестве имени вашего нового класса. Нажмите Finish.

Когда ваш новый класс будет создан, добавьте приватную переменную String и назовите его bonus. Ваш новый класс должен выглядеть следующим образом:

package firm;

public class Bonuses {
    
    private String bonus;
     
}

Для создания наследования нужно создать подкласс (дочерний) из класса Java super (родительского), для этого используется ключевое слово extends (в переводе - расширить). Затем после ключевого слова "extends" следует имя родительского класса, который вы хотите расширить. Мы хотим создать подкласс из класса Sales. Класс Sales будет классом super, а класс Bonuses - подклассом.

Чтоб создать наследование, после «public class Bonuses» в коде добавьте «extends Sales». Ваш код должен выглядеть следующим образом:

package firm;

public class Bonuses extends Sales {
    
    private String bonus;
    
}

Вы создали подкласс, который наследует код от класса Sales.

Так же, как и для класса Sales, мы можем создать конструктор для этого нового класса Bonuses. Когда мы создаем объект класса, Java в первую очередь вызывает наш конструктор.

Но! может быть вызван только один конструктор. Если мы вызовем новый конструктор из класса Bonuses, все те значения по умолчанию, которые мы устанавливали для экземпляров класса Sales, не будут установлены. Чтобы обойти это, в Java есть ключевое слово super. Оно делает вызов конструктора из класса super. Добавьте следующий конструктор в свой класс с наследованием Bonuses:

package firm;

public class Bonuses extends Sales {
    
    private String bonus;
    
    Bonuses() {
        super();
        bonus = "Бонус не предоставляется";
    }
}

Имя конструктора совпадает с именем класса: Bonuses. Первая строка в фигурных скобках - это вызов super (обратите внимание на круглые скобки после super). Когда выполнится эта строка, все экземпляры по умолчанию, которые мы установили в Sales, будут установлены. Если уберите строку с наследованием (extends имя класса), то ничего не получится!

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

Чтобы проверить свой новый класс, использующий наследование, вернитесь к классу Branch, классу с методом main. Закомментируйте весь код, который у вас есть. Быстрый способ сделать это - выделить весь код, а затем кликнуть по значку Закомментировать на панели инструментов NetBeans:

Закомментировать строки в NetBeans

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

Теперь добавьте следующую строку, чтобы создать новый объект класса:

Bonuses a1 = new Bonuses();

Ваше окно кода должно выглядеть примерно так:

Проверка наследования 1

Имя объекта просто a1. Тип объекта - это объект Bonuses с наследованием.

Чтобы проверить, что вы можете получить доступ к методам из родительского класса Sales, добавьте эту строку под новым объектом a1:

String salary = a1.salaryWorker(650);

Это точно так же, как вы делали раньше: вызывали метод salaryWorker класса Sales. Однако на этот раз вы используете объект Bonuses, а не объект Sales.

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

Проверка наследования 2

Запустите программу, чтобы увидеть следующее окно вывода:

Проверка наследования вывод

Таким образом, метод из родительского класса (класса super) был вызван в действие. Наследование помогло нам обратиться к родительскому классу, что очень удобно!

Теперь мы можем добавить метод в дочерний класс (подкласс).

Добавьте следующий метод в свой класс Bonuses, прямо под конструктором:

package firm;

public class Bonuses extends Sales {
    
    private String bonus;
    
    Bonuses() {
        super();
        bonus = "Бонус не предоставляется";
    }
    
    String BonusAward(String posAbb) {
       
        String aPosition = pos(posAbb);
        
        if (aPosition.equals("Супервайзер")) {
            this.bonus = "Бонус 100$";
        }
        else if (aPosition.equals("Директор филиала")) {
            this.bonus = "Бонус 200$";
        }
        else {
            this.bonus = "Бонус не предоставляется";
        }
        
        return this.bonus;
    } 
}

Метод называется BonusAward и он настроен на возврат значения String. В круглых скобках метода мы указываем должность работника.

Первая строка метода такова:

String aPosition = pos(posAbb);

Метод pos является методом в родительском классе. Это тот, который мы создали в Sales. Этот метод был настроен так, чтобы возвращать полный текст должности: «Менеджер по продажам», «Супервайзер» и т. д. Сейчас мы вызываем его из дочернего класса. Оператор if проверяет значение строки aPosition. В зависимости от значения возвращается новая строка с присвоением определенного бонуса: 100$, 200$ или без бонуса.

Нажмите обратно на класс Branch и добавьте следующую строку, которая использует наш класс с наследованием:

String award = a1.BonusAward("СП");

Эта строка вызывает новый метод и передает ему значение «СП». Результат возвращается в строку, которую мы назвали award.

Добавьте в печать переменную award:

System.out.println(salary + " " + award);

Ваш класс Branch должен выглядеть следующим образом (мы удалили все комментарии):

package firm;

public class Branch {

    public static void main(String[] args) {
        
        Bonuses a1 = new Bonuses();
        
        String salary = a1.salaryWorker(650);
        String award = a1.BonusAward("СП");
        
        System.out.println(salary + " " + award);
    }
    
}

А вот окно вывода при запуске программы:

Вывод программы Экзамен дипломы

То есть мы использовали наследование в Java, чтобы отделить данные зарплаты от данных бонуса. Дочерний класс (подкласс) получил доступ к методам своего родителя (super). Затем мы смогли вывести данные из обоих классов.

Таким образом, наследование увеличивает (расширяет) полезность родительского класса. Вы храните данные отдельно, помещая их в дочерний класс. Но child («ребенок») связан с parent («родителем») и может получить доступ к некоторому или всему его коду. Как и остальные классы, он так же работает, делая свою работу!

В следующем разделе вы узнаете, как обрабатывать ошибки в Java.

Дата обновления: 28.08.2019

  • Текущий 4.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

/Рейтинг: 4.0/5 (1 голос(ов) всего)

Добавить комментарий (без регистрации)