logo

Dědičnost v Javě

Java, dědičnost je důležitým pilířem OOP (Object-Oriented Programming). Je to mechanismus v Javě, pomocí kterého může jedna třída zdědit vlastnosti (pole a metody) jiné třídy. V Javě dědičnost znamená vytváření nových tříd založených na existujících. Třída, která dědí z jiné třídy, může znovu použít metody a pole této třídy. Kromě toho můžete do své aktuální třídy přidávat nová pole a metody.

Proč potřebujeme dědičnost Java?

  • Znovupoužitelnost kódu: Kód napsaný v nadtřídě je společný pro všechny podtřídy. Podřízené třídy mohou přímo používat kód nadřazené třídy.
  • Přepsání metody: Přepsání metody je dosažitelné pouze prostřednictvím dědictví. Je to jeden ze způsobů, jak Java dosahuje Run Time Polymorphism.
  • Abstrakce: Koncept abstraktu, kde nemusíme poskytovat všechny podrobnosti, je dosažen prostřednictvím dědičnosti. Abstrakce pouze zobrazuje funkčnost uživateli.

Důležité terminologie používané v dědičnosti Java

  • Třída: Třída je sada objektů, které sdílejí společné charakteristiky/chování a společné vlastnosti/atributy. Třída není entitou ze skutečného světa. Je to jen šablona nebo plán nebo prototyp, ze kterého jsou vytvořeny objekty.
  • Super třída/rodičovská třída: Třída, jejíž vlastnosti jsou zděděny, je známá jako nadtřída (nebo základní třída nebo nadřazená třída).
  • Podtřída/třída dětí: Třída, která zdědí druhou třídu, je známá jako podtřída (nebo odvozená třída, rozšířená třída nebo podřízená třída). Podtřída může přidat svá vlastní pole a metody navíc k polím a metodám nadtřídy.
  • Opětovná použitelnost: Dědičnost podporuje koncept opětovné použitelnosti, tj. když chceme vytvořit novou třídu a již existuje třída, která obsahuje nějaký požadovaný kód, můžeme naši novou třídu odvodit ze stávající třídy. Tímto způsobem znovu používáme pole a metody existující třídy.

Jak používat dědičnost v Javě?

The rozšiřuje klíčové slovo se používá pro dědičnost v Javě. Použití klíčového slova extends znamená, že jste odvozeni z existující třídy. Jinými slovy, extends odkazuje na zvýšenou funkčnost.

náhodný v c

Syntaxe:



class DerivedClass extends BaseClass  {   //methods and fields  }>

Příklad dědičnosti v Javě

Příklad: V níže uvedeném příkladu dědičnosti je třída Bicycle základní třídou, třída MountainBike je odvozená třída, která rozšiřuje třídu Bicycle a třída Test je třída řidiče pro spuštění programu.

Jáva
// Java program to illustrate the // concept of inheritance // base class class Bicycle {  // the Bicycle class has two fields  public int gear;  public int speed;  // the Bicycle class has one constructor  public Bicycle(int gear, int speed)  {  this.gear = gear;  this.speed = speed;  }  // the Bicycle class has three methods  public void applyBrake(int decrement)  {  speed -= decrement;  }  public void speedUp(int increment)  {  speed += increment;  }  // toString() method to print info of Bicycle  public String toString()  {  return ('No of gears are ' + gear + '
'  + 'speed of bicycle is ' + speed);  } } // derived class class MountainBike extends Bicycle {  // the MountainBike subclass adds one more field  public int seatHeight;  // the MountainBike subclass has one constructor  public MountainBike(int gear, int speed,  int startHeight)  {  // invoking base-class(Bicycle) constructor  super(gear, speed);  seatHeight = startHeight;  }  // the MountainBike subclass adds one more method  public void setHeight(int newValue)  {  seatHeight = newValue;  }  // overriding toString() method  // of Bicycle to print more info  @Override public String toString()  {  return (super.toString() + '
seat height is '  + seatHeight);  } } // driver class public class Test {  public static void main(String args[])  {  MountainBike mb = new MountainBike(3, 100, 25);  System.out.println(mb.toString());  } }>

Výstup
No of gears are 3 speed of bicycle is 100 seat height is 25>

Ve výše uvedeném programu, když je vytvořen objekt třídy MountainBike, kopie všech metod a polí nadtřídy získá paměť v tomto objektu. To je důvod, proč pomocí objektu podtřídy můžeme také přistupovat ke členům nadtřídy.

Upozorňujeme, že během dědění se vytvoří pouze objekt podtřídy, nikoli nadtřída. Více viz Java Object Creation of Inherited Class .

Příklad 2: V níže uvedeném příkladu dědičnosti je třída Employee základní třídou, třída Engineer je odvozená třída, která rozšiřuje třídu Employee a třída Test je třída ovladače pro spuštění programu.

Jáva
// Java Program to illustrate Inheritance (concise) import java.io.*; // Base or Super Class class Employee {  int salary = 60000; } // Inherited or Sub Class class Engineer extends Employee {  int benefits = 10000; } // Driver Class class Gfg {  public static void main(String args[])  {  Engineer E1 = new Engineer();  System.out.println('Salary : ' + E1.salary  + '
Benefits : ' + E1.benefits);  } }>

Výstup
Salary : 60000 Benefits : 10000>

Ilustrační obrázek programu:

vlk versus liška
Dědičnost v Javě

V praxi se dědí, a polymorfismus se v Javě používají společně k dosažení rychlého výkonu a čitelnosti kódu.

Typy dědičnosti Java

Níže jsou uvedeny různé typy dědičnosti, které Java podporuje.

  1. Jediné dědictví
  2. Víceúrovňová dědičnost
  3. Hierarchická dědičnost
  4. Vícenásobná dědičnost
  5. Hybridní dědičnost

1. Jediné dědictví

Při jednoduché dědičnosti je podtřída odvozena pouze od jedné nadtřídy. Dědí vlastnosti a chování třídy s jedním rodičem. Někdy je také známá jako jednoduchá dědičnost. Na obrázku níže je „A“ nadřazená třída a „B“ je podřízená třída. Třída ‚B‘ zdědí všechny vlastnosti třídy ‚A‘.

Jediné dědictví

Jediné dědictví

Jáva
// Java program to illustrate the // concept of single inheritance import java.io.*; import java.lang.*; import java.util.*; // Parent class class One {  public void print_geek()  {  System.out.println('Geeks');  } } class Two extends One {  public void print_for() { System.out.println('for'); } } // Driver class public class Main {  // Main function  public static void main(String[] args)  {  Two g = new Two();  g.print_geek();  g.print_for();  g.print_geek();  } }>

Výstup
Geeks for Geeks>

2. Víceúrovňová dědičnost

Ve víceúrovňové dědičnosti bude odvozená třída dědit základní třídu a stejně jako odvozená třída také funguje jako základní třída pro ostatní třídy. Na obrázku níže třída A slouží jako základní třída pro odvozenou třídu B, která zase slouží jako základní třída pro odvozenou třídu C. V Javě třída nemůže přímo přistupovat k členové prarodičů .

Víceúrovňová dědičnost

Víceúrovňová dědičnost

Jáva
// Importing required libraries import java.io.*; import java.lang.*; import java.util.*; // Parent class One class One {  // Method to print 'Geeks'  public void print_geek() {  System.out.println('Geeks');  } } // Child class Two inherits from class One class Two extends One {  // Method to print 'for'  public void print_for() {  System.out.println('for');  } } // Child class Three inherits from class Two class Three extends Two {  // Method to print 'Geeks'  public void print_lastgeek() {  System.out.println('Geeks');  } } // Driver class public class Main {  public static void main(String[] args) {  // Creating an object of class Three  Three g = new Three();    // Calling method from class One  g.print_geek();    // Calling method from class Two  g.print_for();    // Calling method from class Three  g.print_lastgeek();  } }>

Výstup
Geeks for Geeks>

3. Hierarchická dědičnost

V hierarchické dědičnosti jedna třída slouží jako nadtřída (základní třída) pro více než jednu podtřídu. Na níže uvedeném obrázku slouží třída A jako základní třída pro odvozené třídy B, C a D.

Hierarchická-dědičnost-v-Jávě

Jáva
// Java program to illustrate the // concept of Hierarchical inheritance class A {  public void print_A() { System.out.println('Class A'); } } class B extends A {  public void print_B() { System.out.println('Class B'); } } class C extends A {  public void print_C() { System.out.println('Class C'); } } class D extends A {  public void print_D() { System.out.println('Class D'); } } // Driver Class public class Test {  public static void main(String[] args)  {  B obj_B = new B();  obj_B.print_A();  obj_B.print_B();  C obj_C = new C();  obj_C.print_A();  obj_C.print_C();  D obj_D = new D();  obj_D.print_A();  obj_D.print_D();  } }>

Výstup
Class A Class B Class A Class C Class A Class D>

4. Vícenásobná dědičnost ( Prostřednictvím rozhraní)

v Vícenásobná dědictví , jedna třída může mít více než jednu nadtřídu a dědit vlastnosti ze všech nadřazených tříd. Upozorňujeme, že Java ano ne Podpěra, podpora vícenásobná dědictví s třídami. V Javě můžeme dosáhnout vícenásobné dědičnosti pouze prostřednictvím Rozhraní . Na obrázku níže je třída C odvozena od rozhraní A a B.

Vícenásobná dědičnost

Vícenásobná dědičnost

Jáva
// Java program to illustrate the // concept of Multiple inheritance import java.io.*; import java.lang.*; import java.util.*; interface One {  public void print_geek(); } interface Two {  public void print_for(); } interface Three extends One, Two {  public void print_geek(); } class Child implements Three {  @Override public void print_geek()  {  System.out.println('Geeks');  }  public void print_for() { System.out.println('for'); } } // Drived class public class Main {  public static void main(String[] args)  {  Child c = new Child();  c.print_geek();  c.print_for();  c.print_geek();  } }>

Výstup
Geeks for Geeks>

5. Hybridní dědičnost

Jedná se o kombinaci dvou nebo více výše uvedených typů dědičnosti. Protože Java nepodporuje vícenásobnou dědičnost s třídami, hybridní dědičnost zahrnující vícenásobnou dědičnost také není u tříd možná. V Javě můžeme dosáhnout hybridní dědičnosti pouze prostřednictvím Rozhraní pokud chceme zapojit vícenásobnou dědičnost k implementaci hybridní dědičnosti.
Je však důležité poznamenat, že hybridní dědičnost nutně nevyžaduje výhradně použití vícenásobné dědičnosti. Toho lze dosáhnout kombinací víceúrovňové dědičnosti a hierarchické dědičnosti s třídami, hierarchické a jediné dědičnosti s třídami. Proto je skutečně možné implementovat hybridní dědičnost pomocí samotných tříd, aniž byste se spoléhali na typ vícenásobné dědičnosti.

Hybridní dědičnost

Hybridní dědičnost

Java JE typ vztahu

IS-A je způsob, jak říci: Tento objekt je typem tohoto objektu. Podívejme se, jak se klíčové slovo extends používá k dosažení dědičnosti.

java tutoriály
Jáva
public class SolarSystem { } public class Earth extends SolarSystem { } public class Mars extends SolarSystem { } public class Moon extends Earth { }>

Nyní, na základě výše uvedeného příkladu, v objektově orientovaných termínech, platí následující: -

  • Sluneční soustava je nadtřídou třídy Země.
  • SolarSystem je supertřída třídy Mars.
  • Země a Mars jsou podtřídy třídy Sluneční soustavy.
  • Měsíc je podtřídou tříd Země i Sluneční soustavy.
Jáva
class SolarSystem { } class Earth extends SolarSystem { } class Mars extends SolarSystem { } public class Moon extends Earth {  public static void main(String args[])  {  SolarSystem s = new SolarSystem();  Earth e = new Earth();  Mars m = new Mars();  System.out.println(s instanceof SolarSystem);  System.out.println(e instanceof Earth);  System.out.println(m instanceof SolarSystem);  } }>

Výstup
true true true>

Co lze udělat v podtřídě?

V podtřídách můžeme zdědit členy tak, jak jsou, nahradit je, skrýt nebo doplnit novými členy:

  • Zděděná pole lze použít přímo, stejně jako jakákoli jiná pole.
  • V podtřídě můžeme deklarovat nová pole, která nejsou v nadtřídě.
  • Zděděné metody lze použít přímo tak, jak jsou.
  • Můžeme napsat nový instance metoda v podtřídě, která má stejný podpis jako ta v nadtřídě, tedy prvořadé to (jako v příkladu výše, toString() metoda je přepsána).
  • Můžeme napsat nový statický metoda v podtřídě, která má stejný podpis jako ta v nadtřídě, tedy úkryt to.
  • V podtřídě můžeme deklarovat nové metody, které nejsou v nadtřídě.
  • Můžeme napsat konstruktor podtřídy, který vyvolá konstruktor nadtřídy, buď implicitně, nebo pomocí klíčového slova super .

Výhody dědičnosti v Javě:

  1. Znovupoužitelnost kódu: Dědičnost umožňuje opětovné použití kódu a snižuje množství kódu, který je třeba napsat. Podtřída může znovu použít vlastnosti a metody nadtřídy, čímž se sníží duplikace kódu.
  2. Abstrakce: Dědičnost umožňuje vytváření abstraktních tříd, které definují společné rozhraní pro skupinu příbuzných tříd. To podporuje abstrakci a zapouzdření, což usnadňuje údržbu a rozšiřování kódu.
  3. Hierarchie tříd: Dědičnost umožňuje vytvoření hierarchie tříd, kterou lze použít k modelování objektů reálného světa a jejich vztahů.
  4. Polymorfismus: Dědičnost umožňuje polymorfismus, což je schopnost objektu nabývat více podob. Podtřídy mohou potlačit metody nadtřídy, což jim umožňuje měnit své chování různými způsoby.

Nevýhody dědičnosti v Javě:

  1. Složitost: Dědičnost může kód učinit složitějším a obtížnějším pochopitelným. To platí zejména v případě, že je hierarchie dědičnosti hluboká nebo pokud se používá více dědičnosti.
  2. Tight Coupling: Dědičnost vytváří těsné spojení mezi nadtřídou a podtřídou, takže je obtížné provádět změny v nadtřídě, aniž by to ovlivnilo podtřídu.

Závěr

Podívejme se na některé důležité body z článku, které jsou uvedeny níže:

pvr plná forma
  • Výchozí nadtřída : Až na Objekt třída, která nemá žádnou nadtřídu, každá třída má jednu a pouze jednu přímou nadtřídu (jediná dědičnost). Při absenci jakékoli jiné explicitní nadtřídy je každá třída implicitně podtřídou třídy Object.
  • Supertřída může být pouze jedna: Nadtřída může mít libovolný počet podtříd. Ale podtřída může mít pouze jeden supertřída. Je to proto, že Java nepodporuje vícenásobnou dědičnost s třídami. Ačkoli s rozhraními, Java podporuje vícenásobnou dědičnost.
  • Dědění konstruktérů: Podtřída dědí všechny členy (pole, metody a vnořené třídy) ze své nadtřídy. Konstruktory nejsou členy, takže je nedědí podtřídy, ale konstruktor nadtřídy lze vyvolat z podtřídy.
  • Dědictví soukromého člena: Podtřída nedědí soukromé členy své nadřazené třídy. Pokud však má nadtřída veřejné nebo chráněné metody (jako jsou getry a nastavovače) pro přístup ke svým soukromým polím, může je podtřída také použít.

Nejčastější dotazy v oblasti dědictví

1. Co je dědičnost Java?

Dědičnost je koncept OOP, kde jedna třída dědí z jiné třídy, která může znovu použít metody a pole nadřazené třídy.

2. Jaké jsou 4 typy dědičnosti v Javě?

Existují Single, Multiple, Multilevel, Hierarchical a Hybrid

3. K čemu slouží klíčové slovo extend?

Klíčové slovo Extend se používá pro zdědění jedné třídy do jiné.

4. Jaký je příklad dědičnosti v Javě?

Reálný příklad dědičnosti v Javě je uveden níže:

Zvažte skupinu vozidel. Musíte vytvořit třídy pro Bus, Car a Truck. Metody fuelAmount(), capacity(), applyBrakes() budou stejné pro všechny tři třídy.

Použité reference:

  1. Head First Java od Kathy Sierry a Berta Batese
  2. Java: Průvodce pro začátečníky od Herberta Schildta
  3. Java: Kompletní reference od Herberta Schildta
  4. Efektivní Java od Joshuy Blocha
  5. Java: The Good Parts od Jima Walda.