Koncepti objektno-orijentiranog programiranja na Javi
1. Pregled
U ovom ćemo članku razmotriti koncepte objektno orijentiranog programiranja (OOP) u Javi. Raspravit ćemo klase, objekti, apstrakcija, inkapsulacija, nasljeđivanje i polimorfizam.
2. Nastava
Razredi su početna točka svih objekata i možemo ih smatrati predloškom za stvaranje objekata. Klasa bi obično sadržavala polja člana, metode člana i posebnu metodu konstruktora.
Konstruktor ćemo koristiti za stvaranje objekata klase:
javna klasa Car {// polja člana private String type; model privatnog niza; privatna boja niza; privatna int brzina; // konstruktor javni automobil (vrsta niza, model niza, boja niza) {this.type = type; this.model = model; this.color = boja; } // metode člana public int povećavanje brzine (prirast int) {this.speed = this.speed + prirast; vrati ovo.brzina; } // ...}
Imajte na umu da klasa može imati više konstruktora. Više o nastavi možemo pročitati u našem članku o nastavi.
3. Predmeti
Objekti se stvaraju iz klasa i nazivaju se primjerci klase. Stvaramo objekte iz klasa koristeći njihove konstruktore:
Auto veyron = novi automobil ("Bugatti", "Veyron", "grimizni"); Korveta automobila = novi automobil ("Chevrolet", "Corvette", "crna");
Ovdje smo stvorili dvije instance klase Automobil. Pročitajte više o njima u članku o našim objektima.
4. Apstrakcija
Apstrakcija skriva složenost implementacije i izlaže jednostavnija sučelja.
Ako razmišljamo o tipičnom računalu, može se vidjeti samo vanjsko sučelje, što je najvažnije za interakciju s njim, dok su interni čipovi i sklopovi skriveni od korisnika.
U OOP-u apstrakcija znači skrivanje složenih detalja implementacije programa, izlažući samo API potreban za upotrebu implementacije. U Javi apstrakciju postižemo korištenjem sučelja i apstraktnih klasa.
Više o apstrakciji možemo pročitati u našim člancima o apstraktnoj klasi i sučelju.
5. Kapsulacija
Inkapsulacija skriva stanje ili unutarnji prikaz objekta od potrošača API-ja i pružanje javno dostupnih metoda vezanih uz objekt za pristup čitanju i pisanju. To omogućuje skrivanje određenih podataka i kontrolu pristupa internoj implementaciji.
Na primjer, polja člana u klasi skrivena su od ostalih klasa i može im se pristupiti pomoću metoda člana. Jedan od načina za to je izrada svih podatkovnih polja privatni i dostupno samo pomoću javnost metode člana:
javni razred automobila {// ... private int speed; public int getSpeed () {return boja; } javna praznina setSpeed (int brzina) {this.speed = brzina; } // ...}
Evo, polje ubrzati je enkapsuliran pomoću privatni modifikator pristupa i može mu se pristupiti samo pomoću javni getSpeed () i setSpeed () metode. Više o modifikatorima pristupa možemo pročitati u našem članku o modifikatorima pristupa.
6. Nasljeđivanje
Nasljeđivanje je mehanizam koji omogućuje jednoj klasi stjecanje svih svojstava iz druge klase nasljeđivanjem klase. Klasu nasljeđivanja nazivamo podređenom, a naslijeđenu klasu kao superklasu ili roditeljsku klasu.
U Javi to činimo proširujući roditeljsku klasu. Dakle, podređena klasa dobiva sva svojstva od roditelja:
javni razred automobila proširuje vozilo {// ...}
Kada proširimo nastavu, formiramo odnos IS-A. The Automobil JE Vozilo. Dakle, ima sve karakteristike a Vozilo.
Možemo postaviti pitanje, zašto nam treba nasljedstvo? Da bismo na to odgovorili, razmotrimo proizvođača vozila koji proizvodi različite vrste vozila, poput automobila, autobusa, tramvaja i kamiona.
Da bismo olakšali posao, zajedničke značajke i svojstva svih tipova vozila možemo povezati u modul (klasa u slučaju Jave). A možemo dopustiti da pojedine vrste nasljeđuju i ponovno koriste ta svojstva:
vozilo javne klase {privatni int kotači; model privatnog niza; javni void start () {// postupak pokretanja vozila} public void stop () {// postupak zaustavljanja vozila} public void honk () {// proizvodi zadanu trubu}}
Tip vozila Automobil sada će naslijediti od roditelja Vozilo razred:
javni razred automobila proširuje vozilo {private int numberOfGears; public void openDoors () {// postupak otvaranja vrata}}
Java podržava nasljeđivanje s jednim i više razina. To znači da se klasa ne može izravno proširiti iz više klasa, ali može koristiti hijerarhiju:
javna klasa ArmoredCar proširuje Car {private boolean bulletProofWindows; public void remoteStartCar () {// ovo se vozilo može pokrenuti pomoću daljinskog upravljača}}
Evo, ArmouredCar proteže se Automobil, i Automobil proteže se Vozilo. Tako, ArmouredCar nasljeđuje svojstva od oboje Automobil i Vozilo.
Iako nasljeđujemo iz roditeljske klase, programer također može nadjačati implementaciju metode od roditelja. To je poznato kao nadjačavanje metode.
U našem gornjem primjeru Vozilo razreda, postoji gakati() metoda. The Automobil razred koji produžuje Vozilo klasa može nadjačati ovu metodu i implementirati na način na koji želi proizvesti trub:
javni razred automobila proširuje vozilo {// ... @Preuzmi javnu praznu trubu () {// proizvodi trubu specifičnu za automobil}}
Imajte na umu da se ovo također naziva runtime polimorfizmom, kako je objašnjeno u sljedećem odjeljku. Više o nasljeđivanju možemo pročitati u našim člancima o nasljeđivanju i nasljeđivanju i sastavu Java.
7. Polimorfizam
Polimorfizam je sposobnost OOP jezika da različito obrađuje podatke ovisno o njihovim vrstama ulaza. U Javi to može biti isto ime metode s različitim potpisima metode i izvođenjem različitih funkcija:
javna klasa TextFile proširuje 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); }}
U ovom primjeru možemo vidjeti da je metoda čitati() ima tri različita oblika s različitim funkcionalnostima. Ova vrsta polimorfizma je statički polimorfizam ili vrijeme kompajliranja, a naziva se i preopterećenjem metode.
Tu je i vrijeme izvođenja ili dinamički polimorfizam, gdje podređena klasa nadjačava roditeljsku metodu:
javna klasa GenericFile {naziv privatnog niza; // ... public String getFileInfo () {return "Generička datoteka Impl"; }}
Dijete klasa može produžiti GenericFile klase i nadjačati getFileInfo () metoda:
javna klasa ImageFile proširuje GenericFile {private int height; privatna int širina; // ... getteri i postavljači public String getFileInfo () {return "Impl slikovne datoteke"; }}
Pročitajte više o polimorfizmu u našem članku o polimorfizmu na Javi.
8. Zaključak
U ovom smo članku saznali o osnovnim temeljnim konceptima OOP-a s Javom.
Uzorci koda u ovom članku dostupni su na Githubu.