Polymorfi i Java (Statisk og dynamisk)

Hvad er polymorfisme i Java?

polymorfi in Java opstår, når der er en eller flere klasser eller objekter relateret til hinanden ved arv. Det er et objekts evne til at antage mange former. Nedarvning lader brugere arve attributter og metoder, og polymorfi bruger disse metoder til at udføre forskellige opgaver. Så målet er kommunikation, men tilgangen er anderledes.

For eksempel har du en smartphone til kommunikation. Den kommunikationstilstand, du vælger, kan være hvad som helst. Det kan være et opkald, en sms, en billedbesked, mail osv. Så målet er fælles, det er kommunikation, men deres tilgang er anderledes. Dette kaldes Polymorfi. Nu vil vi lære polymorfi i Java med eksempel.

Klik link. hvis videoen ikke er tilgængelig

Java Polymorfi i OOP'er med eksempel

Vi har én forældreklasse, 'Konto' med funktion af ind- og udbetaling. Kontoen har 2 børneklasser. Betjeningen af ​​ind- og udbetaling er den samme for opsparings- og checkkonti. Så de nedarvede metoder fra kontoklassen vil fungere.

Enkeltarv i Java
Java Eksempel på polymorfi

Ændring i softwarekrav

Der er en ændring i kravspecifikationen, noget der er så almindeligt i softwareindustrien. Det er meningen, at du skal tilføje funktionalitetsprivilegeret bankkonto med kassekredit. For en baggrund er kassekredit en facilitet, hvor du kan hæve et beløb, der er mere end tilgængeligt saldo på din konto. Så tilbagetræk metode for privilegerede behov implementeret på ny. Men du ændrer ikke det testede stykke kode i opsparings- og checkkonto. Dette er fordelen ved OOPS

Java polymorfi

Trin 1) Sådan, at når den "udtrukne" metode til at spare konto kaldes, udføres en metode fra overordnet kontoklasse

Java polymorfi

Trin 2) Men når "Udtræk"-metoden for den privilegerede konto (overtræksfacilitet) kaldes, udføres udbetalingsmetoden defineret i den privilegerede klasse. Dette er Polymorfi i OOP'er.

Java polymorfi

Metode Tilsidesættelse af ind Java

Metodetilsidesættelse er at omdefinere en superklassemetode i en underklasse.

Regler for metodetilsidesættelse

  • Metodens signatur, dvs. metodenavn, parameterliste og returtype, skal matche nøjagtigt.
  • Den tilsidesatte metode kan udvide tilgængeligheden, men ikke indsnævre den, dvs. hvis den er privat i basisklassen, kan børneklassen gøre den offentlig, men ikke omvendt.

Regler for metodetilsidesættelse Java

Eksempel

class Doctor{
  public void treatPatient(){
  // treatPatient method
  
}
class Surgeon extends Doctor{
  public void treatPatient(){
  // treatPatient method
  }
}
Class run{
  public static void main (String args[]){
    Doctor doctorObj = new Doctor()
	// treatPatient method in class Doctor will be executed
    doctorObj.treatPatient();
   
    Surgeon surgeonObj = new Surgeon();
    // treatPatient  method in class Surgeon  will be executed
    surgeonObj.treatPatient();
  }
}

Forskellen mellem overbelastning og tilsidesættelse

Metode Overbelastning
Metode tilsidesættelse
Metodeoverbelastning er i samme klasse, hvor mere end én metode har samme navn, men forskellige signaturer. Metodetilsidesættelse er, når en af ​​metoderne i superklassen omdefineres i underklassen. I dette tilfælde forbliver metodens signatur den samme.
ex:

void sum (int a , int b);
void sum (int a , int b, int c);
void sum (float a, double b);
ex:

class X{
  public int sum(){
     // some code
  }
}
class Y extends X{
  public int sum(){
    //overridden method
   //signature is same
 }
}

Hvad er dynamisk polymorfisme?

Dynamisk polymorfi i OOP'er er den mekanisme, hvorved flere metoder kan defineres med samme navn og signatur i superklassen og underklassen. Kaldet til en tilsidesat metode løses ved kørsel.

Eksempel på dynamisk polymorfi:

En referencevariabel for superklassen kan referere til et underklasseobjekt

 Doctor obj = new Surgeon();

Overvej udsagnet

obj.treatPatient();

Her er referencevariablen "obj" af den overordnede klasse, men objektet, den peger på, er af den underordnede klasse (som vist i nedenstående diagrameksempel af Polymorphism).

obj.treatPatient() vil udføre treatPatient()-metoden for underklassen – Surgeon

Hvis en basisklassereference bruges til at kalde en metode, bestemmes metoden, der skal påberåbes af JVM, afhængigt af det objekt, referencen peger på

For eksempel, selvom obj er en reference til Doctor, kalder den metoden Surgeon, da den peger på et Surgeon-objekt

Dette afgøres i løbet af køretiden og betegnes derfor dynamisk or run-time polymorfi

Forskellen mellem statisk og dynamisk polymorfi

Statisk polymorfisme i Java er en type polymorfi, der indsamler informationen til at kalde en metode på kompileringstidspunktet, hvorimod dynamisk polymorfi er en type polymorfi, der indsamler informationen til at kalde en metode under kørsel.

Statisk polymorfisme
Dynamisk polymorfisme
Det vedrører metodeoverbelastning. Det vedrører metodetilsidesættelse.
Eventuelle fejl bliver løst på kompileringstidspunktet. Da koden ikke udføres under kompilering, derfor navnet static.

ex:

void sum (int a , int b);
void sum (float a, double b);
int sum (int a, int b); //compiler gives error.

Hvis en referencevariabel kalder en tilsidesat metode, bestemmes metoden, der skal aktiveres, af det objekt, som din referencevariabel peger på. Dette kan kun bestemmes under kørsel, når koden er under udførelse, deraf navnet dynamisk.

ex:

//reference of parent pointing to child object
 Doctor obj = new Surgeon();
// method of child called
obj.treatPatient();

Super søgeord i Java

Hvad hvis treatPatient-metoden i Surgeon-klassen ønsker at udføre den funktionalitet, der er defineret i Doctor-klassen og derefter udføre sin egen specifikke funktionalitet? I dette tilfælde søgeord superkan bruges til at få adgang til metoder for forældreklassen fra underklassen. TreatPatient-metoden i Surgeon-klassen kunne skrives som:

treatPatient(){
   super.treatPatient();
     //add code specific to Surgeon
}

Nøgleordet super kan bruges til at få adgang til ethvert datamedlem eller metoder i superklassen i underklassen.

Dernæst vil vi lære om Super søgeord, Arv og polymorfi i Java med eksempelprogrammer.

Eksempel:-At lære arv, polymorfi og supersøgeord

Trin 1) Kopier følgende kode ind i en Editor

public class Test{
     public static void main(String args[]){
        X x= new X();
       Y y = new  Y();
       y.m2();
      //x.m1();
      //y.m1();
     //x = y;// parent pointing to object of child
     //x.m1() ;
     //y.a=10;
   }
}
class X{
   private int a;
   int b;
      public void m1(){
       System.out.println("This is method m1 of class X");
     }
}
class Y extends X{
      int c; // new instance variable of class Y
         public void m1(){
            // overriden method
            System.out.println("This is method m1 of class Y");
        }
       public void m2(){
           super.m1();
           System.out.println("This is method m2 of class Y");
      }
}

Trin 2) Gem, kompilér og kør koden. Observer outputtet.

Trin 3) Fjern kommentarer til linje #6-9. Gem, kompilér og kør koden. Observer outputtet.

Trin 4) Fjern kommentar linje #10. Gem og kompilér koden.

Trin 5) Fejl = ? Dette skyldes, at underklassen ikke kan få adgang til private medlemmer af superklassen.

Resumé

  • Polymorfi i objektorienteret programmering opstår, når der er en eller flere klasser eller objekter relateret til hinanden ved nedarvning. Det er et objekts evne til at antage mange former.
  • Metodetilsidesættelse er at omdefinere en superklassemetode i en underklasse.
  • Dynamisk polymorfisme i Java er den mekanisme, hvorved flere metoder kan defineres med samme navn og signatur i superklassen og underklassen.
  • Statisk polymorfisme i Java er en type polymorfi, der indsamler informationen til at kalde en metode på kompileringstidspunktet, hvorimod dynamisk polymorfi er en type polymorfi, der indsamler informationen til at kalde en metode under kørsel.
  • Supernøgleord kan bruges til at få adgang til metoder for forældreklassen fra underklassen.