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 избавиться от невозможности множественного наследования.