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

Tilsidesættelse af Java-metode – Lær dens betydning og regler med kodningseksempler

I det sidste selvstudie har vi lært begrebet polymorfi i Java. Vi dækkede de to slags polymorfi i Java og processen med at implementere dem i Java.

Vi ved, at statisk polymorfi kan opnås på kompileringstidspunktet ved hjælp af Method Overloading, mens dynamisk polymorfi kan opnås ved kørsel/udførelsestid ved hjælp af Method Overriding.

I denne artikel vil vi studere i detaljer om metodetilsidesættelse i Java med dets regler og eksempler.

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

Hvad er Java-metodetilsidesættelse?

Metodetilsidesættelse er en funktion, der giver os mulighed for at omdefinere metoden i underklassen eller den afledte klasse, som allerede er defineret i dens overordnede klasse eller superklasse.

I ethvert objektorienteret programmeringssprog kan vi kun implementere metodetilsidesættelse, når to klasser har et 'Er-en'-arvsforhold mellem dem.

Ved at bruge metodetilsidesættelse kan en afledt klasse eller underordnet klasse give en specifik implementering af en funktion eller metode, der allerede er defineret i en af ​​dens overordnede klasser.

Når en metode af en afledt eller underklasse har samme navn, samme returtype eller signatur og med de samme argumenter som en metode i dens overordnede klasse, så siger vi, at metoden i superklassen bliver tilsidesat af metoden i underklasse.

Dette koncept, når en metode af en underklasse tilsidesætter den samme metode i sin superklasse, men med en anden implementering, kaldes Method Overriding.

Vigtigheden af ​​tilsidesættelse af Java-metode

Nu skal du tænke på, hvad der er behov for at bruge Metodetilsidesættelse. Så lad os diskutere anvendelserne og vigtigheden af ​​metodetilsidesættelse i Java.

  • En af fordelene ved Metodetilsidesættelse er evnen til at give en specifik implementering eller definition af en metode i en underklasse, som allerede findes i dens superklasse. Denne metode kan tilsidesættes i underklassen i henhold til kravet.
  • Det er også nyttigt i implementeringen af ​​Runtime eller Dynamic Polymorphism, hvor metoden påkaldes under afviklingen af ​​programmet. Grundlæggende bestemmer typen af ​​objekt og ikke typen af ​​referencevariabel, hvilken metode der skal udføres ved kørsel.

Følgende figur illustrerer metodetilsidesættelsen i Java, hvor metoden draw() bliver tilsidesat i de tre underklasser (Square, Circle og Hexagon) af deres basisklasse eller superklasse Shape.

Eksempel og kode til at forstå metodetilsidesættelse i Java

Lad os tage et simpelt eksempel for at forstå begrebet Metodetilsidesættelse. Vi har to klasser:En forældreklasse Shape og en børneklasse Cirkel. Circle-klassen arver Shape-klassen.

Begge klasser har en fælles metode void draw(). Barneklassen giver sin egen implementering til draw()-metoden. Med andre ord, det tilsidesætter draw()-metoden for den overordnede klasse.

Formålet med Method Overriding er, at hvis den afledte klasse ønsker at give sin egen implementering, kan den give ved at tilsidesætte metoden for den overordnede klasse. Når vi kalder denne tilsidesatte metode, vil den udføre metoden for den underordnede klasse, ikke den overordnede klasse.

Dette eksempel er illustreret nedenfor ved hjælp af kode.

Kode til at forstå begrebet metodetilsidesættelse:

package com.techvidvan.methodoverriding;
//Base class
class Shape
{
  void draw()
  {
    System.out.println("Inside the method of Parent class ");
    System.out.println("Drawing Shapes");
  }
}

//Derived class
class Circle extends Shape
{
  //Overriding method of base class with different implementation
  @Override
  void draw()
  {
    System.out.println("Inside the overridden method of the child class ");
    System.out.println("Drawing Circle");
  }
}

//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    //creating object of Base class Shape
    // If a Parent type reference refers
    // to a Parent object, then Parent's draw() method is called

    Shape obj = new Shape();
    obj.draw();

    // If a Parent type reference refers to a Child object Child's draw() method is called.
    //This is called RUN TIME POLYMORPHISM.

    Shape obj1=new Circle();
    obj1.draw();
  }
}

Output:

Inde i metoden i forældreklassen
Tegne figurer
Inde i den tilsidesatte metode for den underordnede klasse
Tegnecirkel

Regler for metodetilsidesættelse i Java

1. Tilsidesætte adgangsmodifikatorer

Vi kan ændre adgangsmodifikatoren for en tilsidesættende metode. I den afledte klasse, mens vi tilsidesætter en metode, kan vi give mindre begrænsning, men ikke mere, restriktiv adgang end adgangen til den tilsidesatte metode for superklassen.

For eksempel kan metoden, der er erklæret som offentlig i superklassen, ikke gøres privat eller beskyttes, mens den tilsidesættes i underklassen.

På samme måde kan den beskyttede metode gøres offentlig, men ikke privat i underklassen. Hvis vi giver mindre adgang i underklassen end i superklassen, får vi en kompileringsfejl.

Dyk lidt dybt ned i konceptet Access Modifier i Java med Techvidvan.

Bemærk: Vi kan ikke tilsidesætte private metoder !!

Kode til at illustrere metodetilsidesættelse og adgangsmodifikatorer:

package com.techvidvan.methodoverriding;
//Parent Class
class ParentClass
{
  // private methods are not overridden
  private void parentMethod1()
  {
    System.out.println("Inside the parentMethod1() of ParentClass");
  }

  protected void parentMethod2()
  {
    System.out.println("Inside the parentMethod2() of ParentClass");
  }
}

class ChildClass extends ParentClass
{

  private void parentMethod1()
  {
    System.out.println("Inside the parentMethod1() of ChildClass");
  }

  // overriding method with more accessibility
  @Override
  public void parentMethod2()
  {
    System.out.println("Inside the parentMethod1() of ChildClass");
  }
}
//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {

    ParentClass obj1 = new ParentClass();
    obj1.parentMethod1(); //overriding private methods will give an error
    obj1.parentMethod2();

    ParentClass obj2 = new ChildClass();
    obj2.parentMethod2();
  }
}

Output:

Undtagelse i tråden “main” java.lang.Error:Uløst kompileringsproblem:
Metoden parentMethod1() fra typen ParentClass er ikke synlig
ved project1/com.techvidvan.methodoverriding.MethodOverridingDeno.main(MethodOverridingDeno .java:39)

For at fjerne undtagelsen kommentere denne linje:

obj1.parentMethod1();

Efter at have kommenteret ovenstående linje vil vi få et output som:

Inde i parentMethod2() i ParentClass
Inde i parentMethod1() i ChildClass

2. De metoder, der er erklæret som 'endelige', kan ikke tilsidesættes

Hvis vi erklærer en metode som endelig i den overordnede klasse, kan den ikke tilsidesættes i underklassen. Det bruges, når vi ikke ønsker, at andre klasser skal tilsidesætte metoderne på den forkerte måde.

Kodestykke til at illustrere tilsidesættelse af en endelig metode:

class Base
{
      	// final method can't be overridden
      	final void show()
      	{
      	}
}
class Base extends Derived
{
      	// This would produce an error
      	void show()
      	{
      	}
}

Output:

fejl:show() i Drived kan ikke tilsidesætte show() i Base
void show() { }
^

En tilsidesat metode er endelig

3. De metoder, der er erklæret som 'statiske', kan ikke tilsidesættes

Metodeskjul er processen med at definere den statiske metode i den afledte klasse med samme signatur som en statisk metode i basisklassen.

Det er, når du tilsidesætter en statisk metode for superklassen med det statiske nøgleord, så vil den skjule metoden for superklassen. Hvis en afledt klasse omdefinerer den statiske metode for basisklassen, så tilsidesætter den ikke denne metode, men skjuler den.

Følgende tabel viser forskellige scenarier, når du definerer en metode med samme signatur som en metode i en superklasse.

Kode til at illustrere tilsidesættelsen af ​​en statisk metode:

package com.techvidvan.methodoverriding;
//Parent Class
class Parent
{
static void method1()
{
    System.out.println("Inside static method1() of Parent class");
}
void method2()
{
    System.out.println("Inside non-static(instance) method2() of Parent class");
}
}
class Child extends Parent
{
//This will hide method1() of Child
static void method1()
{
    System.out.println("Inside static method1() of child class");
}
//This method overrides method2() in Parent
@Override
public void method2()
{
    System.out.println("Inside non-static(instance) method2() of child class");
}
}
//Driver class
public class MethodOverridingDemo
{
public static void main(String args[])
{
    Parent obj2 = new Child();
    obj2.method1();
    obj2.method2();
}
}

Output:

Inde i statisk metode1() af overordnet klasse
Inde i ikke-statisk(instans) metode2() af underordnet klasse

I ovenstående kode,

obj2.method1();

Denne sætning skal kalde metode1 for underordnet klasse, men da den underordnede klasse tilsidesætter metoden med det statiske nøgleord, vil denne metode derfor blive skjult, og metode1 for overordnet klasse vil blive kaldt.

4. Tilsidesættende metode skal have samme returtype (eller undertype)

Fra Java 5.0 og fremefter er det muligt at have en anden returtype for en tilsidesat metode i den underordnede klasse, forudsat at returtypen for den underordnede klasse er den samme som en undertype af den tilsidesatte metodes returtype for basisklassen. Denne type returtype kaldes en kovariant returtype.

Kode til at illustrere ovenstående koncept:

package com.techvidvan.methodoverriding;
//Parent Class
class Parent
{
  Parent display(String sentence)
  {
    System.out.println(sentence);
    return new Parent();
  }
}
//Child class
class Child extends Parent
{
  @Override
  Child display(String sentence)
  {
    System.out.println(sentence);
    return new Child();
  }
}
//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    Parent obj = new Child();
    obj.display("TechVidvan's Java Tutorial");
    obj.display("Inside the method of the child class");
  }
}

Output:

TechVidvans Java-tutorial
Inde i metoden for børneklassen

5. Påberåber tilsidesættelse af metoder fra børneklasse

Vi kan påkalde eller kalde metoden for overordnet klasse, mens vi tilsidesætter metoden i den afledte klasse ved hjælp af super søgeord.

Kode til at illustrere brugen af ​​supersøgeord til at kalde tilsidesatte metoder:

package com.techvidvan.methodoverriding;
//Parent Class
class Parent
{
  void display()
  {
    System.out.println("Inside display() of Parent class");
  }
}

//Child class
class Child extends Parent
{
  @Override
  void display()
  {

    //calling the parent class method through the super keyword
    super.display();

    System.out.println("Inside display() of child class");
  }
}

//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    Parent obj = new Child();
    obj.display();
  }
}

Output:

Inside display() af overordnet klasse
Inside display() af underordnet klasse

6. Tilsidesættende konstruktører

Konstruktører kan ikke tilsidesættes, det er navnet på konstruktørerne kan ikke være det samme i forældre- og underklasse. Fordi navnet på konstruktøren altid er det samme som klassenavnet.

7. Tilsidesætte abstrakte metoder

Vi kan kun tilsidesætte Java Abstract-metoder i de konkrete klasser, ellers vil der opstå en kompileringsfejl. En konkret klasse er en klasse, der har implementeringen af ​​alle dens metoder. Simpelthen kaldes de klasser, der ikke har nogen abstrakte metoder, konkrete klasser.

8. Tilsidesættelse af metoder fra forskellige pakker

En underklasse er til stede i en anden pakke, så den kan kun tilsidesætte den ikke-finale metoder, der er erklæret somoffentlige eller beskyttede.

9. Tilsidesættelse og undtagelseshåndtering i Java

Der er to regler, som vi bør huske, når vi håndterer undtagelser i Java:

Regel 1:

Når et kontrolleret udtryk kastes, forårsager det en kompileringsfejl. Hvis superklassen ikke afgiver nogen undtagelse, kan underklassen give en fejl.

Den tilsidesættende metode i underklassen kan kaste enhver ukontrolleret (runtime) undtagelse, uanset om den tilsidesatte metode i superklassen erklærer undtagelsen.

Kode til at forklare Regel 1:

package com.techvidvan.methodoverriding;
class Parent
{
  void display1()
  {
    System.out.println("Inside display1() method of Parent class");
  }
  void display2()
  {
    System.out.println("Inside display2() method of Parent class");
  }
}
class Child extends Parent
{
  @Override
  //no issue while throwing unchecked exception
  void display1() throws ArithmeticException
  {
    System.out.println("Inside display1() method of Child class");
  }
  @Override
  //compile-time error
  //issue while throwing checked exception
  void display2() throws Exception
  {
    System.out.println("Inside display2() method of Child class");
  }
}
//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    Parent obj = new Child();
    obj.display1();
    obj.display2();
  }
}

Output:

Inside display1() metode af Child class
Undtagelse i tråden "main" java.lang.Error:Uløst kompileringsproblem:
Exception Exception er ikke kompatibel med throws-klausulen i Parent.display2()at project1/com .techvidvan.methodoverriding.Child.display2(MethodOverridingDemo.java:24)
at project1/com.techvidvan.methodoverriding1.MethodOverridingDemo.main(MethodOverridingDemo.java:36)

Regel 2:

En kompileringsfejl opstår, hvis der opstår en undtagelse i en overordnet klasse. De tilsidesættende metoder for den underordnede klasse bør ikke kaste nogen afkrydsede undtagelser, der er bredere eller nyere i forhold til de undtagelser, der er erklæret af de tilsidesatte metoder i den overordnede klasse.

For eksempel kan vi ikke tilsidesætte en metode, der erklærer en SQLException. Undtagelse eller enhver anden ikke-runtime undtagelse, som bliver tilsidesat fra en metode, der erklærer en FileNotFoundException, medmindre det er en underklasse af FileNotFoundException.

Kode til at forklare Regel 2:

package com.techvidvan.methodoverriding;
//Parent Class
class Parent
{
  void display() throws RuntimeException
  {
    System.out.println("Inside display() method of Parent class");
  }
}
//Child class1
class Child1 extends Parent
{
  @Override
  // no issue while throwing same exception
  void display() throws RuntimeException

  {
    System.out.println("Inside display() method of Child1 class");
  }
}

class Child2 extends Parent
{
  @Override
  //no issue while throwing subclass exception
  void display() throws ArithmeticException
  {
    System.out.println("Inside display() method of Child2 class");
  }
}
class Child3 extends Parent
{
  @Override
  //no issue while not throwing any exception
  void display()
  {
    System.out.println("Inside display() method of Child3 class");
  }
}
class Child4 extends Parent
{
  @Override
  //compile-time error
  //issue while throwing parent exception
  void display() throws Exception
  {
    System.out.println("Inside display() method of Child4 class");
  }
}
//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    Parent obj = new Child1();
    obj.display();

    obj = new Child2();
    obj.display();

    obj = new Child3();
    obj.display();

    obj = new Child4();
    obj.display();
  }
}

Output:

Inside display()-metoden for Child1-klassen
Inside display()-metoden for Child2-klassen
Inside display()-metoden for Child3-klassen
Undtagelse i tråden "main" java.lang.Error:Uløst kompilering problem:
Undtagelse Undtagelse er ikke kompatibel med throws-klausulen i Parent.display()
på project1/com.techvidvan.methodoverriding.Child4.display(MethodOverridingDemo.
java:45)
på project1/com.techvidvan.methodoverriding1.MethodOverridingDemo.main(MethodOverridingDemo.java:65)

10. Tilsidesættelse af en synkroniseret/Strictfp-metode

Der er ingen effekt på den tilsidesatte metode, hvis metoden i superklassen er erklæret som synkroniseret eller strictfp.

Metodetilsidesættelse i Multilevel Inheritance i Java

package com.techvidvan.methodoverriding;
//Base Class
class Parent
{
void display()
{
  System.out.println("Inside display() method of Parent class");
}
}
//Inherited class
class Child extends Parent
{
//This method overrides show() of Parent
void display()
{
  System.out.println("Inside display() method of Child class");
}
}
//Inherited class
class GrandChild extends Child
{
//This method overrides show() of Parent
void display()
{
  System.out.println("Inside display() method of GrandChild class");
}
}
//Driver class
public class MethodOverridingDemo
{
  public static void main(String args[])
  {
    Parent obj1 = new GrandChild();
    obj1.display();
  }
}

Output:

Inside display()-metoden af ​​GrandChild-klassen

Hvornår skal metodetilsidesættelse anvendes i Java

Metodetilsidesættelse er, når en klasse har flere afledte klasser, og de afledte klasser skal bruge metoderne for deres overordnede klasse med den samme signatur (nummer, type og rækkefølge af parameter) , men med den anderledes implementering.

De kan tilsidesætte den samme metode og tilføje specifik funktionalitet uden selv at forstyrre koden for den overordnede klasse.

Eksempel:

Fra ovenstående diagram definerer Employee-klassen en getSalary()-metode, som er nedarvet af både klasserne Programmer og SalesPerson. Men SalesPerson-klassen ændrer metoden ved at tilføje en bonus.

Oversigt

Fra denne artikel kan vi konkludere, at underklassen kan give sin egen specifikke implementering eller definition til den metode, som den tilsidesætter, uden selv at ændre dens overordnede klasse.

Vi dækkede den detaljerede beskrivelse af runtime polymorfien ved hjælp af Method Overriding i Java. Vi diskuterede også forskellige regler, som man bør huske på, når man bruger metodetilsidesættelse i Java.

Tak fordi du læste vores artikel. Del vores artikel på sociale medier.

God læring 🙂


Java tag