CodeGym /Java blogg /Slumpmässig /Java abstrakt metod och klasser
John Squirrels
Nivå
San Francisco

Java abstrakt metod och klasser

Publicerad i gruppen
Abstrakta metoder är ett kraftfullt verktyg för Java och ger detta objektorienterade språk ännu fler möjligheter när det kommer till polymorfism. En abstrakt Java-metod kan användas för att skapa ett grundläggande ramverk för ett helt program och göra det möjligt för dig att justera efter behov.Java abstrakt metod och du - 1

Vad är en abstrakt metod?

En abstrakt metod är en metod som inte har någon implementering. Det vill säga, den har bara en deklaration, så att du vet namnet, returtypen och de variabler som den kommer att acceptera. Här är ett exempel på en grundläggande abstrakt metod:

public abstract int example(int a1, int a2);
När du tittar på den här metoden kan du se att den returnerar ett heltal och att den accepterar två heltal som argument. Vad du inte kan säga är hur denna metod implementeras. Det beror på att för att implementera det måste du åsidosätta det. När du skapar en abstrakt metod i java måste du följa några riktlinjer annars kommer ditt program inte att kompilera korrekt. Kom ihåg:
  • Java abstrakta metoder har ingen implementering. Det vill säga att de aldrig ska följas av lockiga hängslen och en kropp som berättar hur metoden ska användas. Den avslutas precis med semikolon.

  • Om du skapar en abstrakt metod kan den bara läggas in i en abstrakt klass. Det vill säga, du kan inte ha en konkret klass som har en abstrakt metod inuti sig.
    i. Som en sidoanteckning, om du har en abstrakt klass, kan den innehålla konstruktorer. Det behöver dock inte ha en abstrakt metod.

  • När en konkret klass utökar en abstrakt klass måste den också implementera alla abstrakta metoder för den överordnade klassen, annars kan den inte vara konkret och måste förklaras abstrakt.

De två sista kan vara lite förvirrande, så låt oss reda ut det direkt.

Utöka abstrakta Java-klasser

Låt oss säga att vi vill skriva ett program om grundläggande former som kommer att returnera omkrets och area. Så vi skapar en abstrakt klass för föräldrar. Men eftersom varje form har sina egna regler måste var och en beräknas på olika sätt, så vi skriver den abstrakta Shape -klassen så här:

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

abstract double area();
  		abstract double perimeter();
}
Nu, om vi verkligen vill använda dessa abstrakta metoder, måste vi utöka den abstrakta Java-förälderklassen Shape och sedan instansiera metoderna. Så varje konkret klass måste implementera området och omkretsen abstrakta 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());
  
    } 
} 
Utdata från konsolen ser då ut så här:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Observera att klassen Quadrilateral inte behöver instansiera Shape(String name) -konstruktorn från den överordnade klassen Shape . Det beror på att det inte är en abstrakt metod. Men om du bara implementerade ett område eller omkrets i en klass, måste den nya klassen vara abstrakt eftersom den inte inkluderade båda. Du kan också använda abstrakta metoder i gränssnitt.

Abstrakta Java-metoder med gränssnitt

Låt oss snabbt se över vad ett gränssnitt är och hur det skiljer sig från en abstrakt klass. I ett gränssnitt är alla variabler som deklareras i ett gränssnitt offentliga, statiska och slutgiltiga. Abstrakta klasser å andra sidan har bara icke-slutliga variabler. Allt i ett gränssnitt är offentligt som standard. En abstrakt klass kan ha privat, skyddad, offentlig, etc. Slutligen, en klass utökar inte ett gränssnitt, den implementerar det. Före JDK 8 kunde ett gränssnitt inte ha något annat än abstrakta metoder. Nu kan ett gränssnitt ha standardmetoder och statiska metoder. På grund av detta har bästa praxis gått bort från att använda abstrakta metoder som utbyggbara mallar och fokuserat på gränssnitt och implementering av dem. Så om du skulle skapa Shape som ett gränssnitt och sedan implementera det som fyrsidig, hur skulle det se ut? Först måste du göra dig av med Shape(String name) -konstruktorn. Det skulle se ut så här med bara de två abstrakta metoderna:

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); 
    	  } 
}
Slutligen, att använda den nya Quadrilateral som den implementerar Shape -gränssnittet skulle vara ungefär densamma:

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());
  
    } 
}
Och konsolutskriften skulle se ut så här:

Area of rectangle is 12.0
Perimeter of rectangle is 14.0
Om du vill utforska mer om skillnaderna mellan gränssnitt och abstrakta klasser kan du hitta mer information här.

Men varför använda abstrakta Java-metoder?

Det finns många anledningar till varför abstrakta metoder i Java används och varför du bör bli bekväm med att använda dem. Här är tre snabba skäl till varför du bör använda dem när det är lämpligt.
  1. Undvik dubbelarbete – Titta tillbaka på vårt exempelkodning; föreställ dig att du och ditt team behövde skapa klasser för andra former än en rektangel. Hur många olika sätt finns det som du kan komma på för att utforma den klassen? Tio? Femton? Och det är ett enkelt problem. Föreställ dig något mycket mer komplext. Du och ditt team kan komma på hundra sätt. Då skulle du ställas inför den svåra uppgiften att väva ihop dem till ett sammanhängande program. Detta för oss till nästa punkt: att definiera genomförandet.

  2. Abstrakta metoder i Java tillåter definition av användning och implementering – När du använder en abstrakt klass eller gränssnitt, och genom design, abstrakta metoder, definierar du hur andra människor kommer att interagera med ditt gränssnitt. Det låter dem veta vilka variabler de ska använda och vilka returtyper de kan förvänta sig.
    Även om de kan åsidosätta dem och skapa konkreta klasser som implementerar ditt gränssnitt på unika sätt, sätter du fortfarande i sten kärnanvändningen för din kod. Om någon vill implementera Shape måste de åsidosätta eller implementera både omkrets och område.

  3. Läsbarhet och felsökning – Att ha abstrakta metoder kommer att förbättra läsbarheten för din kod. När du skriver en klass som implementerar ett gränssnitt vet du vad du ska leta efter. Du vet att varje abstrakt metod i gränssnittet kommer att finnas i implementeringen, och det gör det lättare att läsa och spåra eventuella buggar. Abstrakta metoder är bara början på att lära sig hur man korrekt använder polymorfism i Java och andra objektorienterade språk. När du börjar förstå och använda dem kommer ett helt nytt kapitel av din kodningsresa att börja.

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