Polymorfisme i Java (Statisk og dynamisk)

Hva er polymorfisme i Java?

polymorfisme in Java oppstår når det er en eller flere klasser eller objekter knyttet til hverandre ved arv. Det er evnen til et objekt til å ta mange former. Arv lar brukere arve attributter og metoder, og polymorfisme bruker disse metodene til å utføre forskjellige oppgaver. Så målet er kommunikasjon, men tilnærmingen er annerledes.

For eksempel har du en smarttelefon for kommunikasjon. Kommunikasjonsmodusen du velger kan være hva som helst. Det kan være en samtale, en tekstmelding, en bildemelding, e-post osv. Så målet er vanlig, det er kommunikasjon, men deres tilnærming er annerledes. Dette kalles Polymorfisme. Nå skal vi lære polymorfisme i Java med eksempel.

Klikk her. hvis videoen ikke er tilgjengelig

Java Polymorfisme i OOP-er med eksempel

Vi har en foreldreklasse, 'Konto' med funksjon av innskudd og uttak. Kontoen har 2 barneklasser. Driften av innskudd og uttak er den samme for spare- og sjekkkontoer. Så de nedarvede metodene fra kontoklassen vil fungere.

Enkeltarv i Java
Java Eksempel på polymorfisme

Endring i programvarekrav

Det er en endring i kravspesifikasjonen, noe som er så vanlig i programvareindustrien. Du skal legge til funksjonalitetsprivilegert bankkonto med kassekreditt. For en bakgrunn er kassekreditt en fasilitet hvor du kan ta ut et beløp mer enn tilgjengelig saldo på kontoen din. Så, trekke tilbake metode for privilegerte behov implementert på nytt. Men du endrer ikke den testede kodebiten i Spare- og brukskonto. Dette er fordelen med OOPS

Java polymorfisme

Trinn 1) Slik at når "uttaksmetoden" for å spare konto kalles, blir en metode fra overordnet kontoklasse utført

Java polymorfisme

Trinn 2) Men når "Uttak"-metoden for den privilegerte kontoen (kassekreditt) kalles, blir uttaksmetoden definert i den privilegerte klassen utført. Dette er Polymorfisme i OOPs.

Java polymorfisme

Metode Overstyring inn Java

Metodeoverstyring er å redefinere en superklassemetode i en underklasse.

Regler for metodeoverstyring

  • Metodesignaturen dvs. metodenavn, parameterliste og returtype må samsvare nøyaktig.
  • Den overstyrte metoden kan utvide tilgjengeligheten, men ikke begrense den, dvs. hvis den er privat i basisklassen, kan barneklassen gjøre den offentlig, men ikke omvendt.

Regler for metodeoverstyring inn 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();
  }
}

Forskjellen mellom overbelastning og overstyring

Metode Overbelastning
Metode Overstyring
Metodeoverbelastning er i samme klasse, der mer enn én metode har samme navn, men forskjellige signaturer. Metodeoverstyring er når en av metodene i superklassen omdefineres i underklassen. I dette tilfellet forblir signaturen til metoden 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
 }
}

Hva er dynamisk polymorfisme?

Dynamisk polymorfisme i OOPs er mekanismen der flere metoder kan defineres med samme navn og signatur i superklassen og underklassen. Anropet til en overstyrt metode løses under kjøring.

Eksempel på dynamisk polymorfisme:

En referansevariabel for superklassen kan referere til et subklasseobjekt

 Doctor obj = new Surgeon();

Vurder utsagnet

obj.treatPatient();

Her er referansevariabelen "obj" av den overordnede klassen, men objektet den peker på er av barneklassen (som vist i diagrammet nedenfor for polymorfisme).

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

Hvis en baseklassereferanse brukes til å kalle en metode, bestemmes metoden som skal påkalles av JVM, avhengig av objektet referansen peker til

For eksempel, selv om obj er en referanse til Doctor, kaller den metoden til Surgeon, da den peker på et Surgeon-objekt

Dette bestemmes i løpet av kjøretiden og betegnes derfor dynamisk or kjøretidspolymorfisme

Forskjellen mellom statisk og dynamisk polymorfisme

Statisk polymorfisme i Java er en type polymorfisme som samler informasjonen for å kalle en metode på kompileringstidspunktet, mens dynamisk polymorfisme er en type polymorfisme som samler informasjonen for å kalle en metode ved kjøring.

Statisk polymorfisme
Dynamisk polymorfisme
Det er relatert til metodeoverbelastning. Det gjelder metodeoverstyring.
Eventuelle feil løses på kompileringstidspunktet. Siden koden ikke kjøres under kompilering, derav navnet static.

ex:

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

I tilfelle en referansevariabel kaller en overstyrt metode, bestemmes metoden som skal påkalles av objektet referansevariabelen din peker på. Dette kan bare bestemmes under kjøring når koden er under utførelse, derav navnet dynamisk.

ex:

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

Super nøkkelord i Java

Hva om treatPatient-metoden i Surgeon-klassen ønsker å utføre funksjonaliteten definert i Doctor-klassen og deretter utføre sin egen spesifikke funksjonalitet? I dette tilfellet, nøkkelord superkan brukes til å få tilgang til metoder for overordnet klasse fra barneklassen. Behandlingspasientmetoden i Surgeon-klassen kan skrives som:

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

Nøkkelordet super kan brukes for å få tilgang til alle datamedlem eller metoder for superklassen i underklassen.

Deretter skal vi lære om Super søkeord, Arv og polymorfisme i Java med eksempelprogrammer.

Eksempel:-For å lære arv, polymorfisme og supernøkkelord

Trinn 1) Kopier følgende kode inn 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");
      }
}

Trinn 2) Lagre, kompiler og kjør koden. Observer utgangen.

Trinn 3) Fjern kommentarer linje 6-9. Lagre, kompiler og kjør koden. Observer utgangen.

Trinn 4) Fjern kommentar linje #10. Lagre og kompiler koden.

Trinn 5) Feil = ? Dette er fordi underklassen ikke kan få tilgang til private medlemmer av superklassen.

Sammendrag

  • Polymorfisme i objektorientert programmering oppstår når det er en eller flere klasser eller objekter knyttet til hverandre ved arv. Det er evnen til et objekt til å ta mange former.
  • Metodeoverstyring er å redefinere en superklassemetode i en underklasse.
  • Dynamisk polymorfisme i Java er mekanismen der flere metoder kan defineres med samme navn og signatur i superklassen og underklassen.
  • Statisk polymorfisme i Java er en type polymorfisme som samler informasjonen for å kalle en metode på kompileringstidspunktet, mens dynamisk polymorfisme er en type polymorfisme som samler informasjonen for å kalle en metode ved kjøring.
  • Supernøkkelord kan brukes for å få tilgang til metoder for overordnet klasse fra barneklassen.