Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo:breviare:breviar-03 [2018/09/22 20:39]
mihai.nan
poo:breviare:breviar-03 [2025/10/16 12:26] (current)
stefanel.turcu [Extra: Tipuri speciale în Java: enum și record]
Line 1: Line 1:
 ====== Breviar ====== ====== Breviar ======
 ===== Laborator 3 - Clase și Obiecte în Java ===== ===== Laborator 3 - Clase și Obiecte în Java =====
- 
-  * Responsabil:​ [[mihai.nan.cti@gmail.com|Mihai Nan]] 
-  * Profesor titular: Carmen Odubășteanu 
- 
 ==== Introducere ==== ==== Introducere ====
  ​Presupunem că dorim //să descriem//, uzitând un limbaj de programare, un **obiect** carte. În general, o carte poate fi caracterizată prin titlu, autor și editură. Cum am putea realiza această descriere formală?  ​Presupunem că dorim //să descriem//, uzitând un limbaj de programare, un **obiect** carte. În general, o carte poate fi caracterizată prin titlu, autor și editură. Cum am putea realiza această descriere formală?
Line 355: Line 351:
  
 ==== Principii POO ==== ==== Principii POO ====
 +
 +Programarea Orientată pe Obiecte (OOP) se bazează pe un set de principii fundamentale care permit organizarea logică și extensibilă a codului, facilitând reutilizarea,​ modularitatea și întreținerea aplicațiilor.
 +
 +Principiile de bază ale OOP sunt următoarele:​
 +  * **Încapsularea** – ascunderea detaliilor interne ale unei clase și expunerea doar a unei interfețe publice (prin metode și proprietăți). Scopul este protejarea datelor și controlul modului în care acestea sunt accesate și modificate.
 +  * **Abstractizarea** – procesul de simplificare a unei entități complexe prin definirea doar a caracteristicilor esențiale, eliminând detaliile irelevante. În Java, abstracția se realizează prin clase abstracte și interfețe.
 +  * **Moștenirea** – mecanismul prin care o clasă poate prelua (moșteni) atributele și comportamentele unei alte clase. Aceasta permite reutilizarea codului și extinderea funcționalității.  ​
 +<​note>​ Moștenirea va fi studiată pe larg în laboratoarele și cursurile următoare, unde vom analiza concepte precum clase derivate, suprascrierea metodelor și ierarhiile de clase.</​note>​
 +  * **Polimorfismul** – posibilitatea ca același comportament (de exemplu, o metodă) să se manifeste diferit în funcție de contextul obiectului care îl execută. Acesta este un concept-cheie care permite flexibilitate și extensibilitate în designul aplicațiilor.
 +
 +{{:​poo:​breviare:​poo-principii.png?​700|}}
 +
 <note important>​ <note important>​
 Mai multe funcții pot avea același nume în același domeniu de definiție, dacă se pot diferenția prin numărul sau tipul argumentelor de apel. Mai multe funcții pot avea același nume în același domeniu de definiție, dacă se pot diferenția prin numărul sau tipul argumentelor de apel.
 </​note>​ </​note>​
  
-=== Supraincarcarea ​=== +=== Supraîncarcarea ​=== 
-În Java, se pot găsi două sau mai multe metode, în cadrul aceleiași clase, care să aibă același nume, atâta timp cât argumentele lor sunt diferite. În acest caz, se spune că metoda este supraîncărcată,​ iar procedeul se numește **supraîncarcarea metodelor**. ​+În Java, se pot găsi două sau mai multe metode, în cadrul aceleiași clase, care să aibă același nume, atâta timp cât argumentele lor sunt diferite ​(polimorfism). În acest caz, se spune că metoda este supraîncărcată,​ iar procedeul se numește **supraîncarcarea metodelor**. ​
 Pentru o mai bună înțelegere a acestui principiu POO, se va oferi, în continuare, un exemplu pentru o metodă care determină maximul. Pentru o mai bună înțelegere a acestui principiu POO, se va oferi, în continuare, un exemplu pentru o metodă care determină maximul.
  
Line 389: Line 397:
  
 Un alt exemplu elocvent, pentru acest prinicpiu POO, este operatorul ''​+''​ care execută operații diferite în cotexte diferite. Un alt exemplu elocvent, pentru acest prinicpiu POO, este operatorul ''​+''​ care execută operații diferite în cotexte diferite.
 +
 +==== Extra: Tipuri speciale în Java: enum și record ====
 +
 +=== Ce este un enum? ===
 +
 +Un **enum** (de la *enumeration*) este un tip special de clasă care definește un set fix de constante.  ​
 +Este folosit atunci când o variabilă poate avea doar un număr limitat de valori posibile.
 +
 +**Exemplu:​**
 +
 +<code java>
 +public enum ZiSaptamana {
 +    LUNI, MARTI, MIERCURI, JOI, VINERI, SAMBATA, DUMINICA
 +}
 +
 +public class Program {
 +    public static void main(String[] args) {
 +        ZiSaptamana zi = ZiSaptamana.VINERI;​
 +
 +        // Poți folosi switch cu enum
 +        switch (zi) {
 +            case SAMBATA, DUMINICA -> System.out.println("​Weekend!"​);​
 +            default -> System.out.println("​Zi de lucru."​);​
 +        }
 +    }
 +}
 +</​code>​
 +
 +**Observații:​**
 +  * Valorile //LUNI//, //MARTI//, etc. sunt constante (publice, statice și imutabile).
 +  * Se folosesc frecvent pentru a face codul mai clar și mai sigur (în locul valorilor numerice sau string).
 +
 +=== Ce este un record? ===
 +
 +Un **record** este o formă modernă de clasă introdusă în Java 14 (stabilă din Java 16),  ​
 +care servește pentru a defini **obiecte imutabile de tip „data class”**, adică structuri care doar rețin date.
 +
 +**Exemplu simplu:**
 +
 +<code java>
 +public record Punct(int x, int y) { }
 +
 +public class Main {
 +    public static void main(String[] args) {
 +        Punct p1 = new Punct(3, 5);
 +        System.out.println(p1); ​         // => Punct[x=3, y=5]
 +        System.out.println(p1.x()); ​     // accesează câmpul x
 +    }
 +}
 +</​code>​
 +
 +**Ce oferă automat un record:**
 +  * constructor pentru toți parametrii (`new Punct(int x, int y)`)
 +  * metode //x()// și //y()// pentru acces la date (getters)
 +  * metode //​equals()//,​ //​hashCode()//​ și //​toString()//​ generate automat
 +  * toate câmpurile sunt //private// și //final// → obiectul este imutabil
 +
 +**Avantaj:​**  ​
 +**record** reduce semnificativ codul boilerplate comparativ cu o clasă clasică.
 +
 +**Exemplu echivalent (clasă obișnuită):​**
 +
 +<code java>
 +public class PunctClasic {
 +    private final int x;
 +    private final int y;
 +
 +    public PunctClasic(int x, int y) {
 +        this.x = x;
 +        this.y = y;
 +    }
 +
 +    public int getX() { return x; }
 +    public int getY() { return y; }
 +
 +    @Override
 +    public String toString() {
 +        return "​Punct[x="​ + x + ", y=" + y + "​]";​
 +    }
 +}
 +</​code>​
 +
 +**Când să folosești un record:**
 +  * Când vrei un obiect simplu, imutabil, care doar conține date.
 +  * Când nu ai nevoie de moștenire (un //record// nu poate extinde altă clasă).
  
  
  
poo/breviare/breviar-03.1537637984.txt.gz · Last modified: 2018/09/22 20:39 by mihai.nan
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0