CodeGym /Java blog /Tilfældig /Java abstrakt metode og klasser
John Squirrels
Niveau
San Francisco

Java abstrakt metode og klasser

Udgivet i gruppen
Abstrakte metoder er et kraftfuldt Java-værktøj og giver dette objektorienterede sprog endnu flere muligheder, når det kommer til polymorfi. En abstrakt Java-metode kan bruges til at skabe en grundlæggende ramme for et helt program og gøre det muligt for dig at justere efter behov.Java abstrakt metode og dig - 1

Hvad er en abstrakt metode?

En abstrakt metode er en metode, der ikke har nogen implementering. Det vil sige, at den bare har en erklæring, så du kender navnet, returtypen og de variabler, den vil acceptere. Her er et eksempel på en grundlæggende abstrakt metode:

public abstract int example(int a1, int a2);
Når du ser på denne metode, kan du se, at den returnerer et heltal, og den accepterer to heltal som argument. Hvad du ikke kan fortælle er, hvordan denne metode er implementeret. Det er fordi for at implementere det, skal du tilsidesætte det. Når du opretter en abstrakt metode i java, skal du overholde nogle få retningslinjer, ellers vil dit program ikke kompilere korrekt. Husk:
  • Java abstrakte metoder har ingen implementering. Det vil sige, at de aldrig skal efterfølges af krøllede seler og en krop, der fortæller, hvordan metoden skal bruges. Det er bare afsluttet med et semikolon.

  • Hvis du opretter en abstrakt metode, kan den kun placeres i en abstrakt klasse. Det vil sige, du kan ikke have en konkret klasse, der har en abstrakt metode inde i sig.
    jeg. Som en sidebemærkning, hvis du har en abstrakt klasse, kan den indeholde konstruktører. Det behøver dog ikke at have en abstrakt metode.

  • Når en konkret klasse udvider en abstrakt klasse, skal den også implementere alle de abstrakte metoder i den overordnede klasse, ellers kan den ikke være konkret og skal erklæres abstrakt.

De sidste to kan være lidt forvirrende, så lad os afklare det med det samme.

Udvidelse af abstrakte Java-klasser

Lad os sige, at vi vil skrive et program om grundlæggende former, der vil returnere omkreds og areal. Så vi opretter en abstrakt klasse for forældre. Men fordi hver form har sine egne regler, skal hver enkelt beregnes forskelligt, så vi skriver den abstrakte Shape- klasse sådan her:

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

abstract double area();
  		abstract double perimeter();
}
Nu, hvis vi rent faktisk vil bruge disse abstrakte metoder, er vi nødt til at udvide den abstrakte Java-overordnede klasse Shape og derefter instansiere metoderne. Så hver konkret klasse skal implementere området og omkredsen 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());
  
    } 
} 
Outputtet fra konsollen ser så således ud:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Bemærk, at klassen Quadrilateral ikke behøver at instantiere Shape(String name) -konstruktøren fra den overordnede klasse Shape . Det er fordi det ikke er en abstrakt metode. Men hvis du kun implementerede et område eller perimeter i en klasse, skulle den nye klasse være abstrakt, fordi den ikke inkluderede begge. Du kan også bruge abstrakte metoder i grænseflader.

Abstrakte Java-metoder med grænseflader

Lad os hurtigt gennemgå, hvad en grænseflade er, og hvordan den adskiller sig fra en abstrakt klasse. I en grænseflade er alle variabler, der er erklæret i en grænseflade, offentlige, statiske og endelige. Abstrakte klasser har på den anden side kun ikke-endelige variabler. Alt i en grænseflade er offentligt som standard. En abstrakt klasse kan have private, beskyttede, offentlige osv. Endelig udvider en klasse ikke en grænseflade, den implementerer den. Før JDK 8 kunne en grænseflade ikke have andet i sig end abstrakte metoder. Nu kan en grænseflade have standard og statiske metoder. På grund af dette har bedste praksis bevæget sig væk fra at bruge abstrakte metoder som udvidbare skabeloner og fokuseret på grænseflader og implementering af dem. Så hvis du skulle oprette Shape som en grænseflade og derefter implementere den som firkant, hvordan ville det se ud? Først skal du gøre op med Shape(String name) constructor. Det ville se sådan ud med kun de to abstrakte metoder:

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); 
    	  } 
}
Endelig ville det være meget det samme at bruge den nye Quadrilateral , som den implementerer Shape- grænsefladen:

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 konsoludskriften ville se sådan ud:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Hvis du gerne vil udforske mere om forskellene mellem grænseflader og abstrakte klasser, kan du finde mere information her.

Men hvorfor bruge abstrakte Java-metoder?

Der er mange grunde til, at abstrakte metoder i Java bruges, og hvorfor du bør blive fortrolig med at bruge dem. Her er tre hurtige grunde til, hvorfor du bør bruge dem, når det er passende.
  1. Undgå dobbeltarbejde – Se tilbage på vores eksempelkodning; forestil dig, at du og dit team skulle oprette klasser for andre former end et rektangel. Hvor mange forskellige måder er der, du kunne finde på at designe den klasse på? Ti? Femten? Og det er et simpelt problem. Forestil dig noget meget mere komplekst. Du og dit team kunne finde på hundrede måder. Så ville du blive stillet over for den skræmmende opgave at flette dem sammen til et sammenhængende program. Dette bringer os til vores næste punkt: definition af implementering.

  2. Abstrakte metoder i Java tillader definition af brug og implementering - Når du bruger en abstrakt klasse eller grænseflade, og ved design, abstrakte metoder, definerer du, hvordan andre mennesker vil interagere med din grænseflade. Det lader dem vide, hvilke variabler de skal bruge, og hvilke afkasttyper de kan forvente.
    Selvom de kan tilsidesætte dem og skabe konkrete klasser, der implementerer din grænseflade på unikke måder, sætter du stadig kerneanvendelsen af ​​din kode i sten. Hvis nogen vil implementere Shape, så skal de tilsidesætte eller implementere både omkreds og område.

  3. Læsbarhed og debugging - At have abstrakte metoder vil forbedre læsbarheden af ​​din kode. Når du skriver en klasse, der implementerer en grænseflade, ved du, hvad du skal kigge efter. Du ved, at enhver abstrakt metode i grænsefladen vil være i implementeringen, og det gør det nemmere at læse og spore eventuelle fejl. Abstrakte metoder er kun begyndelsen på at lære at bruge polymorfi korrekt i Java og andre objektorienterede sprog. Når du begynder at forstå og bruge dem, vil et helt nyt kapitel af din kodningsrejse begynde.

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