Java - dziedziczenie

Dziedziczenie można zdefiniować jako proces, w którym jedna klasa uzyskuje właściwości (metody i pola) innej. Dziedziczenie umożliwia zarządzanie informacjami w porządku hierarchicznym.

Klasa, która dziedziczy właściwości innych, jest znana jako podklasa (klasa pochodna, klasa potomna), a klasa, której właściwości są dziedziczone, jest znana jako nadklasa (klasa bazowa, klasa nadrzędna).

rozszerza słowo kluczowe

extendsjest słowem kluczowym używanym do dziedziczenia właściwości klasy. Poniżej znajduje się składnia słowa kluczowego extends.

Syntax

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

Przykładowy kod

Poniżej znajduje się przykład demonstrujący dziedziczenie języka Java. W tym przykładzie można zaobserwować dwie klasy, a mianowicie Obliczenia i Moje_Kalkulacje.

Używając słowa kluczowego extends, My_Calculation dziedziczy metody added () i Subtraction () z klasy Calculation.

Skopiuj i wklej następujący program do pliku o nazwie 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);
   }
}

Skompiluj i wykonaj powyższy kod, jak pokazano poniżej.

javac My_Calculation.java
java My_Calculation

Po wykonaniu programu wygeneruje następujący wynik -

Output

The sum of the given numbers:30
The difference between the given numbers:10
The product of the given numbers:200

W danym programie, gdy obiekt My_Calculationklasy, kopia zawartości nadklasy jest wewnątrz niej tworzona. Dlatego używając obiektu podklasy można uzyskać dostęp do członków nadklasy.

Zmienna referencyjna nadklasy może zawierać obiekt podklasy, ale za pomocą tej zmiennej można uzyskać dostęp tylko do elementów składowych nadklasy, więc aby uzyskać dostęp do elementów obu klas, zaleca się zawsze tworzenie zmiennej referencyjnej dla podklasy.

Jeśli weźmiesz pod uwagę powyższy program, możesz utworzyć instancję klasy, jak podano poniżej. Ale używając zmiennej referencyjnej nadklasy (cal w tym przypadku) nie można wywołać metody multiplication(), który należy do podklasy My_Calculation.

Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);

Note- Podklasa dziedziczy wszystkie składowe (pola, metody i klasy zagnieżdżone) ze swojej nadklasy. Konstruktory nie są członkami, więc nie są dziedziczone przez podklasy, ale konstruktor nadklasy można wywołać z podklasy.

Super słowo kluczowe

Plik super słowo kluczowe jest podobne do thissłowo kluczowe. Poniżej przedstawiono scenariusze, w których używane jest słowo kluczowe super.

  • Jest do tego przyzwyczajony differentiate the members nadklasy od członków podklasy, jeśli mają takie same nazwy.

  • Jest do tego przyzwyczajony invoke the superclass konstruktor z podklasy.

Zróżnicowanie członków

Jeśli klasa dziedziczy właściwości innej klasy. A jeśli członkowie nadklasy mają takie same nazwy jak podklasa, do rozróżnienia tych zmiennych używamy słowa kluczowego super, jak pokazano poniżej.

super.variable
super.method();

Przykładowy kod

Ta sekcja zawiera program, który demonstruje użycie super słowo kluczowe.

W podanym programie masz dwie klasy, mianowicie Sub_class i Super_class , obie mają metodę o nazwie display () z różnymi implementacjami i zmienną o nazwie num z różnymi wartościami. Wywołujemy metodę display () obu klas i wypisujemy wartość zmiennej num obu klas. Tutaj możesz zauważyć, że użyliśmy słowa kluczowego super, aby odróżnić członków nadklasy od podklasy.

Skopiuj i wklej program do pliku o nazwie 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();
   }
}

Skompiluj i wykonaj powyższy kod, używając następującej składni.

javac Super_Demo
java Super

Po uruchomieniu programu otrzymasz następujący wynik -

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

Wywołanie konstruktora superklasy

Jeśli klasa dziedziczy właściwości innej klasy, podklasa automatycznie uzyskuje domyślny konstruktor nadklasy. Ale jeśli chcesz wywołać sparametryzowany konstruktor nadklasy, musisz użyć słowa kluczowego super, jak pokazano poniżej.

super(values);

Przykładowy kod

Program podany w tej sekcji demonstruje, jak używać słowa kluczowego super, aby wywołać sparametryzowany konstruktor nadklasy. Ten program zawiera nadklasę i podklasę, gdzie nadklasa zawiera sparametryzowany konstruktor, który akceptuje wartość całkowitą, a my użyliśmy słowa kluczowego super, aby wywołać sparametryzowany konstruktor nadklasy.

Skopiuj i wklej następujący program do pliku o nazwie 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();
   }
}

Skompiluj i wykonaj powyższy kod, używając następującej składni.

javac Subclass
java Subclass

Po uruchomieniu programu otrzymasz następujący wynik -

Output

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

Relacja IS-A

IS-A to sposób na powiedzenie: ten obiekt jest typem tego obiektu. Zobaczmy, jakextends słowo kluczowe służy do dziedziczenia.

public class Animal {
}

public class Mammal extends Animal {
}

public class Reptile extends Animal {
}

public class Dog extends Mammal {
}

Teraz, na podstawie powyższego przykładu, w kategoriach zorientowanych obiektowo, następujące są prawdziwe:

  • Zwierzę jest nadklasą klasy ssaków.
  • Animal to nadklasa klasy Reptile.
  • Ssaki i Gady to podklasy klasy Animal.
  • Pies jest podklasą klas ssaków i zwierząt.

Jeśli weźmiemy pod uwagę relację IS-A, możemy powiedzieć -

  • Ssak IS-A Zwierzę
  • Gad to zwierzę
  • Pies IS-A Mammal
  • Stąd też: Pies JEST zwierzęciem

Używając słowa kluczowego extends, podklasy będą mogły dziedziczyć wszystkie właściwości nadklasy, z wyjątkiem prywatnych właściwości nadklasy.

Możemy zapewnić, że Mammal to tak naprawdę Animal za pomocą operatora instancji.

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

To da następujący wynik -

Output

true
true
true

Ponieważ dobrze rozumiemy extends słowo kluczowe, przyjrzyjmy się, jak implements słowo kluczowe jest używane do uzyskania relacji IS-A.

Ogólnie rzecz biorąc, plik implementssłowo kluczowe jest używane z klasami do dziedziczenia właściwości interfejsu. Interfejsy nigdy nie mogą być rozszerzane przez klasę.

Example

public interface Animal {
}

public class Mammal implements Animal {
}

public class Dog extends Mammal {
}

Instancja słowa kluczowego

Użyjmy instanceof operator, aby sprawdzić, czy Mammal jest rzeczywiście Zwierzęciem, a pies jest w rzeczywistości Zwierzęciem.

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

To da następujący wynik -

Output

true
true
true

MA relację

Te relacje opierają się głównie na wykorzystaniu. To określa, czy dana klasaHAS-APewna rzecz. Ta relacja pomaga zredukować powielanie kodu, a także błędy.

Spójrzmy na przykład -

Example

public class Vehicle{}
public class Speed{}

public class Van extends Vehicle {
   private Speed sp;
}

To pokazuje, że klasa Van HAS-A Speed. Mając oddzielną klasę dla Speed, nie musimy umieszczać całego kodu należącego do speed wewnątrz klasy Van, co umożliwia ponowne użycie klasy Speed ​​w wielu aplikacjach.

W funkcji Object-Oriented użytkownicy nie muszą martwić się o to, który obiekt wykonuje rzeczywistą pracę. Aby to osiągnąć, klasa Van ukrywa szczegóły implementacji przed użytkownikami klasy Van. Tak więc zasadniczo użytkownicy proszą klasę Van o wykonanie określonej czynności, a klasa Van albo sama wykona pracę, albo poprosi inną klasę o wykonanie tej czynności.

Rodzaje dziedziczenia

Istnieją różne rodzaje dziedziczenia, jak pokazano poniżej.

Bardzo ważnym faktem do zapamiętania jest to, że Java nie obsługuje dziedziczenia wielokrotnego. Oznacza to, że klasa nie może rozszerzać więcej niż jedną klasę. Dlatego następujące jest nielegalne -

Example

public class extends Animal, Mammal{}

Jednak klasa może implementować jeden lub więcej interfejsów, co pomogło Javie pozbyć się niemożności wielokrotnego dziedziczenia.