Se afișează postările cu eticheta abstract. Afișați toate postările
Se afișează postările cu eticheta abstract. Afișați toate postările

luni, 30 martie 2026

Clase și metode abstracte

Clasele abstracte în Java sunt un concept fundamental în Programarea orientată spre obiecte.

Deseori, atunci când lucrăm cu clasele derivate apare problema că pentru superclasă nu putem preciza implementarea unei metode pentru că subclasele sale au nevoie de implementare specifică fiecăreia. În acest caz pot fi utilizate clasele abstracte.

Java are clase abstracte predefinite. Una fiind clasa abstractă
Number, ce se conține în pachetul java.lang. Această clasă abstractă descrie un număr la general, dar într-o aplicație avem nevoie de număr de un anumit tip (întreg, real, ș.a). Fiecare tip de număr are caracteristicele sale însă toate exprimă valori numerice, fiecare în felul său. Clasa abstractă Number servește ca superclasă pentru clasele concrete Byte, Double, Float, Integer, Short şi Long, denumite și clase Wrapper sau clase înfășurătoare, despre care am menționat pe parcursul lecțiilor anterioare.

Obiecte de tip
Number nu putem instanția, însă putem instanția obiecte de tip Integer, Double, Float, etc.

O clasă declarată folosind cuvântul rezervat abstract este numită clasă abstractă. Așa tip de clasă nu poate fi instanţiată direct. Cu alte cuvinte, nu se pot crea obiecte direct pentru clasa abstractă. Scopul principal al claselor abstracte este de a defini caracteristici și comportamente comune pentru un grup de clase derivate.

Clasele abstracte pot defini metode și variabile pe care subclasele trebuie să le implementeze sau să le redefinească. Astfel, clasele abstracte pot oferi o implementare parțială a unei funcționalități (metode), lăsând detaliile specifice să fie implementate de către subclase.

Pentru a defini o clasă abstractă în Java, folosim cuvântul cheie abstract înaintea definiției clasei:
[public] abstract class numeClasaAbstracta
[ extends Superclasa ]
{
// declarații de atribute si metode
}

O clasă abstractă poate conține atât metode abstracte (metode care sunt declarate, dar nu sunt implementate în clasă), cât și metode concrete (metode care au o implementare).

Rețineți !
1. Clasa abstractă nu conține modificatorul
final;
2. Clasa abstractă conține metode abstracte, nu au implementare în clasa dată;
3. Clasa abstractă poate să nu aibă nici o metodă abstractă;
4. Orice clasă ce are măcar o metodă abstractă trebuie să fie şi ea abstractă;
5. O clasă nu poate fi concomitent finală şi abstractă;
6. Subclasa unei clase abstracte trebuie să conțină cod pentru toate metodele abstracte declarate în superclasa abstractă, în caz contrar subclasa trebuie să fie şi ea abstractă;
7. Clasa abstractă impune subclasele sale să implementeze metode comune şi le permite să implementeze şi metode proprii;
8. Constructorii și câmpurile clasei nu pot fi abstract.

O metodă abstractă este o metodă fără implementare și poate fi doar în corpul unei clase abstracte, conține obligatoriu cuvântul rezervat abstract în semnătura acesteia:
abstract tipMetoda numeMetoda ([lista_parametri_formali]);

Rețineți !
1. Metodele abstracte conțin semnul ,,;’’ ce înlocuiește corpul metodei;
2. O metodă declarată public poate fi abstractă;
3. O metodă statică nu poate fi abstractă, pentru că nu poate fi rescrisă;
4. Metodele abstracte nu pot fi private pentru că scopul acestora este de a fi implementate într-o clasă copil.

Exemplu 1 Creați un program Java format din:
1. clasa abstractă Figura care va conține 2 metode publice abstracte fără parametri: double Arie() şi double Perimetru().
2. clasa Cerc ce extinde clasa abstractă Figura și va conține variabila privată raza, constructorul clasei cu un parametru, metodele Arie() și Perimetru() implementate.
3. clasa Triunghi ce extinde clasa Figura și conține variabila privată latura, constructorul clasei cu un parametru, metodele din Figura implementate.
4. clasa TestFigura.

abstract class Figura{
public abstract double Arie();
public abstract double Perimetru();
}

class Cerc extends Figura{
private double raza;
public Cerc(int raza){ this.raza = raza;}
public double Arie(){
return Math.PI*raza*raza;
}
public double Perimetru(){
return 2*Math.PI*raza;
}}

class Triunghi extends Figura{
private double latura;
public Triunghi(double latura){this.latura = latura;}
public double Arie(){
return Math.sqrt(3)/4*latura*latura;
}
public double Perimetru(){
return 3*latura;
}}

public class TestFigura {
public static void main(String[] args) {
System.out.println("-------------------------------------");
Cerc obCerc = new Cerc(3);
System.out.println("Aria cercului = "+obCerc.Arie());
System.out.println("Perimetru cercului"+obCerc.Perimetru());
System.out.println("-------------------------------------");
Triunghi obTriunghi = new Triunghi(5);
System.out.println("Aria triunghi = "+obTriunghi.Arie());
System.out.println("Perim. Triunghi "+obTriunghi.Perimetru());
}}


Avantajele utilizării claselor abstracte:
1. Clasele abstracte ajută la organizarea și structurarea codului prin definirea unor șabloane comune pentru obiecte similare. Acestea permit separarea logicii comune și a detaliilor specifice în clase separate, ușurând înțelegerea și gestionarea codului.
2. Prin intermediul claselor abstracte, putem defini comportamente și caracteristici comune, care pot fi apoi extinse și adaptate în clasele derivate. Acest lucru promovează reutilizarea codului și permite crearea de noi funcționalități pe baza celor existente.

Dezavantajele utilizării claselor abstracte:
1. Utilizarea excesivă a claselor abstracte poate duce la creșterea complexității în proiecte mari și complexe. Definirea unei ierarhii de clase prea profunde sau prea interconectate poate face codul mai greu de înțeles și de întreținut.
2. Clasele abstracte pot crea dependențe strânse între clasele din ierarhia de moștenire. Aceasta poate duce la dificultăți în refactorizare, deoarece modificările aduse unei clase abstracte pot avea un impact asupra claselor care o extind.

Vă propun să urmăriți un tutorial practic în care se evidențiază utilizarea claselor abstracte:


Detalii complexe despre clasele abstracte consultați aici: 👉https://docs.oracle.com/javase/tutorial/java/IandI/abstract.html

Să aveți o zi deosebită! 
❤️