Objektorienteret-programmeringskoncepter i Java

1. Oversigt

I denne artikel vil vi se på objektsorienteret programmering (OOP) -koncepter i Java. Vi diskuterer klasser, objekter, abstraktion, indkapsling, arv og polymorfisme.

2. Klasser

Klasser er udgangspunktet for alle objekter, og vi kan betragte dem som skabelonen til oprettelse af objekter. En klasse vil typisk indeholde medlemsfelter, medlemsmetoder og en særlig konstruktormetode.

Vi bruger konstruktøren til at oprette objekter fra klassen:

offentlig klasse bil {// medlemsfelter privat streng type; privat streng model; private String farve; privat int hastighed; // konstruktør offentlig bil (streng type, streng model, streng farve) {this.type = type; this.model = model; denne. farve = farve; } // medlemsmetoder public int increaseSpeed ​​(int increment) {this.speed = this.speed + increment; returner dette. hastighed; } // ...}

Bemærk, at en klasse kan have mere end en konstruktør. Vi kan læse mere om klasserne i vores klasseartikel.

3. Objekter

Objekter oprettes fra klasser og kaldes forekomster af klassen. Vi opretter objekter fra klasser ved hjælp af deres konstruktører:

Car veyron = ny bil ("Bugatti", "Veyron", "crimson"); Bilkorvette = ny bil ("Chevrolet", "Corvette", "sort"); 

Her har vi oprettet to forekomster af klassen Bil. Læs mere om dem i vores artikelartikel.

4. Abstraktion

Abstraktion skjuler kompleksiteten ved implementering og udsætter enklere grænseflader.

Hvis vi tænker på en typisk computer, kan man kun se den eksterne grænseflade, som er mest afgørende for at interagere med den, mens interne chips og kredsløb er skjult for brugeren.

I OOP betyder abstraktion at skjule de komplekse implementeringsoplysninger for et program og kun udsætte den nødvendige API for at bruge implementeringen. I Java opnår vi abstraktion ved hjælp af grænseflader og abstrakte klasser.

Vi kan læse mere om abstraktion i vores abstrakte klasse- og interface-artikler.

5. Indkapsling

Indkapsling skjuler tilstanden eller den interne repræsentation af et objekt fra forbrugeren af ​​en API og tilvejebringelse af offentligt tilgængelige metoder bundet til objektet for læs-skriveadgang. Dette giver mulighed for at skjule specifikke oplysninger og kontrollere adgangen til intern implementering.

For eksempel er medlemsfelter i en klasse skjult for andre klasser, og de kan tilgås ved hjælp af medlemsmetoderne. En måde at gøre dette på er at oprette alle datafelter privat og kun tilgængelig ved hjælp af offentlig medlemsmetoder:

offentlig klasse bil {// ... privat int hastighed; public int getSpeed ​​() {returfarve; } offentlig tomrum setSpeed ​​(int-hastighed) {this.speed = hastighed; } // ...}

Her, marken fart er indkapslet ved hjælp af privat adgangsmodifikator og kan kun tilgås ved hjælp af offentlig getSpeed ​​() og setSpeed ​​() metoder. Vi kan læse mere om adgangsmodifikatorer i vores artikel om adgangsmodifikatorer.

6. Arv

Arv er den mekanisme, der gør det muligt for en klasse at erhverve alle egenskaberne fra en anden klasse ved at arve klassen. Vi kalder den arvende klasse for en barneklasse og den arvede klasse som superklassen eller forældreklassen.

I Java gør vi dette ved at udvide forældreklassen. Således får barneklassen alle egenskaberne fra forældrene:

offentlig klasse bil udvider køretøj {// ...}

Når vi udvider en klasse, danner vi et IS-A-forhold. Det Bil ER EN Køretøj. Så det har alle egenskaberne ved en Køretøj.

Vi kan stille spørgsmålet, hvorfor har vi brug for arv? For at besvare dette, lad os overveje en bilproducent, der fremstiller forskellige typer køretøjer, såsom biler, busser, sporvogne og lastbiler.

For at gøre arbejdet let kan vi samle de almindelige funktioner og egenskaber for alle køretøjstyper i et modul (en klasse i tilfælde af Java). Og vi kan lade individuelle typer arve og genbruge disse egenskaber:

offentlig klasse køretøj {private int hjul; privat streng model; offentlig ugyldig start () {// processen med at starte køretøjet} offentlig ugyldig stop () {// proces for at stoppe køretøjet} offentlig ugyldig tønde () {// producerer en standard tønde}}

Køretøjstypen Bil vil nu arve fra forældrene Køretøj klasse:

offentlig klasse bil udvider køretøj {privat int nummerOfGears; public void openDoors () {// proces for at åbne dørene}}

Java understøtter enkelt arv og multilevel arv. Dette betyder, at en klasse ikke kan strække sig fra mere end en klasse direkte, men den kan bruge et hierarki:

offentlig klasse ArmoredCar udvider bil {privat boolsk bulletProofWindows; public void remoteStartCar () {// dette køretøj kan startes ved hjælp af en fjernbetjening}}

Her, den Pansret bil strækker sig Bilog Bil strækker sig Køretøj. Så, Pansret bil arver egenskaber fra begge Bil og Køretøj.

Mens vi arver fra overordnede klassen, kan en udvikler også tilsidesætte en metodeimplementering fra den overordnede. Dette er kendt som metode tilsidesat.

I vores ovenstående eksempel på Køretøj klasse, der er honk () metode. Det Bil klasse, der udvider Køretøj klasse kan tilsidesætte denne metode og implementere på den måde, den vil fremstille honk:

public class Car udvider køretøj {// ... @Override public void honk () {// producerer bilspecifikke honk}}

Bemærk, at dette også kaldes en runtime polymorfisme, som forklaret i det næste afsnit. Vi kan læse mere om arv i vores Java-arv og arv og kompositionsartikler.

7. Polymorfisme

Polymorfisme er et OOP-sprogs evne til at behandle data forskelligt afhængigt af deres typer input. I Java kan dette være det samme metodenavn med forskellige metodesignaturer og udføre forskellige funktioner:

public class TextFile udvider GenericFile {// ... public String read () {returner this.getContent () .toString (); } public String read (int limit) {return this.getContent () .toString () .substring (0, limit); } offentlig strenglæsning (int start, int stop) {returner this.getContent () .toString (). substring (start, stop); }}

I dette eksempel kan vi se, at metoden Læs() har tre forskellige former med forskellige funktionaliteter. Denne type polymorfisme er statisk eller kompileringstidspolymorfisme og kaldes også metodeoverbelastning.

Der er også runtime eller dynamisk polymorfisme, hvor barneklassen tilsidesætter forældrenes metode:

offentlig klasse GenericFile {privat strengnavn; // ... public String getFileInfo () {return "Generic File Impl"; }}

En børneklasse kan udvide GenericFile klasse og tilsidesætte getFileInfo () metode:

offentlig klasse ImageFile udvider GenericFile {privat int højde; privat int bredde; // ... getters and setters public String getFileInfo () {returner "Image File Impl"; }}

Læs mere om polymorfisme i vores polymorfisme i Java-artiklen.

8. Konklusion

I denne artikel lærte vi om de grundlæggende grundlæggende begreber OOP med Java.

Kodeprøverne i denne artikel er tilgængelige på Github.


$config[zx-auto] not found$config[zx-overlay] not found