Java - Наследование
Наследование можно определить как процесс, в котором один класс приобретает свойства (методы и поля) другого. С использованием наследования информация становится управляемой в иерархическом порядке.
Класс, который наследует свойства другого, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, известен как суперкласс (базовый класс, родительский класс).
расширяет ключевое слово
extendsключевое слово, используемое для наследования свойств класса. Ниже приводится синтаксис ключевого слова extends.
Syntax
class Super {
.....
.....
}
class Sub extends Super {
.....
.....
}
Образец кода
Ниже приведен пример, демонстрирующий наследование Java. В этом примере вы можете наблюдать два класса, а именно Calculation и My_Calculation.
Используя ключевое слово extends, My_Calculation наследует методы add () и Subtraction () класса Calculation.
Скопируйте и вставьте следующую программу в файл с именем My_Calculation.java
Example
class Calculation {
int z;
public void addition(int x, int y) {
z = x + y;
System.out.println("The sum of the given numbers:"+z);
}
public void Subtraction(int x, int y) {
z = x - y;
System.out.println("The difference between the given numbers:"+z);
}
}
public class My_Calculation extends Calculation {
public void multiplication(int x, int y) {
z = x * y;
System.out.println("The product of the given numbers:"+z);
}
public static void main(String args[]) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
}
}
Скомпилируйте и выполните приведенный выше код, как показано ниже.
javac My_Calculation.java
java My_Calculation
После выполнения программы она выдаст следующий результат -
Output
The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200
В данной программе, когда объект My_Calculationсоздается класс, внутри него делается копия содержимого суперкласса. Вот почему, используя объект подкласса, вы можете получить доступ к членам суперкласса.
Ссылочная переменная суперкласса может содержать объект подкласса, но с помощью этой переменной вы можете получить доступ только к членам суперкласса, поэтому для доступа к членам обоих классов рекомендуется всегда создавать ссылочную переменную для подкласса.
Если вы рассмотрите приведенную выше программу, вы можете создать экземпляр класса, как указано ниже. Но используя ссылочную переменную суперкласса (cal в этом случае) вы не можете вызвать метод multiplication(), который принадлежит к подклассу My_Calculation.
Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
Note- Подкласс наследует все члены (поля, методы и вложенные классы) от своего суперкласса. Конструкторы не являются членами, поэтому они не наследуются подклассами, но конструктор суперкласса может быть вызван из подкласса.
Ключевое слово super
В super ключевое слово похоже на thisключевое слово. Ниже приведены сценарии, в которых используется ключевое слово super.
Он используется для differentiate the members суперкласса из членов подкласса, если у них одинаковые имена.
Он используется для invoke the superclass конструктор из подкласса.
Дифференциация членов
Если класс наследует свойства другого класса. И если члены суперкласса имеют такие же имена, как и подкласс, для различения этих переменных мы используем ключевое слово super, как показано ниже.
super.variable
super.method();
Образец кода
В этом разделе представлена программа, демонстрирующая использование super ключевое слово.
В данной программе у вас есть два класса, а именно Sub_class и Super_class , оба имеют метод с именем display () с разными реализациями и переменную с именем num с разными значениями. Мы вызываем метод display () обоих классов и печатаем значение переменной num обоих классов. Здесь вы можете заметить, что мы использовали ключевое слово super, чтобы отличать членов суперкласса от подкласса.
Скопируйте и вставьте программу в файл с именем Sub_class.java.
Example
class Super_class {
int num = 20;
// display method of superclass
public void display() {
System.out.println("This is the display method of superclass");
}
}
public class Sub_class extends Super_class {
int num = 10;
// display method of sub class
public void display() {
System.out.println("This is the display method of subclass");
}
public void my_method() {
// Instantiating subclass
Sub_class sub = new Sub_class();
// Invoking the display() method of sub class
sub.display();
// Invoking the display() method of superclass
super.display();
// printing the value of variable num of subclass
System.out.println("value of the variable named num in sub class:"+ sub.num);
// printing the value of variable num of superclass
System.out.println("value of the variable named num in super class:"+ super.num);
}
public static void main(String args[]) {
Sub_class obj = new Sub_class();
obj.my_method();
}
}
Скомпилируйте и выполните приведенный выше код, используя следующий синтаксис.
javac Super_Demo
java Super
Выполнив программу, вы получите следующий результат -
Output
This is the display method of subclass
This is the display method of superclass
value of the variable named num in sub class:10
value of the variable named num in super class:20
Вызов конструктора суперкласса
Если класс наследует свойства другого класса, подкласс автоматически получает конструктор суперкласса по умолчанию. Но если вы хотите вызвать параметризованный конструктор суперкласса, вам нужно использовать ключевое слово super, как показано ниже.
super(values);
Образец кода
Программа, представленная в этом разделе, демонстрирует, как использовать ключевое слово super для вызова параметризованного конструктора суперкласса. Эта программа содержит суперкласс и подкласс, где суперкласс содержит параметризованный конструктор, который принимает целочисленное значение, и мы использовали ключевое слово super для вызова параметризованного конструктора суперкласса.
Скопируйте и вставьте следующую программу в файл с именем Subclass.java
Example
class Superclass {
int age;
Superclass(int age) {
this.age = age;
}
public void getAge() {
System.out.println("The value of the variable named age in super class is: " +age);
}
}
public class Subclass extends Superclass {
Subclass(int age) {
super(age);
}
public static void main(String args[]) {
Subclass s = new Subclass(24);
s.getAge();
}
}
Скомпилируйте и выполните приведенный выше код, используя следующий синтаксис.
javac Subclass
java Subclass
Выполнив программу, вы получите следующий результат -
Output
The value of the variable named age in super class is: 24
IS-A Отношения
IS-A - это способ сказать: этот объект является типом этого объекта. Посмотрим, какextends ключевое слово используется для достижения наследования.
public class Animal {
}
public class Mammal extends Animal {
}
public class Reptile extends Animal {
}
public class Dog extends Mammal {
}
Теперь, исходя из приведенного выше примера, в объектно-ориентированных терминах верно следующее:
- Animal - это суперкласс класса Mammal.
- Animal - это суперкласс класса Reptile.
- Млекопитающие и рептилии являются подклассами класса животных.
- Собака - это подкласс классов млекопитающих и животных.
Теперь, если мы рассмотрим отношения IS-A, мы можем сказать:
- Млекопитающее - это животное
- Рептилия - это животное
- Собака - это млекопитающее
- Следовательно: Собака - это тоже животное.
При использовании ключевого слова extends подклассы смогут наследовать все свойства суперкласса, за исключением частных свойств суперкласса.
Мы можем гарантировать, что Mammal на самом деле является Animal с помощью оператора экземпляра.
Example
class Animal {
}
class Mammal extends Animal {
}
class Reptile extends Animal {
}
public class Dog extends Mammal {
public static void main(String args[]) {
Animal a = new Animal();
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Это даст следующий результат -
Output
true
true
true
Поскольку мы хорошо понимаем extends ключевое слово, давайте посмотрим, как implements ключевое слово используется для получения отношения IS-A.
Как правило, implementsключевое слово используется с классами для наследования свойств интерфейса. Интерфейсы никогда не могут быть расширены классом.
Example
public interface Animal {
}
public class Mammal implements Animal {
}
public class Dog extends Mammal {
}
Ключевое слово instanceof
Давайте использовать instanceof , чтобы проверить, действительно ли млекопитающее является животным, а собака - животным.
Example
interface Animal{}
class Mammal implements Animal{}
public class Dog extends Mammal {
public static void main(String args[]) {
Mammal m = new Mammal();
Dog d = new Dog();
System.out.println(m instanceof Animal);
System.out.println(d instanceof Mammal);
System.out.println(d instanceof Animal);
}
}
Это даст следующий результат -
Output
true
true
true
ИМЕЕТ-отношения
Эти отношения в основном основаны на использовании. Это определяет, будет ли определенный классHAS-Aопределенная вещь. Эта связь помогает уменьшить дублирование кода, а также количество ошибок.
Давайте посмотрим на пример -
Example
public class Vehicle{}
public class Speed{}
public class Van extends Vehicle {
private Speed sp;
}
Это показывает, что у класса Van HAS-A Speed. Имея отдельный класс для Speed, нам не нужно помещать весь код, относящийся к скорости, внутри класса Van, что позволяет повторно использовать класс Speed в нескольких приложениях.
В объектно-ориентированной функции пользователям не нужно беспокоиться о том, какой объект выполняет реальную работу. Для этого класс Van скрывает детали реализации от пользователей класса Van. Итак, в основном происходит то, что пользователи просят класс Van выполнить определенное действие, а класс Van либо выполнит эту работу сам, либо попросит другой класс выполнить действие.
Типы наследования
Как показано ниже, существуют различные типы наследования.
Следует помнить очень важный факт, что Java не поддерживает множественное наследование. Это означает, что класс не может расширять более одного класса. Поэтому следующее незаконно -
Example
public class extends Animal, Mammal{}
Однако класс может реализовывать один или несколько интерфейсов, что помогло Java избавиться от невозможности множественного наследования.