Рубрики
Без рубрики

Серия ООП: Наследование в Java

ВВЕДЕНИЕ Объектно-ориентированное программирование (ООП) – это парадигма программирования, основанная на… Помеченный как java, наследование, ооп.

вступление

Объектно-ориентированное программирование (ООП) – это парадигма программирования, основанная на концепциях Объектов и Классы . Он позволяет группировать или собирать связанные объекты в классе и создает функциональные возможности для использования классом с помощью методов. Объектно-ориентированное программирование состоит из четырех столпов или принципов, известных как:

  • Наследование
  • Полиморфизм
  • Абстракция Данных
  • Инкапсуляция

Эти четыре принципа определяют объектно-ориентированный язык. В этой статье мы рассмотрим Наследование .

содержание

  1. Необходимые знания
  2. Наследование
  3. Прямой и косвенный суперкласс
  4. Композиция против Наследование
  5. Студенческий класс
  6. Вывод

НЕОБХОДИМЫЕ ЗНАНИЯ

В этой статье объясняется концепция наследования с использованием языка программирования Java. Таким образом, вам необходимы следующие знания Java:

  • Базовое понимание ООП.
  • Методы.
  • Классы и объекты. Если вы новичок в Java или плохо разбираетесь в ней, вам не помешает проверить Разбивка Hello World на Java где мы проходим через строительные блоки простой Java-программы.

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

Наследование является одним из четырех столпов парадигмы объектно-ориентированного программирования. Наследование – это концепция, которая позволяет нам создавать новые классы из существующего класса путем приобретения или наследования свойств этого класса. А также, добавив больше функциональности в новый класс. Возьмем, к примеру, семейную иерархию: дети проявляют некоторые черты либо матери, либо отца. Некоторые из этих характеристик могут включать:

  • цвет кожи
  • высота
  • размер

Здесь мы можем сказать, что ребенок наследует эти характеристики от родителя. Поскольку эти характеристики присутствуют в родителе. Иногда ребенок может унаследовать не только черты родителя, но и черты бабушки и дедушки. В других случаях ребенок может унаследовать характеристики как родителя, так и бабушки с дедушкой и по-прежнему проявлять их характеристики, которые делают ребенка уникальным. Это основная концепция наследования в ООП. Наследование позволяет нам вывести новый класс из существующего класса. Существующий класс, из которого мы можем вывести новые классы, называется суперклассом в Java. Он также известен как базовый класс или родительский класс в некоторых других языках, таких как C++. В то время как новый производный класс называется подклассом в Java. Он также известен как производный или дочерний класс также в некоторых других объектно-ориентированных языках.

Некоторые преимущества, которые дает наследование, заключаются в следующем:

  • Возможность повторного использования: Это позволяет повторно использовать код, написанный нами или другими программистами. Следовательно, избегая изобретать велосипед .
  • Гибкость: Когда нам нужно обновить какую-либо группу классов, наследование позволяет нам обновлять только суперкласс. Вместо того, чтобы обновлять все затронутые классы.
  • Избыточность: Наследование позволяет нам писать меньше кода и опираться на предыдущие. Тем самым сокращая избыточность и поощряя более чистый код.
  • Скрытие данных: использование частных переменных экземпляра, а также методов установки и получения для доступа к ним. Это позволяет ограничить доступ к переменным класса.

Прямой и косвенный суперкласс

Мы можем разделить суперклассы на два типа: прямой суперкласс и косвенный суперкласс. Прямой суперкласс – это непосредственный класс, от которого наследуется новый класс в иерархии классов. Это класс, расположенный непосредственно над новым классом в дереве иерархии наследования. Косвенный суперкласс – это любой класс в иерархии наследования выше прямого суперкласса. Новый класс напрямую не наследует никаких атрибутов от косвенного суперкласса, но получает эти атрибуты от прямого суперкласса. Все классы в Java прямо или косвенно наследуются от класса Object , который можно найти в java.lang. Объект . Класс Object предоставляет некоторые функциональные возможности, такие как equals() (который проверяет, равны ли два объекта), getClass() (который возвращает класс среды выполнения определенного объекта), toString() (который возвращает строку, содержащую имя класса, экземпляром которого является объект, и шестнадцатеричное представление хэш-кода объекта без знака), notify() , notifyAll() и многие другие, которые могут использовать подклассы объекта.

Композиция против Наследование

Java обеспечивает поддержку только одного наследования. В отличие от других языков программирования, таких как C++, которые поддерживают как одиночное, так и множественное наследование. При одиночном наследовании мы можем вывести класс только из одного прямого суперкласса, в то время как при множественном наследовании мы можем вывести класс из более чем одного суперкласса. Связь, которая может существовать между двумя классами, может быть либо является отношением, либо имеет- a отношения. Отношения Is-a подразумевают наследование, в то время как отношения has-a подразумевают композицию. При наследовании мы можем рассматривать объект подкласса как объект суперкласса. Например, если класс Rectangle расширяет класс Shape, то Прямоугольник является формой , и, следовательно, мы можем рассматривать его как Фигуру. В композиции класс может иметь ссылки на объекты других классов в качестве своего члена. Например, у каждого студента есть курс обучения, поэтому необходимо включить ссылку на класс курса в качестве члена класса студентов. В этом случае мы можем сказать, что у каждого студента есть Курс.

Студенческий класс

В этой статье мы рассмотрим класс Student , чтобы объяснить концепцию наследования. Ниже приведено изображение, на котором показаны некоторые классы, которые мы можем вывести из класса учащихся и их иерархических отношений.

Здесь мы можем считать класс Student базовым классом всех классов. Бакалавриат и Выпускник наследуется непосредственно от класса Student. Первый год и Второй год наследуются непосредственно от класса бакалавриата. В этом случае Первый год и второй год имеют косвенное наследование по отношению к классу студентов и прямое наследование по отношению к классу бакалавриата. Начиная с первого и второго курсов, они наследуются непосредственно от бакалавра, но не непосредственно от студенческого класса.

package Inheritance;

// Student.java
public class Student {

    private String firstName;
    private String lastName;
    private String studentId;

    public Student(String firstName, String lastName, String studentId) {
        // validate first name
        if (!(firstName.matches("[A-Z][a-zA-Z]+"))) 
            throw new IllegalArgumentException("Invalid first name.");

        // validate last name
        if (!(lastName.matches("[a-zA-Z]+(['-][a-zA-Z]+)*")))
            throw new IllegalArgumentException("Invalid last name");

        // validate student id
        if (studentId.length() == 0)
            throw new IllegalArgumentException("Invalid ID");

        this.firstName = firstName;
        this.lastName = lastName;
        this.studentId = studentId;
    }

    // set and get methods

    public void setFirstName(String firstName) {
        if (!(firstName.matches("[A-Z][a-zA-Z]+"))) 
            throw new IllegalArgumentException("Invalid first name.");

        this.firstName = firstName;        
    }

    public String getFirstName() {
        return firstName;
    }

    public void setLastName(String lastName) {
        if (!(lastName.matches("[a-zA-Z]+(['-][a-zA-Z]+)*")))
            throw new IllegalArgumentException("Invalid last name");

        this.lastName = lastName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setStudentID(String studentId) {
        if (studentId.length() == 0)
            throw new IllegalArgumentException("Invalid ID");

        this.studentId = studentId;
    }

    public String getStudentId() {
        return studentId;
    }

    @Override
    public String toString() {
        return String.format("%s: %s%n%s: %s%n%s: %s%n", 
                "Student ID", getStudentId(), "First Name", getFirstName(),
                "Last Name", getLastName());
    }
}

Student.java первый начинается с объявления и инициализации полей частного экземпляра своего экземпляра. Напомним, что любое поле или элемент, объявленные закрытыми, доступны только для одного класса, поэтому поля экземпляра, объявленные в классе Student, недоступны за пределами класса. Вот тут-то и приходят на помощь методы set и get. В этом случае методы set сначала проверяют введенные значения, прежде чем предоставлять их классу для использования, и выдают ошибку с содержательным сообщением пользователю. Это означает, что любому классу, расширяющему класс учащихся, больше не нужно проверять свое имя, фамилию и студенческий билет, потому что класс учащихся уже обработал это. Это одно из преимуществ наследования. Это мешает программистам изобретать велосипед заново. Это ускоряет производство, а также снижает сложность программы, поскольку некоторые реализации выполняются в суперклассе. Метод toString() в конце также показывает, что класс Student переопределяет один из своих методов суперкласса, используя аннотацию @Override. Напомним, что каждый класс в Java по умолчанию прямо или косвенно расширяет суперкласс Object, поэтому нам не нужно явно расширять класс Object при объявлении класса Student. Это также показывает, что подклассы могут изменять или увеличивать возможности членов суперкласса, просто переопределяя их в подклассе.

Следующая программа, содержащая класс бакалавриата, наследует свойства класса Student.

package Inheritance;

// Undergraduate.java
public class Undergraduate extends Student{

    private int year;

    public Undergraduate(String firstName, String lastName, String studentId, int year) {
        super(firstName, lastName, studentId);

        this.year = year;
    }

    // set and get methods
    public void setYear(int year) {
        this.year = year;
    }

    public int getYear() {
        return year;
    }

    @Override
    public String toString() {
        return String.format("%sYear: %s%n%s%n", super.toString(), getYear(), "Undergraduate Student");
    }
}

Undegraduate.java сначала начинается с объявления класса путем расширения/наследования от класса Student с использованием ключевого слова extends . extends – это ключевое слово в Java, которое мы используем для реализации наследования, и оно может расширять только один класс, поскольку Java поддерживает только одно наследование. Программа продолжила, объявив поле экземпляра, а затем объявив конструктор с параметрами. Затем рядом с инициализацией переменной суперкласса с использованием ключевого слова super . За этим сразу же последовал набор круглых скобок, содержащих аргументы конструктора суперкласса. super также является ключевым словом в Java, и подклассы используют его для инициализации переменных конструктора суперкласса. Java требует, чтобы первой задачей любого конструктора подкласса был вызов конструктора его прямого суперкласса. | Нам больше не нужно проверять имя, фамилию и идентификатор студента, потому что суперкласс уже справился с этим. И мы можем получить к ним доступ с помощью super. за которыми следуют их методы get. Подобно классу Student, класс бакалавриата также имеет свой собственный метод toString() , который использует super.toString() Строковое представление суперкласса. Мы можем получить доступ к членам суперкласса с помощью

super.toString();

Следующая программа, содержащая Выпускной класс, также наследуется от студенческого класса

package Inheritance;

// Graduate.java
public class Graduate extends Student{

    private String program;

    public Graduate(String firstName, String lastName, String studentId, String program) {
        super(firstName, lastName, studentId);

        this.program = program;
    }

    // set and get methods

    public void setProgram(String program) {
        this.program = program;
    }

    public String getProgram() {
        return program;
    }

    @Override
    public String toString() {
        return String.format("%sProgram: %s%n%s%n", 
                super.toString(), getProgram(), "Graduate Student");
    }
}

Подобно классу бакалавриата, выпускной класс также расширяет класс студентов. И содержит переменную экземпляра и конструктор, который принимает значения для инициализации переменных суперкласса. Реализация выпускного класса аналогична классу бакалавриата. Основная цель выпускного класса — показать, как несколько подклассов могут наследовать от одного класса суперкласса-студента. Следующая программа содержит класс StudentTest , который реализует как классы бакалавриата, так и для выпускников.

package Inheritance;

// StudentTest.java
public class StudentTest {

    public static void main(String[] args) {

        // Declare and initialize objects
        Undergraduate undergraduate = new Undergraduate("Bush", "White", "1021", 3);
        Graduate graduate = new Graduate("Alexa", "Brown", "1102", "Masters");

        // print string representation of objects
        System.out.println(undergraduate);
        System.out.println(graduate);
    }
}

Класс StudentTest создает объекты как для студентов, так и для выпускников. А затем также передает значения конструктора. Затем он переходит к печати значений созданных объектов. Обратите внимание, что мы явно не использовали метод toString() для печати строкового представления объектов. Это связано с тем, что мы уже настроили их для студентов и аспирантов соответственно. Ниже приведен результат выполнения Ниже приведен результат выполнения

В выводе сначала отображаются сведения о студенте бакалавриата. За ним следует аспирант. Обратите внимание, что среди сведений о студентах бакалавриата и магистратуры есть дополнительная информация, указывающая тип студента. Который не был включен в конструктор при создании. Все эти сведения и формат вывода были включены в метод toString() соответствующих подклассов.

Вывод

Наследование также является широкой темой в Java и других объектно-ориентированных языках программирования. В этой статье реализована концепция наследования с использованием класса Student. С классами выпускников и студентов в качестве подклассов. Мы узнали о понятии суперкласса и подкласса и их использовании в наследовании. А затем использовал некоторые ключевые слова, такие как extends, super, а также использовал аннотацию @override для добавления функций к значению по умолчанию toString метод каждого класса. Затем мы перешли к использованию методов setters и getters для доступа к закрытому полю суперкласса, а также проверки значений перед их установкой. В следующей статье мы будем развивать концепцию наследования, вводя полиморфизм. Способность объектов существовать во многих формах. Что также является основным принципом объектно-ориентированного программирования.

Оригинал: “https://dev.to/princeibs/oop-series-inheritance-in-java-4bn”