what is abstraction java learn with examples
Acest tutorial explică ce este Abstracția în Java împreună cu exemple de programare. De asemenea, veți învăța ce este o clasă abstractă și de ce este utilizată:
În această serie JAVA, vom discuta despre caracteristicile importante ale programării orientate pe obiecte (OOP), care sunt, de asemenea, cunoscute sub numele de patru piloni, adică Abstracție, încapsulare, moștenire și polimorfism.
Primul pilon al POO este „Abstracție”. „Abstracția este procesul de selectare a datelor pentru a afișa doar informațiile relevante utilizatorului.”
=> Consultați aici Ghidul pentru începători Java.
Ce veți învăța:
cum găsesc cheia de securitate a rețelei
- Abstracție în POO
- Ce este abstractizarea în Java
- Diferența dintre abstractizare și încapsulare
- Concluzie
Abstracție în POO
În termeni simpli, abstractizarea „afișează” numai atributele relevante ale obiectelor și „ascunde” detaliile inutile.
De exemplu, atunci când conducem o mașină, ne preocupă doar conducerea mașinii, cum ar fi pornirea / oprirea mașinii, accelerarea / spargerea etc. Nu ne preocupă modul în care funcționează intern mecanismul de pornire / oprire efectiv sau procesul de accelerare / frânare. Pur și simplu nu ne interesează aceste detalii.
Ceea ce ne preocupă este viziunea „abstractă” a acestor operațiuni care ne va ajuta să propulsăm mașina înainte și să ajungem la destinație. Acesta este un exemplu simplu de abstractizare.
Astfel, mașina are toate mecanismele și procesele la locul său, dar din perspectiva utilizatorului final, adică din perspectiva conducătorului auto, el / ea va fi interesat doar de viziunea abstractă a acestor procese.
Abstracția reduce eforturile de programare și, prin urmare, complexitatea. Un utilizator final care folosește aplicația nu trebuie să fie preocupat de modul în care este implementată o anumită caracteristică. El / ea poate folosi doar funcțiile după cum este necesar.
Astfel, în abstractizare, ne ocupăm de idei și nu de evenimente. Aceasta înseamnă că ascundem detaliile de implementare de la utilizator și expunem doar funcționalitatea utilizatorului final. Astfel, utilizatorul va ști doar „ce face” decât „cum o face”.
Abstracția în POO poate fi de două tipuri.
# 1) Abstracția datelor
În abstractizarea datelor, creăm mai ales tipuri de date complexe și ascundem implementarea acestora. Expunem operațiunile de manipulare a acestor tipuri de date doar fără a intra în detaliile implementării lor.
Un avantaj al acestei abordări este că putem schimba implementarea oricând fără a schimba comportamentul care este expus utilizatorului.
# 2) Controlați abstractizarea
Abstracția de control colectează toate instrucțiunile de control care fac parte din aplicație și le expune ca unitate. Această caracteristică este utilizată atunci când trebuie să realizăm o funcție de lucru folosind această unitate de control.
Abstracția de control formează unitatea principală a programării structurate și folosind abstracția de control putem defini funcții simple cadrelor complexe.
Ce este abstractizarea în Java
Deoarece Java este un limbaj OOP, abstractizarea poate fi văzută ca una dintre caracteristicile și elementele importante ale limbajului Java. În Java, abstractizarea este implementată folosind o clasă și o interfață abstracte.
Deci, cum implementăm abstractizarea în Java? Java oferă un „abstract” modificator fără acces pentru implementarea abstractizării. Acest modificator abstract poate fi utilizat cu clase și metode, dar nu cu variabile.
Interfața oferă abstracție completă, adică oferă doar prototipuri de metodă și nu implementarea lor. O clasă abstractă oferă abstractizare parțială în care cel puțin o metodă nu ar trebui implementată.
În acest tutorial, vom discuta în detaliu despre abstractizare cu clase abstracte. Vom explora în detaliu interfețele în tutorialele noastre ulterioare.
Exemplu de abstractizare Java
Să luăm în considerare exemplul de mai jos.
//abstract class abstract class Car{ abstract void accelerate(); } //concrete class class Suzuki extends Car{ void accelerate(){ System.out.println('Suzuki::accelerate'); } } class Main{ public static void main(String args()){ Car obj = new Suzuki(); //Car object =>contents of Suzuki obj.accelerate(); //call the method } }
Ieșire:
Exemplul simplu de abstractizare dat mai sus are o clasă Car. În această clasă Car, avem o metodă abstractă de accelerare (). Apoi moștenim această clasă în clasa Suzuki. În cadrul clasei Suzuki, implementăm metoda accelerării.
Exemplul de mai sus arată pur și simplu modul în care o clasă abstractă este definită, moștenită și apoi utilizată în program.
Ce este clasa Java Abstract
Am menționat deja că Java implementează abstractizarea folosind clase și interfețe abstracte. Să explorăm mai întâi totul despre clasa abstractă.
O clasă abstractă poate fi definită ca o clasă declarată cu cuvântul cheie „abstract” și are o restricție că nu poate fi instanțiată.
O clasă abstractă poate avea sau nu orice metodă abstractă (o metodă fără implementare). În ceea ce privește JVM, o clasă abstractă este o clasă incompletă care nu are un comportament complet.
Sintaxa generală a unei clase abstracte este dată mai jos:
abstract class { public abstract void abstractMethod(); public void normalMethod() { //method body } }
Așa cum se arată în sintaxa clasei abstracte de mai sus, putem avea metode abstracte și non-abstracte într-o clasă abstractă. Cuvântul cheie „abstract” precede declarația clasei.
Pe scurt, o clasă abstractă poate fi descrisă după cum se arată mai jos.
Metoda abstractă în Java
O metodă abstractă este o metodă precedată de un cuvânt cheie „abstract” fără nicio implementare. O metodă abstractă este declarată în interiorul unei clase abstracte.
O metodă abstractă este cea care face o clasă incompletă, deoarece nu are o implementare. Prin urmare, atunci când includem o metodă abstractă în clasă, în mod natural, clasa devine incompletă.
Putem folosi metoda abstractă implementând-o într-o subclasă, adică o clasă moștenește clasa abstractă și apoi implementează sau furnizează codul pentru toate metodele abstracte declarate în clasa abstractă prin suprascrierea acestora.
Astfel, devine obligatoriu să suprascrieți metoda abstractă din subclasă. Dacă metoda abstractă nu este implementată și în subclasă, atunci trebuie să declarăm subclasa și ca „abstract”.
Declarația generală a metodei abstracte este:
abstract nul methodName (parametru_list);
În timp ce scriem metoda abstractă, trebuie să ne amintim următoarele reguli:
- O clasă care conține una sau mai multe metode abstracte este o clasă abstractă.
- Anumite alte cuvinte cheie nu trebuie utilizate împreună cu cuvântul cheie abstract.
Astfel, următoarele combinații sunt ilegale în Java.
- final
- nativ abstract
- static abstract
- privat abstract
- abstract sincronizat
- abstract strictfp
Să implementăm un exemplu de clasă abstractă și metodă abstractă.
//abstract class abstract class Bank{ abstract int getInterestRate(); } //concrete class class Citi extends Bank{ int getInterestRate(){return 7;} } //concrete class class HSBC extends Bank{ int getInterestRate(){return 6;} } class Main{ public static void main(String args()){ Bank b; b = new Citi (); // concrete class object System.out.println('Citi Rate of Interest is: '+b.getInterestRate()+'%'); b = new HSBC (); // concrete class object System.out.println('HSBC Rate of Interest is: '+b.getInterestRate()+'%'); } }
Ieșire:
În exemplul de mai sus, avem o clasă Bank. În această clasă, avem o metodă abstractă, getInterestRate (). Apoi declarăm două clase - ICICI și BOI care moștenesc de la clasa Bank. Ambele clase implementează metoda getInterestRate () prin returnarea ratelor dobânzii respective.
Apoi, în metoda principală, creăm un obiect bancar. În primul rând, obiectul bancar conține un obiect din clasa ICICI și afișează rata dobânzii. Apoi, obiectul BOI este creat și afișează rata dobânzii.
Astfel, putem presupune că clasa Bank este un fel de schiță sau structură care ne permite să obținem o rată a dobânzii. Din această structură, putem crea câte clase concrete dorim și apoi putem obține ratele dobânzii respective pentru fiecare obiect bancar (acest lucru este prezentat în metoda principală).
La ce folosește o clasă abstractă în Java
De ce folosim o clasă abstractă atunci când în realitate nu are nicio implementare proprie?
Împreună cu răspunsul la întrebarea de mai sus, vom ilustra și modul de utilizare a unei clase abstracte în exemplul care urmează.
Să luăm în considerare un exemplu de vehicule. Știm că vehiculele pot fi de multe tipuri. Putem avea mașini, scutere, biciclete, mopede, autobuze etc. Deși există multe tipuri de vehicule, acestea au unele proprietăți sau atribute care sunt comune tuturor vehiculelor, indiferent de tipurile lor.
tipuri de defecte în testarea software-ului
De exemplu, fiecare vehicul are un model, numărul șasiului, culoarea etc. Fiecare dintre ele are funcții precum pornire, oprire, accelerare, frânare etc. Acum fiecare vehicul va avea proprietățile și metodele de mai sus, care sunt comune și celorlalte. În același timp cu utilizatorul vehiculului, este posibil să nu ne intereseze unele aspecte.
De exemplu, dacă o persoană conduce o mașină, ceea ce îi va interesa este doar să pornească și să oprească vehiculul sau să accelereze sau să frâneze vehiculul. El / ea nu va fi interesat să știe cum pornește sau oprește vehiculul. Ne interesează doar funcționarea abstractă a funcțiilor și nu detaliile acestora.
Acum, dacă dorim să reprezentăm exemplul de sistem de mai sus într-o aplicație software, atunci cum îl proiectăm? În primul rând, vom implementa o anumită abstracție. Acum, știm că unele funcții sunt comune, dar în funcție de fiecare model, implementarea acestor funcții va fi diferită.
Pentru început, declarăm clasa abstractă „Vehicul”.
Am arătat acest sistem mai jos:
Deci vom avea o clasă abstractă Vehicul și va exista o clasă concretă care să reprezinte fiecare model al vehiculului. În scop ilustrativ, am folosit doar trei modele, adică mașină, bicicletă și scuter.
Dat mai jos este ierarhia de clase din sistemul de mai sus.
abstract class Vehicle{ abstract void start () ; abstract void stop (); abstract void accelerate (); abstract void brake (); } class Car extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Bike extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} } class Scooter extends Vehicle{ void start () { //code here…} void stop () { //code here…} void accelerate () { //code here…} void brake () { //code here…} }
Deci, vom avea o clasă de vehicule abstract și trei clase de mașină, bicicletă și scuter. Fiecare dintre aceste clase va extinde clasa Vehicul și va suprascrie fiecare dintre metodele abstracte.
Astfel, în general, ori de câte ori trebuie să reprezentăm un astfel de sistem care are metode sau operații comune de reprezentat, apoi pentru a prezenta utilizatorului doar perspectiva exterioară, ne îndreptăm spre abstractizare. Ca rezultat, scoatem metodele comune și le reprezentăm ca metode abstracte și colectăm aceste metode abstracte într-o clasă abstractă comună.
Odată ce avem conturul unui sistem reprezentat ca o clasă abstractă și operațiile ca metode abstracte, putem obține apoi orice număr de clase din clasa abstractă dată și putem suprascrie metodele abstracte pentru a implementa aceste operații pentru fiecare clasă.
Astfel devine utilă proiectarea unui sistem.
Clasa și interfața abstractă
Am văzut clasa abstractă de mai sus. Interfețele sunt încă alte elemente de bază care implementează abstractizarea. Interfețele sunt contracte, iar clasele care implementează interfața trebuie să onoreze aceste contracte.
Contractele în interfețe nu sunt altceva decât metode care nu sunt implementate. În interiorul interfețelor, vom avea doar prototipuri de metodă. Nu va exista o singură implementare a metodelor în interiorul interfețelor.
Dacă avem o declarație de interfață după cum urmează:
public interface interfaceA{ void myInterfaceMethod (); }
Apoi, orice clasă care implementează interfața A trebuie să suprascrie „myInterfaceMethod”.
Dacă deloc nu anulăm metoda într-o clasă, atunci acea clasă este reprezentată ca abstractă.
abstract class TestClass implements interfaceA{ // not a compulsion to override myInterfaceMethod. }
Vom avea un tutorial separat pe interfață mai târziu.
În continuare, să discutăm câteva dintre diferențele dintre clasele abstracte și interfețele din Java.
Diferența dintre clasa abstractă și interfață
Clasa abstractă | Interfață |
---|---|
O clasă abstractă poate avea membri de date private sau protejate, în afară de membrii publici. | Membrii interfeței sunt publici în mod implicit. |
O clasă abstractă poate avea metode abstracte și / sau non-abstracte. | O interfață poate avea doar metode abstracte. |
Rezumatul poate conține sau nu variabilele finale. | Interfețele pot finaliza variabilele ca variabile implicite. |
O clasă abstractă poate avea variabile finale, statice sau nestatice sau non-finale. | Interfețele pot avea doar variabile finale și statice. |
O clasă abstractă poate furniza implementarea interfeței. | Interfețele nu pot implementa o clasă abstractă. |
O clasă abstractă este moștenită folosind cuvântul cheie „extends”. | Interfața este implementată utilizând cuvântul cheie „implementează”. |
O clasă abstractă poate extinde alte clase sau poate implementa mai multe interfețe. | Interfața poate implementa doar o altă interfață. |
Când se folosește clasa abstractă și interfața în Java
Decizia cu privire la momentul utilizării clasei abstracte și la momentul utilizării interfețelor în aplicația Java ar trebui luată inteligent după înțelegerea temeinică a problemei la îndemână. Există două aspecte pe care trebuie să le luăm în considerare, așa cum se arată mai jos.
Clase abstracte cu comportament parțial
Știm că clasele abstracte ar putea să nu fie complet implementate mai puțin. Pot avea un comportament parțial. Pe de altă parte, interfețele nu au nicio implementare. Deci, atunci când trebuie să alegem între o clasă abstractă și o implementare, atunci trebuie să luăm în considerare acest aspect al aplicației noastre.
Aceasta înseamnă că trebuie să decidem mai întâi dacă aplicația pe care o proiectăm are o implementare parțială comună pe care o putem separa într-o clasă abstractă.
De exemplu, considerați că proiectăm o aplicație web. Pentru aceasta, va trebui să folosim o anumită tehnologie web, cum ar fi Servlet, REST API, etc. Fiecare dintre aceste tehnologii web are câteva tehnici sau pași care urmează să fie implementați, indiferent de aplicația pe care o dezvoltăm. Apoi ne construim aplicația personalizată.
Deci, în acest caz, codul definit pe care tehnologia web trebuie să îl execute poate fi pus într-o clasă abstractă. Putem avea o interfață pentru asta? Nu. Acest lucru se datorează faptului că interfața nu poate avea o implementare.
Interfețe numai cu contract
Știm că interfețele au contracte sau metode care fac parte din aceasta. Aceste metode sunt doar prototipuri. Trebuie să implementăm aceste interfețe într-o clasă și apoi să înlocuim metodele.
cele mai bune descărcări de muzică mp3 pentru Android
Acum luați în considerare interfața Harta Java Collections Framework. Multe clase precum HashMap, TreeMap și HashTable etc. implementează această interfață. Fiecare dintre aceste clase are o implementare diferită. Nu au nici un comportament comun care poate fi reprezentat în clasa abstractă.
Deci, ceea ce facem este să proiectăm o interfață cu prototipuri de metodă și apoi să implementăm fiecare dintre clase.
În acest fel, ar trebui să cântărim fiecare factor în mod corespunzător înainte de a alege între o clasă abstractă și o interfață.
Diferența dintre abstractizare și încapsulare
Să discutăm câteva dintre diferențele dintre abstractizare și o caracteristică mai importantă a POO, adică încapsularea.
Abstracție | Incapsularea |
---|---|
Proces de obținere și abstractizare a informațiilor | Procesul de legare a informațiilor. |
Tehnica de abstractizare este la nivel de proiectare sau de interfață. | Mecanismul de încapsulare este la nivelul implementării. |
Abstracția ascunde detaliile. | Incapsularea leagă informațiile dintr-o unitate, asigurând astfel securitatea informațiilor. |
Abstracția este implementată folosind clase și interfețe abstracte. | Modificatorii de acces și anume public, privat și protejat și implicit joacă un rol în încapsulare. |
În abstractizare, singura vizualizare abstractă este prezentată utilizatorului, în timp ce datele complexe și detaliate sunt ascunse utilizatorului. | În încapsulare, datele sunt grupate ca o unitate și pot fi protejate sau făcute accesibile utilizând modificatori de acces și metode getter și setter. |
întrebări frecvente
Q # 1) Se ascund abstractizarea și datele la fel?
Răspuns: Nu, abstractizarea și ascunderea datelor nu sunt la fel. Dar ambele sunt caracteristici importante ale programării orientate pe obiecte. În timp ce abstractizarea este un proces de ascundere a detaliilor de fundal, ascunderea datelor este o tehnică de izolare a datelor de accesul direct.
Q # 2) Care sunt avantajele abstractizării?
Răspuns: Câteva avantaje ale abstractizării sunt date mai jos:
- Ascunzând detaliile de fundal și expunând doar vizualizarea abstractă utilizatorului, abstractizarea face codul mai simplu și mai ușor de citit.
- Deoarece abstracția protejează detaliile inutile, acesta face codul mai mic.
- Întreținerea codului poate deveni complexă și dificilă fără abstractizare.
Î. 3) De ce este atât de importantă abstractizarea?
Răspuns: Abstracția ne permite să ascundem detalii de fundal care sunt importante și care pot duce la haos dacă sunt scurse în lume. Ascunzând detaliile de fundal și expunând doar interfața necesară utilizatorului, abstractizarea simplifică aplicațiile.
Q # 4) Explicați abstractizarea cu un exemplu în timp real.
Răspuns: Există multe exemple de abstractizare în timp real, inclusiv forme geometrice, vehicule etc. Un alt exemplu este ATM (Automated Teller Machine). Bancomat acceptă operațiuni precum retragerea numerarului, verificarea soldului, transferul de bani etc. Dar nu suntem conștienți de modul în care aceste operațiuni funcționează intern.
Ni se oferă doar un monitor cu o interfață de utilizator pentru a selecta și efectua operațiunile necesare.
Q # 5) Putem realiza Abstracție fără încapsulare?
Răspuns: Abstracția protejează detaliile implementării, iar încapsularea ascunde detaliile obiectului. Obiectul este forma abstractă a lumii reale și detaliile sale sunt ascunse folosind încapsularea. Astfel, este necesară încapsularea pentru abstractizare.
Concluzie
În acest tutorial, am discutat în detaliu despre abstractizarea în Java. Abstracția este o tehnică de a ascunde detalii inutile de la utilizator. Utilizatorul are acces doar la detaliile relevante. Operațiunile vehiculului sau operațiunile ATM sunt exemple clasice de abstractizări în lumea reală.
Când folosim bancomatul, suntem interesați doar să efectuăm operațiuni precum retragerea numerarului, etc. fără a fi nevoie să cunoaștem detaliile despre modul exact în care acea operațiune este efectuată intern.
Java oferă abstracție prin clase și interfețe abstracte. În timp ce interfețele asigură 100% abstractizare, clasele abstracte oferă o abstractizare parțială. Alegerea între interfețe și clase abstracte ar trebui făcută în funcție de aplicația care urmează să fie dezvoltată și, de asemenea, ce informații trebuie expuse utilizatorului.
De asemenea, am discutat despre metodele abstracte din acest tutorial împreună cu diferențele dintre clasele abstracte și interfețe.
=> Verificați TOATE Tutorialele Java aici.
Lectură recomandată
- Interfață Java și tutorial de clasă abstractă cu exemple
- Java Integer și Java BigInteger Class cu exemple
- Tutorial de curs Java Scanner cu exemple
- Ce este Java Vector | Tutorial Java Vector Class cu exemple
- Java Enum: Tutorial de enumerare Java cu exemple
- Noțiuni de bază Java: Sintaxă Java, Java Class și Core Java Concepts
- Tutorial JAVA pentru începători: peste 100 de tutoriale video Java practice
- Java Iterator: Aflați cum să utilizați Iterators în Java cu exemple