На этом занятии мы обсудим:
- Наследование
- Заключение
В предыдущей главе мы обсудили класс 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 (генерация кода)
Топ