Учебники

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

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

Класс, который наследует свойства other, известен как подкласс (производный класс, дочерний класс), а класс, свойства которого наследуются, называется суперклассом (базовый класс, родительский класс).

расширяет ключевое слово

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

Синтаксис

class Super {
   .....
   .....
}
class Sub extends Super {
   .....
   .....
}

Образец кода

Ниже приведен пример, демонстрирующий наследование Java. В этом примере вы можете наблюдать два класса, а именно: Расчет и My_Calculation.

Используя ключевое слово extends, My_Calculation наследует методы добавление () и Subtraction () класса Calculation.

Скопируйте и вставьте следующую программу в файл с именем My_Calculation.java

пример

Live Demo

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

После выполнения программы она даст следующий результат —

Выход

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);

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

Супер ключевое слово

Супер ключевое слово похоже на это ключевое слово. Ниже приведены сценарии, в которых используется ключевое слово super.

  • Он используется для различения членов суперкласса от членов подкласса, если они имеют одинаковые имена.

  • Он используется для вызова конструктора суперкласса из подкласса.

Он используется для различения членов суперкласса от членов подкласса, если они имеют одинаковые имена.

Он используется для вызова конструктора суперкласса из подкласса.

Разграничение членов

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

super.variable
super.method();

Образец кода

В этом разделе представлена ​​программа, которая демонстрирует использование ключевого слова super .

В данной программе у вас есть два класса, а именно Sub_class и Super_class , оба имеют метод display () с разными реализациями и переменную с именем num с разными значениями. Мы вызываем метод display () обоих классов и печатаем значение переменной num обоих классов. Здесь вы можете заметить, что мы использовали ключевое слово super, чтобы отличать членов суперкласса от подкласса.

Скопируйте и вставьте программу в файл с именем Sub_class.java.

пример

Live Demo

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

Выполнив программу, вы получите следующий результат —

Выход

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

пример

Live Demo

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 argd[]) {
      Subclass s = new Subclass(24);
      s.getAge();
   }
}

Скомпилируйте и выполните приведенный выше код, используя следующий синтаксис.

javac Subclass
java Subclass

Выполнив программу, вы получите следующий результат —

Выход

The value of the variable named age in super class is: 24

IS-A Отношения

IS-A — это способ сказать: этот объект является типом этого объекта. Давайте посмотрим, как ключевое слово extends используется для достижения наследования.

 общественный класс Animal {
 }

 Млекопитающее публичного класса расширяет Animal {
 }

 Общественный класс Рептилия расширяет Animal {
 }

 Публичный класс Собака расширяет Млекопитающее {
 }

Теперь, на основе приведенного выше примера, в объектно-ориентированных терминах верно следующее:

  • Животное — суперкласс класса млекопитающих.
  • Животное — суперкласс рептилий.
  • Млекопитающее и Рептилия являются подклассами класса животных.
  • Собака является подклассом классов млекопитающих и животных.

Теперь, если мы рассмотрим отношения IS-A, мы можем сказать —

  • Млекопитающее IS-A Animal
  • Рептилия IS-A Animal
  • Собака IS-A Млекопитающее
  • Отсюда: собака тоже животное

С использованием ключевого слова extends подклассы смогут наследовать все свойства суперкласса, за исключением частных свойств суперкласса.

Мы можем гарантировать, что Mammal на самом деле является Animal с использованием оператора экземпляра.

пример

Live Demo

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);
   }
}

Это даст следующий результат —

Выход

true
true
true

Поскольку мы хорошо понимаем ключевое слово extends , давайте посмотрим, как ключевое слово Implements используется для получения отношения IS-A.

Обычно ключевое слово Implements используется с классами для наследования свойств интерфейса. Интерфейсы никогда не могут быть расширены классом.

пример

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Ключевое слово instanceof

Давайте воспользуемся оператором instanceof, чтобы проверить, действительно ли Млекопитающее является Животным, а собака на самом деле Животным.

пример

Live Demo

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);
   }
}

Это даст следующий результат —

Выход

true
true
true

HAS-A отношения

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

Давайте посмотрим на пример —

пример

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
} 

Это показывает, что класс Van HAS-A Speed. Имея отдельный класс для скорости, нам не нужно помещать весь код, относящийся к скорости, в класс Van, что позволяет повторно использовать класс Speed ​​в нескольких приложениях.

В объектно-ориентированной функции пользователям не нужно беспокоиться о том, какой объект выполняет реальную работу. Чтобы достичь этого, класс Van скрывает детали реализации от пользователей класса Van. Таким образом, в основном происходит то, что пользователи просят класс Van выполнить определенное действие, а класс Van либо выполнит эту работу сам, либо попросит другой класс выполнить действие.

Типы Наследования

Существуют различные типы наследования, как показано ниже.

Типы Наследования

Важно помнить, что Java не поддерживает множественное наследование. Это означает, что класс не может расширять более одного класса. Поэтому следующее незаконно —

пример

public class extends Animal, Mammal{} 

Однако класс может реализовать один или несколько интерфейсов, что помогло Java избавиться от невозможности множественного наследования.