Простое введение в Java — объектно-ориентированное программирование — часть 2

На этом занятии мы обсудим:

  • Наследование
  • Заключение

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

  • длина: double
  • ширина: double
  • площадь(): double
  • периметр(): double
  • print(): void

Мы говорили об этом:

Инкапсуляция означает сокрытие данныхиспользование ключевого слова private, которое ограничивает доступ к полям или методам, объявленным как private.

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

Квадраты, прямоугольники, круги и другие — это плоские фигуры или формы. Мы определили класс Shape с указанными выше полями и методами. Можете ли вы реализовать класс для квадрата, прямоугольника, круга и т.д. без некоторых или всех полей и методов? Конечно, можно.

В чем смысл наследования?

Если даны два класса, скажем, класс A и B. Если класс B имеет те же поля и методы, что и класс A, то при реализации класса B нам придется создать класс, который будет иметь все поля и методы класса A, а затем добавить поля и методы, которых нет в классе A.

Таким образом, при наследовании один класс будет иметь поля и методы другого класса. Вот и все.

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

Суперкласс и подкласс

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

Подкласс, также известный как дочерний или производный класс, — это класс, который создается/выводится из другого класса. Из урока естествознания мы вывели такие величины, как площадь, объем и скорость, а ее братья были созданы из комбинации других величин, таких как длина, время и т.д.

Расширение класса

Дан класс A:

public class A {

}
Войти в полноэкранный режим Выйти из полноэкранного режима

Другой класс B унаследует свойства класса A:

public class B extends A {

}
Входить в полноэкранный режим Выйти из полноэкранного режима

Чтобы расширить класс, мы используем ключевое слово extends.

Создайте класс «Человек-ученик-учитель».

Есть ли разница между учеником и учителем? Есть ли особенности и способности, которыми обладает один из них по сравнению с другим? Есть ли между ними сходство?

Давайте посмотрим на некоторые сходства.

  • Полное имя или просто имя
  • Дата рождения
  • Оба волосатые в той или иной степени
  • У них могут быть свои удостоверения личности
  • и т.д.

Давайте посмотрим на некоторые различия.

  • Учитель — это часть школы, а ученик — нет. Учитель может вести урок, а ученик не может этого делать.
  • Учитель получает зарплату в конце месяца, но ученик должен платить за обучение в течение учебного года.
  • и т.д.

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

Учитель и ученик — оба люди, поэтому мы можем создать класс под названием Human, который будет служить базовым классом.

// Human.java
public class Human {

    private String id;
    private String password;
    private String fullName;

    public Human() {
    }

    public Human(
        String id, 
        String password, 
        String fullName) {
        this.id = id;
        this.password = password;
        this.fullName = fullName;
    }

    public String getId() {
        return this.id;
    }

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

    public String getPassword() {
        return this.password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFullName() {
        return this.fullName;
    }

    public void setFullName(String fullName) {
        this.fullName = fullName;
    }
}

Вход в полноэкранный режим Выход из полноэкранного режима

Теперь класс Human не нуждается в особой доработке. Мы можем создать класс Student без создания конструктора (мы будем использовать конструктор default/empty).

// Student.java
public class Student extends Human {

    public Student() {
    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

В классе Main мы можем использовать методы getter и setter для манипулирования свойствами объекта Student, который мы создадим.

// Main.java
public class Main {

    public static void main(String[] args) {
        Student student = new Student();

        // set the properties of the class using
        student.setId("std0012");
        student.setFullName("John Adams");
        student.setPassword("simple_password");

        System.out.println(
            "Full Name: " + student.getFullName());
        System.out.println("ID: " + student.getId());
        System.out.println(
            "Password: " + student.getPassword());
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

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

// Main.java
public class Student extends Human {

    public Student() {
    }

    public Student(
        String id, 
        String password, 
        String fullName) {
        super(id, password, fullName);
    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь наш класс Main будет выглядеть следующим образом

// Main.js
public class Main {

    public static void main(String[] args) {
        // set the properties of the class using
        /*
         * Student student = new Student();
         *
         * student.setId("std0012");
         * student.setFullName("John Adams");
         * student.setPassword("simple_password");
         */

        // Use the student constructor
        Student student = new Student(
            "std0012", 
            "simple_password", 
            "John Adams");

        System.out.println(
            "Full Name: " + student.getFullName());
        System.out.println("ID: " + student.getId());
        System.out.println(
            "Password: " + student.getPassword());
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Что происходит в super(id, password, fullName);?

Это то же самое, что вызвать конструктор суперкласса и передать в него необходимые аргументы.

Допустим, мы хотим добавить новое свойство в класс Student, мы можем сделать это просто:

// Student.java
public class Student extends Human {

    private boolean isClassRep;

    public Student() {
    }

    public Student(
        String id, String password, String fullName) {
        super(id, password, fullName);
    }

    // new constructor with a fourth parameter for isClassRep
    public Student(
        String id, 
        String password, 
        String fullName,
        boolean isClassRep) {
        super(id, password, fullName);

        // not added to super
        this.isClassRep = isClassRep; 
        // same as the above
        // this.setClassRep(isClassRep); 
    }

    public boolean isClassRep() {
        return this.isClassRep;
    }

    public void setClassRep(boolean isClassRep) {
        this.isClassRep = isClassRep;
    }

}
Войти в полноэкранный режим Выйти из полноэкранного режима

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

// Main.java
public class Main {

    public static void main(String[] args) {
        // set the properties of the class using
        /*
         * Student student = new Student();
         *
         * student.setId("std0012");
         * student.setFullName("John Adams");
         * student.setPassword("simple_password");
         */

        // Use the student constructor
        Student student = new Student(
            "std0012", "bunny", "John Adams");

        System.out.println(
            "Full Name: " + student.getFullName());
        System.out.println("ID: " + student.getId());
        System.out.println(
           "Password: " + student.getPassword());
        System.out.println();

        // student object with isClassRep
        Student studentRep = new Student(
            "std0013", "password", "Hannah Adams", true);

        System.out.println(
            "Full Name: " + studentRep.getFullName());
        System.out.println("ID: " + studentRep.getId());
        System.out.println(
            "Password: " + studentRep.getFullName());
        System.out.println(
            studentRep.getFullName() 
            + " is class president: " 
            + studentRep.isClassRep());
    }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Вы можете создать класс Teacher, который расширяет класс Human. Добавьте атрибут для класса isClassTeacher: boolean, а также зарплату учителя, salary: int.

Что мы будем делать, если захотим добавить атрибут для класса под названием hobby: String? Попробуйте это сделать.

Заключение

Один класс может использовать свойства и методы другого класса через наследование. В java мы используем ключевое слово extends, чтобы указать, что класс наследуется. Класс, чьи методы и атрибуты наследуются, называется суперклассом, а класс, который наследуется, называется подклассом. Мы можем использовать конструктор суперкласса, используя ключевое слово super и передавая необходимые аргументы.

Проекты

Рассмотрим класс одномерной фигуры Shape. Унаследуйте этот класс и создайте подклассы Square и Rectangle с соответствующими атрибутами и методами:

// Shape.java
public class Shape {
    private int side;

    public Shape(int side) {
        this.side = side;
    }

    public int getSide() {
        return this.side;
    }

    public void setSide(int side) {
        this.side = side;
    }

}
входа в полноэкранный режим Выйти из полноэкранного режима

Источник

  • Sololearn
  • DS Malik
  • vscode (генерация кода)

Топ

Оцените статью
Procodings.ru
Добавить комментарий