Objektorientert-programmeringskonsepter i Java

1. Oversikt

I denne artikkelen vil vi se på objektorientert programmering (OOP) -konsepter i Java. Vi diskuterer klasser, objekter, abstraksjon, innkapsling, arv og polymorfisme.

2. Klasser

Klasser er utgangspunktet for alle objekter, og vi kan betrakte dem som malen for å lage objekter. En klasse vil vanligvis inneholde medlemsfelt, medlemsmetoder og en spesiell konstruktormetode.

Vi bruker konstruktøren til å lage objekter fra klassen:

offentlig klasse Bil {// medlemsfelt privat streng type; privat streng modell; private String farge; privat int hastighet; // constructor public Car (String type, String model, String color) {this.type = type; this.model = modell; denne. farge = farge; } // medlemsmetoder offentlig int økeSpeed ​​(int inkrement) {this.speed = this.speed + increment; returner dette. hastighet; } // ...}

Merk at en klasse kan ha mer enn en konstruktør. Vi kan lese mer om klassene i kursartikkelen vår.

3. Objekter

Objekter opprettes fra klasser og kalles forekomster av klassen. Vi lager objekter fra klasser ved hjelp av deres konstruktører:

Car veyron = ny bil ("Bugatti", "Veyron", "crimson"); Bilkorvett = ny bil ("Chevrolet", "Corvette", "svart"); 

Her har vi opprettet to forekomster av klassen Bil. Les mer om dem i vår artikkel.

4. Abstraksjon

Abstraksjon gjemmer kompleksitet ved implementering og avslører enklere grensesnitt.

Hvis vi tenker på en typisk datamaskin, kan man bare se det eksterne grensesnittet, som er viktigst for å samhandle med den, mens interne sjetonger og kretser er skjult for brukeren.

I OOP betyr abstraksjon å skjule de komplekse implementeringsdetaljene til et program, og kun avsløre API-en som kreves for å bruke implementeringen. I Java oppnår vi abstraksjon ved å bruke grensesnitt og abstrakte klasser.

Vi kan lese mer om abstraksjon i våre abstrakte klasse- og grensesnittartikler.

5. Innkapsling

Innkapsling skjuler tilstanden eller den interne representasjonen av et objekt fra forbrukeren av et API og å tilby offentlig tilgjengelige metoder bundet til objektet for lese- og skrivetilgang. Dette gjør det mulig å skjule spesifikk informasjon og kontrollere tilgangen til intern implementering.

For eksempel er medlemsfelt i en klasse skjult fra andre klasser, og de kan nås ved hjelp av medlemsmetodene. En måte å gjøre dette på er å lage alle datafeltene privat og bare tilgjengelig ved hjelp av offentlig medlemsmetoder:

offentlig klasse bil {// ... privat int hastighet; offentlig int getSpeed ​​() {retur farge; } public void setSpeed ​​(int speed) {this.speed = speed; } // ...}

Her, feltet hastighet er innkapslet ved hjelp av privat tilgangsmodifikator, og kan bare nås ved hjelp av offentlig getSpeed ​​() og setSpeed ​​() metoder. Vi kan lese mer om tilgangsmodifikatorer i artikkelen vår om tilgangsmodifikatorer.

6. Arv

Arv er mekanismen som gjør at en klasse kan tilegne seg alle egenskapene fra en annen klasse ved å arve klassen. Vi kaller arveklassen en barneklasse og den arvede klassen som superklasse eller foreldreklasse.

I Java gjør vi dette ved å utvide foreldreklassen. Dermed får barneklassen alle egenskapene fra foreldrene:

offentlig klasse Bil utvider kjøretøy {// ...}

Når vi utvider en klasse, danner vi et IS-A-forhold. De Bil ER EN Kjøretøy. Så den har alle egenskapene til en Kjøretøy.

Vi kan stille spørsmålet, hvorfor trenger vi arv? For å svare på dette, la oss vurdere en bilprodusent som produserer forskjellige typer kjøretøy, for eksempel biler, busser, trikker og lastebiler.

For å gjøre arbeidet enkelt kan vi samle de vanlige funksjonene og egenskapene til alle kjøretøystyper til en modul (en klasse i tilfelle Java). Og vi kan la individuelle typer arve og gjenbruke disse egenskapene:

offentlig klasse Kjøretøy {private int hjul; privat streng modell; public void start () {// prosessen med å starte kjøretøyet} public void stop () {// prosess for å stoppe kjøretøyet} public void honk () {// produserer en standard honk}}

Kjøretøystypen Bil vil nå arve fra foreldrene Kjøretøy klasse:

offentlig klasse Bil utvider Vehicle {private int numberOfGears; public void openDoors () {// prosess for å åpne dørene}}

Java støtter enkeltarv og arv med flere nivåer. Dette betyr at en klasse ikke kan strekke seg fra mer enn en klasse direkte, men den kan bruke et hierarki:

offentlig klasse ArmoredCar utvider Car {private boolean bulletProofWindows; public void remoteStartCar () {// dette kjøretøyet kan startes ved hjelp av en fjernkontroll}}

Her, den Pansret bil strekker Bil, og Bil strekker Kjøretøy. Så, Pansret bil arver eiendommer fra begge Bil og Kjøretøy.

Mens vi arver fra foreldreklassen, kan en utvikler også overstyre en metodeimplementering fra foreldrene. Dette er kjent som metodeoverstyring.

I vårt ovennevnte eksempel på Kjøretøy klasse, er det tute () metode. De Bil klasse utvide Kjøretøy klasse kan overstyre denne metoden og implementere på den måten den ønsker å produsere honk:

public class Car utvider kjøretøy {// ... @Override public void honk () {// produserer bilspesifikk honk}}

Merk at dette også kalles en runtime polymorfisme, som forklart i neste avsnitt. Vi kan lese mer om arv i våre artikler om Java-arv og arv og komposisjon.

7. Polymorfisme

Polymorfisme er et OOP-språks evne til å behandle data forskjellig avhengig av deres inngangstyper. I Java kan dette være det samme metodenavnet som har forskjellige metodesignaturer og utfører forskjellige funksjoner:

public class TextFile utvider GenericFile {// ... public String read () {return this.getContent () .toString (); } public String read (int limit) {return this.getContent () .toString () .substring (0, limit); } public String read (int start, int stop) {return this.getContent () .toString () .substring (start, stop); }}

I dette eksemplet kan vi se at metoden lese() har tre forskjellige former med forskjellige funksjoner. Denne typen polymorfisme er statisk eller kompileringstidspolymorfisme og kalles også metodeoverbelastning.

Det er også kjøretid eller dynamisk polymorfisme, der barneklassen overstyrer foreldrenes metode:

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

En barneklasse kan utvide GenericFile klasse og overstyre getFileInfo () metode:

offentlig klasse ImageFile utvider GenericFile {private int høyde; privat int bredde; // ... getters and setters public String getFileInfo () {return "Image File Impl"; }}

Les mer om polymorfisme i vår polymorfisme i Java-artikkelen.

8. Konklusjon

I denne artikkelen lærte vi om de grunnleggende grunnleggende begrepene OOP med Java.

Kodeeksemplene i denne artikkelen er tilgjengelig på Github.


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