CodeGym /Java-blogg /Tilfeldig /Java abstrakt metode og klasser
John Squirrels
Nivå
San Francisco

Java abstrakt metode og klasser

Publisert i gruppen
Abstrakte metoder er et kraftig verktøy for Java og gir dette objektorienterte språket enda flere muligheter når det kommer til polymorfisme. En abstrakt Java-metode kan brukes til å lage et grunnleggende rammeverk for et helt program og gjøre det mulig å justere etter behov.Java abstrakt metode og du - 1

Hva er en abstrakt metode?

En abstrakt metode er en metode som ikke har noen implementering. Det vil si at den bare har en erklæring, slik at du vet navnet, returtypen og variablene den vil akseptere. Her er et eksempel på en grunnleggende abstrakt metode:

public abstract int example(int a1, int a2);
Når du ser på denne metoden, kan du se at den returnerer et heltall og den aksepterer to heltall som argument. Det du ikke kan si er hvordan denne metoden er implementert. Det er fordi for å implementere det, må du overstyre det. Når du lager en abstrakt metode i java, må du følge noen få retningslinjer, ellers vil ikke programmet kompilere riktig. Huske:
  • Java abstrakte metoder har ingen implementering. Det vil si at de aldri skal følges av krøllete seler og en kropp som forteller hvordan metoden skal brukes. Det er bare avsluttet med semikolon.

  • Hvis du lager en abstrakt metode, kan den bare settes inn i en abstrakt klasse. Det vil si at du ikke kan ha en konkret klasse som har en abstrakt metode inni seg.
    Jeg. Som en sidenotat, hvis du har en abstrakt klasse, kan den inneholde konstruktører. Det trenger imidlertid ikke å ha en abstrakt metode.

  • Når en konkret klasse utvider en abstrakt klasse, må den også implementere alle de abstrakte metodene til overordnet klasse, ellers kan den ikke være konkret og må erklæres abstrakt.

De to siste kan være litt forvirrende, så la oss avklare det med en gang.

Utvide abstrakte Java-klasser

La oss si at vi ønsker å skrive et program om grunnleggende former som vil returnere omkrets og areal. Så vi lager en abstrakt klasse for foreldre. Men fordi hver form har sine egne regler, må hver enkelt beregnes forskjellig, så vi skriver den abstrakte Shape -klassen slik:

abstract class Shape {
  		String shapeName = " ";
  		Shape(String name) { 
    			this.shapeName = name; 
  		} 

abstract double area();
  		abstract double perimeter();
}
Nå, hvis vi faktisk ønsker å bruke disse abstrakte metodene, må vi utvide den abstrakte Java-overordnede klassen Shape og deretter instansiere metodene. Så hver konkrete klasse må implementere området og omkretsen abstrakte metoder.

class Quadrilateral extends Shape  
{ 
    double length, width; 
      
    Quadrilateral(double l, double w, String name) 
    { 
        super(name); 
        this.length = l; 
        this.width = w; 
    } 
      
    @Override
    public double perimeter()  
    { 
        return ((2*length)+(2*width));
    } 
      
    @Override
    public double area()  
    { 
        return (length*width); 
    } 
}

Implementing the Quadrilateral class would then look like this
class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4, "Rectangle"); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
} 
Utdataene fra konsollen ser da slik ut:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Merk at klassen Quadrilateral ikke trenger å instansiere Shape(String name) -konstruktøren fra den overordnede klassen Shape . Det er fordi det ikke er en abstrakt metode. Men hvis du bare implementerte et område eller omkrets i en klasse, må den nye klassen være abstrakt fordi den ikke inkluderte begge. Du kan også bruke abstrakte metoder i grensesnitt.

Abstrakte Java-metoder med grensesnitt

La oss raskt se på hva et grensesnitt er og hvordan det skiller seg fra en abstrakt klasse. I et grensesnitt er alle variabler som er deklarert i et grensesnitt offentlige, statiske og endelige. Abstrakte klasser på den annen side har bare ikke-endelige variabler. Alt i et grensesnitt er offentlig som standard. En abstrakt klasse kan ha privat, beskyttet, offentlig osv. Til slutt, en klasse utvider ikke et grensesnitt, den implementerer det. Før JDK 8 kunne et grensesnitt ikke ha noe annet enn abstrakte metoder. Nå kan et grensesnitt ha standard og statiske metoder. På grunn av dette har beste praksis gått bort fra å bruke abstrakte metoder som utvidbare maler og fokusert på grensesnitt og implementering av dem. Så hvis du skulle lage Shape som et grensesnitt og deretter implementere det som firkant, hvordan ville det se ut? Først må du gjøre unna Shape(String name) -konstruktøren. Det vil se slik ut med bare de to abstrakte metodene:

interface Shape {

  abstract double area();
  abstract double perimeter();
}


So the Quadrilateral class would then look like this:
class Quadrilateral implements Shape {  

  double length, width; 
      
    	  Quadrilateral(double l, double w) {
    
    	    this.length = l; 
    	    this.width = w; 
    	  } 
      
    	  @Override
    	  public double perimeter() {
     
    	    return ((2*length)+(2*width));
    	  } 
      
    	  @Override
    	  public double area() {
    
   	    return (length*width); 
    	  } 
}
Til slutt, å bruke den nye firkanten når den implementerer Shape- grensesnittet ville være omtrent det samme:

class Main
{ 
    public static void main (String[] args)  
    { 
      
        // creating a Quadrilateral object using Shape as reference 
        Shape rectangle = new Quadrilateral(3,4); 
        System.out.println("Area of rectangle is " + rectangle.area()); 
        System.out.println("Perimeter of rectangle is " + rectangle.perimeter());
  
    } 
}
Og konsollutskriften vil se slik ut:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Hvis du vil utforske mer om forskjellene mellom grensesnitt og abstrakte klasser, kan du finne mer informasjon her.

Men hvorfor bruke abstrakte Java-metoder?

Det er mange grunner til at abstrakte metoder i Java brukes og hvorfor du bør bli komfortabel med å bruke dem. Her er tre raske grunner til at du bør bruke dem når det passer.
  1. Unngå duplisering av innsats – Se tilbake på vårt eksempelkoding; Tenk deg at du og teamet ditt trengte å lage klasser for andre former enn et rektangel. Hvor mange forskjellige måter er det du kan komme på for å designe den klassen? Ti? Femten? Og det er et enkelt problem. Tenk deg noe mye mer komplekst. Du og teamet ditt kan finne på hundre måter. Da ville du stå overfor den skremmende oppgaven å veve dem sammen til et sammenhengende program. Dette bringer oss til vårt neste punkt: å definere implementering.

  2. Abstrakte metoder i Java tillater definisjon av bruk og implementering - Når du bruker en abstrakt klasse eller grensesnitt, og ved design, abstrakte metoder, definerer du hvordan andre mennesker vil samhandle med grensesnittet ditt. Det lar dem vite hvilke variabler de bør bruke og hvilke returtyper de kan forvente.
    Selv om de kan overstyre dem og lage konkrete klasser som implementerer grensesnittet ditt på unike måter, setter du fortsatt i stein kjernebruken for koden din. Hvis noen vil implementere Shape, må de overstyre eller implementere både omkrets og område.

  3. Lesbarhet og feilsøking - Å ha abstrakte metoder vil forbedre lesbarheten til koden din. Når du skriver en klasse som implementerer et grensesnitt, vet du hva du skal se etter. Du vet at hver abstrakt metode i grensesnittet vil være i implementeringen, og det gjør det lettere å lese og spore opp eventuelle feil. Abstrakte metoder er bare begynnelsen på å lære hvordan man bruker polymorfisme riktig i Java og andre objektorienterte språk. Når du begynner å forstå og bruke dem, vil et helt nytt kapittel av kodingsreisen din begynne.

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION