Java >> Java tutorial >  >> Tag >> class

Abstrakt klasse i Java

I Java er en abstrakt klasse en superklasse, der ikke kan instansieres og bruges til at erklære eller specificere generelle egenskaber. En abstrakt Java-klasse er ikke anvendelig til at skabe et objekt; forsøg på at gøre det vil resultere i en kompileringsfejl. Nøgleordet abstrakt bruges til at erklære den abstrakte klasse.

Underklasser udvidet fra en abstrakt klasse arver alle den abstrakte klasses attributter og underklassespecifikke attributter. Den abstrakte klasse erklærer klassens træk og implementeringsmetoder og definerer dermed hele grænsefladen.

Underklasser af abstrakte klasser bruger dem som skabeloner. Den abstrakte klasse Tree og dens underklasse Test_Tree, for eksempel, har alle funktionerne i et træ såvel som andre, der er unikke for Test_Tree.

Det er afgørende at kende forskellen mellem en abstrakt klasse og en grænseflade. En abstrakt klasse kan have abstrakte metoder, medlemsvariabler og konkrete metoder, hvorimod en grænseflade kun har metodeerklæringer eller abstrakte metoder og konstante datamedlemmer. En klasse kan implementere mange grænseflader, men kun udvide én abstrakt klasse, fordi Java kun understøtter enkelt nedarvning.

Abstrakt klasse i Java

En abstrakt klasse har til formål at tjene som base for underklasser. En Java abstrakt klasse kan dog ikke instansieres, hvilket betyder, at du ikke kan oprette nye forekomster af den. Denne Java abstrakt klasse tutorial vil vise dig, hvordan du konstruerer abstrakte klasser i Java, og hvilke regler der gælder. I slutningen af ​​denne tekst dykker denne vejledning dybere ned i formålet med abstrakte klasser i Java.

Erklær en abstrakt klasse

I Java tilføjes det abstrakte nøgleord til klassedefinitionen for at angive, at klassen er abstrakt. Her er et eksempel på en Java abstrakt klasse:

public abstract class AbstractClassDefinition {
  
  }

At erklære en abstrakt klasse i Java er så simpelt som det. Du kan ikke længere oprette AbstractClassDefinition-instanser. Som følge heraf er Java-koden nedenfor ikke gyldig:

AbstractClassDefinition classInstance = new AbstractClassDefinition();

Ethvert forsøg på at kompilere koden ovenfor vil generere en fejlmeddelelse, der hævder, at AbstractClassDefinition er en abstrakt klasse, og du kan ikke instansiere den.

Abstrakt type metoder

Abstrakte metoder findes i abstrakte klasser. Du kan gøre en metode abstrakt ved at placere det abstrakte nøgleord foran metodedefinitionen. Her er et eksempel på en abstrakt Java-metode:

public abstract class AbstractClassDefinition {
  
public abstract void newAbstractMethod();

}

Der er ingen implementering for en abstrakt metode. Den indeholder en metodesignatur på samme måde, som metoder i en Java-grænseflade fungerer.

Hvis en klasse har en abstrakt metode, skal den erklæres abstrakt som en helhed. En abstrakt klasse behøver ikke at have alle sine metoder som abstrakte metoder. Der kan være en blanding af abstrakte og ikke-abstrakte metoder i en abstrakt klasse.

Alle abstrakte metoder i en abstrakt superklasse skal implementeres (tilsidesættes) af underklasser. Superklassens ikke-abstrakte metoder er nedarvet i deres nuværende tilstand. Om nødvendigt tilsidesættes de. Et eksempel på en underklasse af den abstrakte klasse AbstractClassDefinition er som følger:

public class AbstractSubClass extends AbstractClassDefinition {
  
public void abstractMethod() {
    System.out.println("implementation of abstract method ");
}

}

Bemærk hvordan AbstractSubClass skal implementere den abstrakte metode abstractMethod() fra AbstractClassDefinition, som er en abstrakt superklasse. Kun når en underklasse af en abstrakt klasse også er en abstrakt klasse, er det ikke nødvendigt at implementere alle dens superklasses abstrakte metoder.

Abstrakte klasser:Hvad er de gode til?

Abstrakte klasser er beregnet til at fungere som grundlæggende klasser, som underklasser kan forbedre for at give en komplet implementering. Overvej følgende scenarie:En given proces kræver tre trin:

  • Det første skridt, før du tager handling.
  • Handlingen, der finder sted.
  • Handlingens opfølgningstrin.

Når trin før og efter 'handlingen' altid er de samme, bruges denne Java-kode til at implementere 3-trins processen i en abstrakt superklasse:

public abstract class AbstractProcessDefinition {
  
public void process() {
    actionStepBefore();
    realAction();
    actionStepAfter();
}

public void actionStepBefore() {
    //implementation directly in abstract superclass
}

public abstract void realAction(); // implemented by subclasses

public void actionStepAfter() {
    //implementation directly in abstract superclass
}

}

Læg mærke til, hvor abstrakt realAction()-metoden er. AbstractProcessDefinition-underklasser kan nu udvide AbstractProcessDefinition ved blot at tilsidesætte realAction()-funktionen. Når underklassens process()-funktion aktiveres, køres hele processen, inklusive den abstrakte superklasses actionStepBefore()- og actionStepAfter()-metoder, samt underklassens realAction()-metode.

AbstractProcessDefinition behøver ikke nødvendigvis at være en abstrakt klasse for at fungere som en basisklasse. RealAction()-metoden behøvede heller ikke at være abstrakt. Du har måske bare brugt en almindelig klasse i stedet for. Ved at gøre metoden til at implementere abstrakt, og dermed klassen, signalerer du til brugere af denne klasse, at de ikke skal bruge den i dens nuværende tilstand. I stedet skal den bruges som en grundklasse for underklasser, med den abstrakte funktion implementeret i underklassen.

RealAction()-metoden i det foregående eksempel har ingen standardimplementering. Under nogle omstændigheder kan din superklasses metode, som underklasser forventes at tilsidesætte, have en standardimplementering. Du kan ikke gøre metoden abstrakt i et sådant tilfælde. Selvom superklassen ikke har abstrakte metoder, kan du stadig gøre den abstrakt.

Her er et mere detaljeret eksempel, der åbner en URL, behandler den og lukker URL-forbindelsen.

public abstract class URLProcessorDefinition {

public void processINFO(URL url) throws IOException {
    URLConnection urlConn = url.openConnection();
    InputStream inStream = urlConn.getInputStream();

    try{
        URLDataProcessing(input);
    } finally {
        inStream.close();
    }
}

protected abstract void URLDataProcessing(InputStream inStream)
    throws IOException;
  
}

URLDataProcessing() er en abstrakt metode, og URLProcessorDefinition er en abstrakt klasse, som du kan se. Fordi URLDataProcessing() er en abstrakt funktion, skal underklasser af URLProcessorDefinition implementere den.

Underklasser af URLProcessorDefinition abstrakt-klassen kan behandle data opnået fra URL'er uden at bekymre dig om URL'ens netværksforbindelse åbnes og lukkes. URLProcessorDefinition er ansvarlig for dette. Kun data fra InputStream givet til URLDataProcessing()-funktionen skal behandles af underklasser. Det forenkler oprettelsen af ​​klasser, der behandler data fra URL'er. Følgende er et eksempel på en underklasse:

public class URLProcessorImplementation extends URLProcessorDefinition {

@Override
protected void URLDataProcessing(InputStream inStream) throws IOException {
    int int_data = inStream.read();
    while(int_data != -1){
        System.out.println((char) int_data);
        int_data = inStream.read();
    }
}

}

Det er værd at bemærke, at underklassen implementerer URLDataProcessing() metoden. På bagsiden er URLProcessorDefinition superklassen ansvarlig for resten af ​​koden. Et eksempel på, hvordan man bruger URLProcessorImplementation-klassen er som følger:

URLProcessorImplementation urlProcessor = new URLProcessorImplementation();
urlProcessor.process(new URL("https://www.codeunderscored.com/"));

URLProcessorDefinition superklassen implementerer processINFO() funktionen, som kaldes. Denne funktion kalder derefter URLProcessorImpl-klassens URLDataProcessing()-metode.

Skabelonmetodens designmønster med abstrakte klasser

URLProcessorDefinition-klassen demonstrerer skabelonmetodens designmønster i det foregående eksempel. Når underklasser udvider Template Method-basisklassen, implementerer Template Method-designmønsteret delvist en proces, som underklasser kan fuldføre.

Konklusion

En abstrakt klasse er en klasse, der er erklæret med nøgleordet "abstrakt". Det kan have abstrakte og konkrete metoder uden krop og standardmetoder med kroppen. Abstrakte metoder er ikke tilladt i ikke-abstrakte klasser. Medmindre en anden klasse udvider den, er en abstrakt klasse ubrugelig. I denne øvelse har du opdaget, hvad en abstrakt klasse er, hvorfor vi bruger den, og hvilke retningslinjer vi skal følge, når vi arbejder med den i Java.

Erklæringen af ​​en abstrakt metode nødvendiggør erklæringen af ​​en klasse som abstrakt. Det er ikke altid sandt i den anden retning:en klasse kan betegnes som abstrakt, selvom den ikke har nogen abstrakte metoder. Det kan også have en ikke-abstrakt (konkret) metode. Derudover kan du ikke have abstrakte metoder i en konkret klasse.


Java tag