Java >> Java tutorial >  >> Tag >> import

Java-arv – typer og betydning af arv med eksempler fra det virkelige liv!

Arv er et af de vigtigste begreber inden for objektorienteret programmering. Arv er en klasses evne til at arve egenskaber eller egenskaber fra en anden klasse i Java. For eksempel er vi mennesker.

Vi arver visse egenskaber fra klassen 'Menneske' såsom evnen til at tale, trække vejret, spise, drikke osv. Vi kan også tage eksemplet med biler. Klassen 'Bil' arver sine egenskaber fra klassen 'Automobiler', som arver nogle af dens egenskaber fra en anden klasse 'Køretøjer'.

De objektorienterede sprog udtrykker dette arveforhold ved at tillade en klasse at arve fra en anden. Således er en model af disse sprog meget tættere på den virkelige verden.

Princippet bag denne form for opdeling er, at hver underklasse (barneklasse) deler fælles karakteristika med den klasse, den er afledt fra.

Ovenstående figur illustrerer:

  • Biler og Trukne køretøjer er underklasser af Køretøjer .
  • Køretøjer er basisklassen eller superklassen for biler og trukne køretøjer .
  • Bil og Bus er underklasser eller afledte klasser af biler .
  • Biler er basisklassen eller superklassen for Bil og Bus.

Hold dig opdateret med de nyeste teknologitrends, Deltag i TechVidvan på Telegram

Hvorfor Java Inheritance?

Der er flere grunde til, at arv blev introduceret i objektorienterede sprog. Vi vil diskutere nogle vigtige årsager bag indførelsen af ​​arv.

  • Evnen til at udtrykke arveforhold sikrer nærhed med virkelige modeller.
  • En anden grund er ideen om genanvendelighed. Man kan udlede en ny klasse (underklasse) fra en eksisterende klasse og tilføje nye funktioner til den uden at ændre dens overordnede klasse. Det er ikke nødvendigt at omskrive den overordnede klasse for at arve den.
  • En grund er den transitive natur. Hvis klasse A arver egenskaber fra en anden klasse B , derefter alle underklasser af A vil automatisk arve egenskaber fra B . Denne egenskab kaldes den transitive karakter af arv.

Bemærk: En underklasse definerer kun de funktioner, der er unikke for den.

For eksempel klassenelev arver fra klassen Person . Så selvom Student er en person, er det omvendte ikke sandt. En person behøver ikke at være studerende. Klassestuderende har egenskaber, som den ikke deler med klasseperson.

For eksempel Studenten har en point-procent, men Personen ikke har.

Vigtige vilkår i Java-arv

1. Klasse: Klasse er en brugerdefineret datatype i Java, der dybest set er en gruppe af objekter. Det er en blueprint eller skabelon, som vi skaber objekter ud fra.

2. Superklasse: Klassen, hvis funktioner og funktioner bliver nedarvet eller brugt, er kendt som superklassen eller en basisklasse eller en overordnet klasse.

3. Underklasse: Klassen, der arver egenskaberne og funktionerne fra en anden klasse, er kendt som en underklasse eller en afledt klasse eller udvidet klasse eller underklasse. Underklassen kan tilføje sine egne funktioner og funktioner ud over felterne og metoderne for dens superklasse eller den overordnede klasse.

4. Udvider søgeordet: Nøgleordet udvider bruges af den underordnede klasse, mens den arver den overordnede klasse.

5. Supersøgeordet: Supersøgeordet ligner dette søgeord. Følgende er nogle tilfælde, hvor vi bruger super søgeord :

  • Der er nogle situationer, hvor medlemmerne af superklassen og underklassen har de samme navne, så bruges supernøgleordet til at skelne medlemmerne af superklassen fra medlemmerne af underklassen.
  • At starte superklassekonstruktøren fra underklassen.

Syntaks for at bruge arv i Java:

Vi ved allerede, at for at arve en klasse bruger vi nøgleordet extends. Syntaksen for at bruge arv i Java er:

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

Kode til at forklare Java-arv:

package com.techvidvan.inheritance;
//Base class
class Person
{
  String name = "John";
  int age =17;
  String city = "Delhi";
  public void show()
  {
    System.out.println("Student inheriting properties from Person:\n");
  }
}
//child class
class Student extends Person
{
  // defining additional properties to child class
  int marks = 78;
  String tutorial = "TechVidvan Tutorial of Java";

  public static void main(String args[])
  {
    Student obj = new Student();
    obj.show();

    System.out.println("Name of the student is: " + obj.name);
    System.out.println("Age of the student is: " + obj.age);
    System.out.println("Student lives in: " + obj.city);
    System.out.println("Student learns from: " + obj.tutorial);
    System.out.println("Marks obtained by the student is: " + obj.marks);
  }
}

Output:

Elev arver egenskaber fra Person:
Navn på elev er:John
Elevens alder er:17
Elev bor i:Delhi
Elev lærer fra:TechVidvan Tutorial of Java
Karakterer opnået af den studerende er:78

Fra ovenstående program kan vi sige, at Student IS-A Person. Det betyder, at en afledt klasse har en IS-A forhold til basisklassen. Denne arv kaldes IS-A forholdet mellem barnet og forældreklassen.

I ovenstående kode, når et objekt af Student-klassen oprettes, erhverver en kopi af alle superklassens metoder og felter hukommelse i dette objekt. Derfor er vi i stand til at få adgang til medlemmerne af superklassen ved at bruge subklassens objekt.

Bemærk venligst, at under nedarvning opretter vi kun objektet for underklassen, ikke superklassen.

Typer af Java-arv

Fra ovenstående diagram kan vi se, at der er fem typer af arv i Java. De er klassificeret på basis af antallet af super- og underklasser.

Der er en undtagelse, at 'multiple inheritance' ikke direkte understøttes af klasser i Java. I stedet bruger vi grænseflader til at implementere flere arv i Java.

Nu vil vi diskutere hver type arv med eksempler og programmer.

1. Enkeltarv i Java

I enkeltarv er der en enkelt underordnet klasse, der arver egenskaber fra en overordnet klasse.

I det følgende diagram er klasse A en basisklasse, der er afledt af klasse B. Den er også kendt som enkelt-niveau arv.

Syntaks for enkelt arv:

class A
{
  //methods and fields
}
Class B extends A
{
  //methods and fields

Kode til illustration af enkeltarv:

package com.techvidvan.inheritance;
//Base class
class Person
{
  String name="John";
  public void show()
  {
    System.out.println("Student inheriting properties from Person");
  }
}
//child class
class Student extends Person
{
  // defining additional properties to child class
  String course = "Techvidvan's Java Course";
  public void show1()
  {
    System.out.println("I am a Student who belongs to Person class");
  }
  public static void main(String args[])
  {
    Student obj = new Student();
    obj.show();
    obj.show1();
    System.out.println("Name of student: " +obj.name);
    System.out.println("Course opted by the student: " +obj.course);
  }
}

Output:

Elev arver egenskaber fra person
Jeg er en studerende, der tilhører personklasse
Elevens navn:John
Kursus valgt af eleven:Techvidvans Java-kursus

2. Multilevel Inheritance i Java

I denne type arv arver barnet eller den afledte klasse superklassens egenskaber, og samtidig fungerer denne barneklasse som en superklasse for en anden afledt klasse.

I det følgende diagram er klasse A en basisklasse, der er afledt af klasse B, som igen fungerer som en basisklasse for en afledt klasse C.

Kode til illustration af arv på flere niveauer:

package com.techvidvan.inheritance;
//Base class
class Person
{
  public void show()
  {
    System.out.println("Student inheriting properties from Person");
  }
}
class Student extends Person
{
  public void show1()
  {
      System.out.println("I am a Student who belongs to Person class");
  }
}
//child class
class EngineeringStudent extends Student
{
  // defining additional properties to the child class
  public void show2()
  {
    System.out.println("Engineering Student inheriting properties from Student");
  }
}
public class MultilevelDemo
{
  public static void main(String args[])
  {
    EngineeringStudent obj = new EngineeringStudent();
    obj.show();
    obj.show1();
    obj.show2();
  }
}

Output:

Studerende arver ejendomme fra Person
Jeg er en Student, der tilhører Personklasse
Ingeniørstuderende, der arver ejendomme fra Student

3. Hierarkisk arv i Java

I Hierarchical Inheritance fungerer én klasse som en superklasse (basisklasse) for mere end én underklasse. Mere end én underklasse kan arve funktionerne i en basisklasse.

I det følgende diagram er klasse A en basisklasse for de afledte klasser B, C og D.

Kode til illustration af hierarkisk arv:

package com.techvidvan.inheritance;

//Base class
class Person
{
  public void show()
  {
  System.out.println("I am a Person");
  }
}

//child class1
class Student extends Person
{
  public void show1()
  {
  System.out.println("I am a Student who is Person ");
  }
}

//child class2
class Teacher extends Person
{
  // defining additional properties to the child class

  public void show2()
  {
    System.out.println("I am a Teacher who is a Person");
  }
}
//child class3
class Doctor extends Person
{
  // defining additional properties to the child class

  public void show3()
  {
    System.out.println("I am a Doctor who is a Person");
  }
}

public class HierarchicalInheritance
{
  public static void main(String args[])
  {
    Teacher teacher = new Teacher();
    Student student = new Student();
    Doctor doctor = new Doctor();
    student.show();
    student.show1();
    teacher.show2();
    doctor.show3();
  }
}

Output:

Jeg er en person
Jeg er en studerende, der er en person
Jeg er en lærer, der er en person
Jeg er en læge, der er en person

4. Multipel arv i Java

I Multiple Inheritance kan én underordnet eller underklasseklasse have mere end én basisklasse eller superklasse og nedarve funktioner fra hver overordnede klasse, som den arver.

Vi har allerede diskuteret, at Java ikke understøtter flere nedarvninger med klasser. Vi kan kun opnå flere arv ved hjælp af grænseflader.

I det følgende diagram arver klasse C fra grænseflader A og B.

Kode til illustration af multipel arv:

package com.techvidvan.inheritance;

//base interface1
interface Moveable
{
  public void run();
}

//base interface2
interface Speakable
{
  public void speak();
}

//child interface inheriting two base interfaces
interface Ability extends Moveable, Speakable
{
  public void show();
}

class Person implements Ability
{
  @Override
  public void run()
  {
    System.out.println("I can run !!");
  }
  @Override
  public void speak()
  {
    System.out.println("I can speak !!");
  }
  @Override
  public void show() 
  {
    System.out.println("I am a person, I can speak and run !!");
  }
}

public class MultipleInheritance
{
  public static void main(String[] args)
  {
    Person obj = new Person();
    obj.run();
    obj.speak();
    obj.show();
  }
}

Output:

Jeg kan løbe !!
Jeg kan tale !!
Jeg er en person, jeg kan tale og løbe !!

5. Hybrid arv i Java

Det er en kombination af to eller flere typer af arv. Den hybride arv er heller ikke mulig med klasser, fordi Java ikke understøtter multipel nedarvning med klasser. Vi kan kun opnå hybrid arv gennem grænseflader.

I det følgende diagram er klasse A basisklassen for underklasserne B og C. Og klasse D arver både klasserne B og C.

Kode til at illustrere hybrid arv:

package com.techvidvan.inheritance;
//base class 1
class Ability
{
  public void show()
  {
    System.out.println("I am a person, I can speak and run !!");
  }
}

//child interface 1
interface Moveable
{
  public void run();
}

//child interface2
interface Speakable
{
  public void speak();
}

//child class inheriting two base interfaces
class Person extends Ability implements Moveable, Speakable
{
  @Override
  public void run()
  {
    System.out.println("I can run !!");
  }
  @Override
  public void speak()
  {
    System.out.println("I can speak !!");
  }
}

public class HybridInheritance
{
  public static void main(String[] args)
  {
    Person obj = new Person();
    obj.run();
    obj.speak();
    obj.show();
  }
}

Output:

Jeg kan løbe !!
Jeg kan tale !!
Jeg er en person, jeg kan tale og løbe !!

Arv i OOP med realtidseksempel

Overvej en applikationspolygon, der repræsenterer forskellige typer former.

Det er meningen, at vi skal skabe to forskellige typer polygoner, den ene vil være rektangel og den anden vil være trekant.

Lad os sammenligne og studere de to forskellige tilgange til kodning med et struktureret og objektorienteret programmeringsperspektiv.

Strukturel tilgang:

Ved hjælp af en struktureret programmeringstilgang vil vi oprette to funktioner:

  • En for at få antallet af sider af en polygon.
  • Og den anden til at beregne arealet.

Funktionen af ​​disse funktioner forbliver den samme på tværs af to forskellige former.

OOPs tilgang:

Ved at bruge OOPs programmeringstilgang ville vi oprette to forskellige klasser.

  • Hver har implementering af funktionerne thegetNumberOfSides() og getArea().
  • Dette vil reducere ekstra arbejde.

Ændringsanmodning i software

Antag, at der er en ændring i softwarens funktionalitet. Det er meningen, at du skal tilføje funktionaliteten til at finde arealet af en firkant.

Lad os se, hvordan vi håndterer dette problem med begge tilgange.

Strukturel tilgang:

Hvis vi ønsker at tilføje en ny funktion ved hjælp af en funktionel eller traditionel metode, bliver vi nødt til at ændre funktionen getArea() som allerede er testet og baselinet. Hvis vi tilføjer ny funktionalitet til at finde arealet af en firkant, vil vores kode se sådan ud:

OOPs tilgang:

Ved at bruge den objektorienterede tilgang skal du blot tilføje en ny klasse Square, som vil have den unikke funktionalitet at finde området omkring Square. Der er ingen grund til at ændre det stykke kode, der allerede er testet ved at bruge denne fremgangsmåde.

En anden ændringsanmodning

Antag, hvis der er nogle flere ændringer påkrævet i softwaren. For eksempel, hvis du vil tilføje et Shape Parallelogram med dets egne unikke krav.

Strukturel tilgang:

Hvis vi ønsker at tilføje Parallelogram Shape i den eksisterende klasse ved hjælp af den strukturelle tilgang, bliver vi helt sikkert nødt til at foretage ændringer i den eksisterende kode.

OOPs tilgang:

Hvis vi ønsker at tilføje en anden form i den eksisterende klasse ved hjælp af den objektorienterede tilgang, skal vi blot oprette et nyt klasse Parallelogram med dets unikke metoder. Diagrammet nedenfor illustrerer det samme –

Så selv om den strukturelle programmering i den indledende fase så ud til at være en nem tilgang, men da kompleksiteten af ​​koden øges, og der er flere ændringer i kravene, så mislykkes denne tilgang.

Til sidst vinder den objektorienterede tilgang på lang sigt.

Men du tænker måske, at vi på tværs af alle klasser skal skrive et gentaget stykke kode for hver klasse.

For at overvinde dette problem med gentagelser kan vi oprette en overordnet klasse kaldet "Shape" og implementere den samme funktion som getNumberOfSides og getArea. Derefter vil vi oprette de underordnede klasser, der vil arve denne overordnede klasse Shape.

Så de får adgang til funktionerne getNumberOfSides og getArea i Shape-klassen.

Det er ikke nødvendigt at erklære disse funktioner i hver klasse. Dette koncept kaldes arv i java.

Så du kan tydeligt se, at vi ved hjælp af OOP's arvetilgang nemt kan opdatere vores kode uden at forstyrre den kode, som allerede er testet.

Oversigt

Arv er den vigtigste egenskab ved objektorienteret programmering. Det hjælper med at reducere kompleksiteten ved at skrive meget store koder, da det giver kodegenbrugsfunktionen.

Når vi kommer til slutningen af ​​denne artikel, har vi lært det grundlæggende om arv i Java, betydningen af ​​arv samt forskellige typer af arv i Java med kodningseksempler og diagramillustrationer, så du nemt kan forstå konceptet.

Vi diskuterede også betydningen af ​​arv med nogle eksempler fra den virkelige verden, som kan være yderligere nyttige for dig i programmering i den virkelige verden.

Tak fordi du læste vores artikel. Hvis du har spørgsmål eller forslag relateret til Java Inheritance, så lad os det vide ved at efterlade en kommentar nedenfor.


Java tag