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

miercuri, 1 aprilie 2026

Clase și metode abstracte set de probleme

Aceste probleme se vor realiza în baza noțiunilor studiate la instruirea teoretică:  https://musteatadidactic.blogspot.com/2026/03/clase-si-metode-abstracte.html


1. Deschideți editorul de cod Java și rulați Exemplul 1 din partea teoretică. Apoi realizați următoarele modificări:
a. Adăugați clasei Figura metoda: static void afisare(String autor) care va afișa autorul programului.     Testați metoda în main().
b. Adăugați o nouă subclasă pentru clasa Figura. Instanțiați subclasa în main().

2. Se cere realizarea unei aplicații Java care să simuleze funcționarea unor aplicații digitale populare (rețele sociale, platforme educaționale, servicii de streaming).
a. Creați clasa abstractă Aplicatie, care va conține:
- atributul nume (de tip String);
- un constructor cu parametri pentru inițializarea atributului;
- metoda concretă afisareNume(), care afișează denumirea aplicației;
- metodele abstracte: login(), logout() și functionalitatePrincipala()
b. Creați cel puțin 3 clase care extind clasa Aplicatie:
- AplicatieSocialMedia (ex.: Instagram, Facebook) în care supradefiniți:
metoda login() va afișa: „Utilizatorul s-a autentificat în aplicația X”
metoda functionalitatePrincipala() va afișa: „Postează o imagine”
- AplicatieEducatie (ex.: platformă e-learning) în care supradefiniți:
metoda login() va afișa: „Utilizatorul s-a autentificat în aplicația X”
metoda functionalitatePrincipala() va afișa: „Accesează un curs”
- AplicatieStreaming (ex.: video sau muzică)
metoda login() va afișa: „Utilizatorul s-a autentificat în aplicația X”
metoda functionalitatePrincipala() va afișa: „Redă un videoclip”
c. Testarea în metoda main
- creați un array de tip Aplicatie;
- adăugați obiecte din toate cele trei tipuri de aplicații;
- parcurgeți array-ul și apelați metodele definite.

3. Efectuați următoarele acțiuni:

a) Având dată următoarea clasă abstractă. Transcrieți această clasă în editorul de cod Java:

abstract class Policeman {
private String nume;
private String prenume;
private int staj;
public Policeman(String n, String p,int s) {
nume = n;
prenume = p;
staj = s;
}
public String getNume() {
return nume; 
}
public String getPrenume() {
return prenume; 
}
public int getStaj() {
return staj; 
}
public abstract double venit();
public abstract int rang();
}

Vor urma 3 clase: Soldat din care se va deriva Sergent din care mai apoi se va deriva Locotenent. Metodele abstracte venit() și rang() vor fi implementate în clase. Metoda rang() va returna rangul omului legii. Va începe de la 1 pentru soldat, va urma 2 pentru sergent și 3 pentru locotenent.
b) Elaborați clasa Soldat pornind de la următorul codul sursă:

class Soldat extends Policeman {
protected static double plataBazaSoldat = 3600;
Soldat(String nume, String prenume, int staj) {
super(nume, prenume, staj);
}
public double getPlataSoldat(){
}
}

Plata de bază pentru un soldat este 3600 lei pe lună. Salariul net constituie 85% din salariul de bază + 6% din rădăcina pătrată din plata de bază înmulțit la staj. Rangul său este 1.
c) Elaborați clasa Sergent pornind de la următorul codul sursă:

class Sergent extends Soldat {
protected static double plataBazaSerjant = 4700;
public Sergent(String nume, String prenume, int staj) {
super(nume, prenume, staj); 
}
}

Plata de bază pentru un sergent este 4700 lei pe lună. Salariul net constituie 82% din salariul de bază + 1.2 înmulțit la rădăcina pătrată din plata de bază înmulțit la staj. Rangul său este de 2 ori mai mare decât rangul soldatului care trebuie obținut cu ajutorul variabilei predefinite super.

d) Elaborați clasa Locotenent pornind de la următorul codul sursă:

class Locotenent extends Serjant{
protected static double plataBazaLocotenent = 5900;
public Locotenent(String nume, String prenume, int staj) {
super(nume, prenume, staj);
}
}

Plata de bază pentru un locotenent este 5900 lei pe lună. Salariul net constituie 80% din salariul de bază + 1.3 înmulțit la rădăcina pătrată din plata de bază înmulțit la staj. Rangul său este cu o unitate mai mare decât rangul locotenentului care trebuie obținut, de asemenea, cu ajutorul variabilei predefinite super.
e) Compuneți clasa TestPolitie în care instanţiați clasele programate și testați metodele acestora. 

4. Modelați un sistem de calcul al salariilor pentru diferite tipuri de angajați.

a) Creați clasa abstractă Angajat, care va conține:
- atributul nume (String);
- atributul salariuBaza (double);
- constructor pentru inițializare;
- metodă concretă afisareNume();
- metode abstracte: calculeazaSalariu() și calculeazaBonus()
b) Creați cel puțin 3 clase:
- Programator. Despre programator se știe că bonus = 20% din salariul de bază și salariu final = salariuBaza + bonus.
- Manager. Despre manager se știe că bonus = 35% din salariul de bază și salariu final = salariuBaza + bonus
- Intern, despre inter se știe că bonus = 0 și salariu final = salariuBaza
c) În metoda main:
- creați un array de tip Angajat;
- adăugați obiecte (ex: 5000, 8000, 3000);
- pentru fiecare:
- afișați numele
- calculați și afișați bonusul
- calculați și afișați salariul final
- calculați salariul total al tuturor angajaților
- afișați angajatul cu salariul cel mai mare


5. Se dorește modelarea unui sistem de calcul al costului total pentru diferite tipuri de comenzi online.
a. Creați clasa abstractă Comanda, care va conține:
- atributul client (String);
- atributul valoareProduse (double);
- constructor pentru inițializare;
- metodă concretă afisareClient();
- metode abstracte: calculeazaLivrare() și calculeazaTotal()
b. Creați cel puțin 3 clase:
- ComandaStandard, despre care se cunoaște că costul de livrare este 50 lei, iar totalul se va calcula conform formulei: total = valoareProduse + livrare
- ComandaExpress, despre care se cunoaște că costul de livrare este 100 lei, iar totalul se va calcula conform formulei: total = valoareProduse + livrare
- ComandaPremium, despre care se cunoaște că costul de livrare este 0 lei, iar totalul se va calcula conform formulei: total = valoareProduse (livrare gratuită)
c. În metoda main:
- creați un array de tip Comanda;
- adăugați obiecte (ex: 500 lei, 300 lei etc.);
- pentru fiecare:
- afișați clientul
- calculați livrarea
- calculați totalul
- aplicați reducere de 10% pentru comenzile peste 500 lei
- afișați comanda cu cel mai mare total

Succes! 
❤️

marți, 31 martie 2026

Set. HashSet. LinkedHashSet. TreeSet - Set de probleme

Pentru efectuarea sarcinilor acestui laborator cercetați mai întâi reperele teoretice: https://musteatadidactic.blogspot.com/2026/03/set-hashset-linkedhashset-treeset.html

1. Testați în editorul de cod Java codul de la Exemplul 1. Efectuați următoarele modificări:
  • Creați o nouă listă de tip HashSet ce va conține elemente de tip întreg. 
  • Citiți 10 elemente de la tastatură. 
  • Afișați elementele citite la ecran însoțite de suma acestora.
2. Testați în editorul de cod Java codul de la Exemplul 4. Efectuați următoarele modificări:
  • Adăugați clasei Elev caracteristica IDNP care reprezintă codul personal al elevului. Modificați întreg codul (constructor, toString(), main()) astfel încât acesta să ruleze cu succes.
  • Modificați metodele equals() și hashCode() astfel încât acestea să nu admită elevi cu același IDNP în listă.
  • Citiți datele elevilor dintr-un fișier text.
3. Testați în editorul de cod Java codul de la Exemplul 5. Efectuați următoarele modificări:
  • Citiți datele dintr-un fișier în care se cunoaște că sunt 20 valori întregi unele dintre care se repetă.
  • Sortați elementele descrescător.
4. Testați în editorul de cod Java codul de la Exemplul 7. Efectuați următoarele modificări:
  • Adăugați clasei Elev câmpul grupa, care reprezintă grupa în care elevul studiază. Modificați întreg codul (constructor, toString(), main()) astfel încât acesta să ruleze cu succes.
  • Sortați elementele crescător după grupă și descrescător după notă.
5. Elaborați un program Java care va conține o listă de tip HashSet cu 10 valori. Afișați lista la ecran. Eliminați folosind instrucțiunea removeIf() toate numerele mai mari de 20.

6. Elaborați un program Java care va înscrie într-o listă elevii în ordinea în care au ridicat mâna să răspundă. Deci va trebuie să păstrezi ordinea participării la discuție și nu se dorește ca fiecare elev să fie înregistrat de două ori. Ce tip de date vei declara lista? Consultă tabelul din repere teoretice! Lista va avea tipul LinkedHashSet și va stoca elemente de tip Elev.

7. Se dorește o aplicație care va crea un clasament al elevilor participanți la competiție. Elaborați un program Java care va înscrie într-o listă elevii și punctajul acestora. Nu se permite elemente duplicat, iar elevii trebuie afișați automat în ordine descrescătoare punctajelor acumulate. Ce tip de date vei declara lista? Consultă tabelul din repere teoretice! Lista va avea tipul TreeSet, pentru că sortează automat elementele, și va stoca elemente de tip Elev.

Vă doresc o zi deosebit de frumoasă!
❤️

luni, 9 februarie 2026

Tipuri de relații între obiecte. Set de probleme

1. Un magazin comercializează diferite produse electronice. Pentru a gestiona aceste produse, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Despre produse se cunosc următoarele. Fiecare produs are denumire și preț. Există două tipuri de produse:
- Laptop, care are ca caracteristică specifică memorie RAM
- Telefon, care are ca caracteristică specifică capacitate baterie.
Creați un sistem în care:
- Definiți clasele Produs, Laptop, Telefon și stabiliți în ce relație se află acestea.
- Definiți atributele și constructori pentru toate clasele.
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre clase
- În metoda main(), instanțiați clasele Laptop și Telefon și afișați informația despre fiecare.

2. O platformă online gestionează cursuri și instructori. Pentru organizarea activității, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Despre entități se cunosc următoarele:
- fiecare instructor are nume și specializare
- fiecare curs are titlu și durată.
Platforma are denumire instructor și cursuri.
Creați un sistem în care:
- Definiți clasele Instructor, Curs și Platforma și stabiliți relația dintre acestea.
- Definiți constructori pentru toate clasele.
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre obiecte.
- În metoda main(), creați mai mulți instructori și cursuri, apoi o platformă și asociați aceste obiecte.
- Afișați informația despre platformă, instructorii și cursurile disponibile.

3. Un calculator este format din componente interne. Pentru a simula structura unui calculator, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Se cunoaște că fiecare componentă are denumire și specificații. Un calculator are model și conține componente (procesor, memorie RAM, hard disk).
Creați un sistem în care:
- Definiți clasele Componenta și Calculator și stabiliți relația dintre acestea.
- Definiți constructori pentru toate clasele.
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre obiecte.
- În clasa Calculator, creați componentele (în constructor).
- În metoda main(), creați un obiect de tip Calculator.
- Afișați informația despre calculator și componentele sale.

4. Un Smartwatch este format din componente electronice integrate. Pentru a simula structura unui ceas inteligent, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Se cunoaște că fiecare componentă are denumire și consum energetic. Un ceas are model și conține componente (ecran, baterie, senzor).
Creați un sistem în care:
- Definiți clasele Componenta și Smartwatch și stabiliți relația dintre acestea.
- Definiți constructori pentru toate clasele.
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre obiecte.
- În clasa Smartwatch, creați componentele (în constructor).
- În metoda main(), creați un obiect de tip Smartwatch.
- Afișați informația despre ceas și componentele sale.

5. Un spital colaborează cu medici specialiști care pot activa și în alte clinici. Pentru a simula structura unui cabinet medical, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Se cunoaște că fiecare Medic are nume și specializare. Un Cabinet are denumire și colaborează cu medici (un tablou de obiecte).
Creați un sistem în care:
- Definiți clasele Medic și Cabinet și stabiliți relația dintre acestea.
- Definiți constructori pentru toate clasele (constructorul clasei Cabinet primește tabloul de medici).
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre obiecte.
- În clasa Cabinet, parcurgeți tabloul de medici pentru a le afișa datele.
- În metoda main(), creați obiectele de tip Medic independent de cabinet.
- Transmiteți tabloul de medici la crearea obiectului de tip Cabinet și afișați informația completă.

6. O Facultate este formată dintr-un grup de angajați care pot activa și în alte instituții. Pentru a simula structura academică, se dorește realizarea unei aplicații în Java. Proiectați în UML clasele. Se cunoaște că există o superclasă Persoana cu nume și prenume. Din aceasta derivă clasa Profesor care are în plus titlu academic. O Facultate are denumire și conține profesori (un tablou de obiecte).
Creați un sistem în care:
- Definiți superclasa Persoana și subclasa Profesor, stabilind relația de moștenire.
- Definiți clasa Facultate și stabiliți relația de agregare cu clasa Profesor.
- Definiți constructori pentru toate clasele.
- Adăugați claselor metoda afisare() pentru a afișa informațiile despre obiecte.
- În clasa Facultate, parcurgeți tabloul de profesori pentru a le afișa datele complete (nume, prenume și titlu).
- În metoda main(), creați 3 obiecte de tip Profesor în mod independent (ca entități separate).
- Creați un tablou cu acești profesori și transmiteți-l ca parametru la crearea obiectului de tip Facultate.
- Afișați informația despre facultate și lista membrilor corpului didactic.

Succes! 
❤️

joi, 5 februarie 2026

Tip de date șir de caracter. Clasa String

String-urile, numite șiruri de caractere, sunt pe larg utilizate în  orice limbaj de programare, și reprezintă o succesiune finită de caractere (litere, cifre, simboluri), tratată ca un singur obiect.

În Java string-urile sunt considerate obiecte, adică sunt de tip referință.
 
Una din clasele Java ce permit prelucrarea șirurilor de caractere este clasa String.

Definiție:
public final class String extends Object
implements Serializable, Comparable<String>, CharSequence


Descriere:
Clasa String se află în pachetul java.lang și este utilizată pentru crearea și prelucrarea șirurilor de caractere. Este o clasă închisă spre modificare (immutable), adică o clasă obiectele căreia nu se modifică. Orice valoare atribuită  obiectului rămâne în sistem creând astfel a mulțime de obiecte neutilizate. 

Pentru a crea un șir de caractere puteți utiliza sintaxa:
String identificator = ”Valoare”;
De exempluString zi = ”Luni”;

Ori de cîte ori compilatorul găsește un literal String în codul sursă acesta crează un obiect de tipul clasei String ce va conține ca valoare literalul.

La fel ca și în cazul celorlalte obiecte, puteți folosi constructorul clasei String pentru a crea o instanță a acestei clase.
De exempluString zi = new String(”Luni”);
 
Metode:
a) char charAt(int index) - returnează caracterul ce se află pe poziția index. Indicele caracterului din șir variază de la 0 la length()-1.

De exemplu:
String s = "Java";
System.out.println(s.charAt(1)); //a

b) public boolean equals(Object unObiect) returnează true dacă obiectul curent este echivalent ca valoare cu string-ul unObiect, în caz contrar returnează false. Se ține cont de litere mari și mici.

De exemplu:
String s = "Java";
String s1 = "Java";
String s2 = "java";
System.out.println(s.equals(s1)); //true
System.out.println(s.equals(s2)); //false

c) public boolean equalsIgnoreCase(String altString) - returnează true dacă obiectul curent este echivalent ca valoare cu string-ul altString, în caz contrar returnează false. Nu se ține cont de litere mari si mici.  

De exemplu:
String s = "Java";
String s1 = "java";
String s2 = "Java";
System.out.println(s.equalsIgnoreCase(s1));
//true
System.out.println(s.equalsIgnoreCase(s2)); //true

Notă!  
Operatorul == aplicat asupra a două șiruri de caractere nu va verifica egalitatea acestora ci identitatea șirurilor, adică se vor compara referințele și se va returna true dacă acestea vor fi egale. Se va  verifica dacă cele două șiruri indică unul și același obiect.

De exemplu:
String s = "Java";
String s1 = "POO";
String s2 = s;
System.out.println(s==s1);
//false
System.out.println(s2==s); //true

d. public int length()- returnează lungimea șirului de caractere.  

De exemplu:
String s = "Java";
System.out.println(s.length()); //4

e. public boolean isEmpty()  - returnează true dacă  și numai dacă length() este 0

De exemplu:
String s = "Java" ;
String s2 = "";
System.out.println(s.isEmpty());
// false
System.out.println(s2.isEmpty()); // true

f. public boolean startsWith(String prefix, int toffset) - verifică dacă substrigul din șirul dat începînd cu poziția toffset începe cu prefixul prefix.

De exemplu:
String s = "Programare" ;
System.out.println(s.startsWith("ram", 3));  //false
System.out.println(s.startsWith("ram", 4));  
//true
System.out.println(s.startsWith("ram", 10)); //false
System.out.println(s.startsWith("ram", -3)); //false

g. public boolean startsWith(String prefix)- verifică dacă șirul dat începe cu prefixul prefix.

De exemplu:
String s = "Programare" ;
System.out.println(s.startsWith("Prog"));
//true
System.out.println(s.startsWith("ram")); //false

h. public boolean endsWith(String suffix)- verifică dacă șirul dat finisează cu sufixul suffix.

De exemplu:
String s = "Programare" ;
System.out.println(s.endsWith("re"));
//true

i. public int indexOf(String ch)- Returnează indicele caracterului ch  în cadrul unui șir de caractere.

De exemplu:
String s = "Programare" ;
System.out.println(s.indexOf("r"));
//1
System.out.println(s.indexOf("b")); //-1
System.out.println(s.indexOf("P")); //0
System.out.println(s.indexOf("p")); //-1

j. public int lastIndexOf(String ch) - Returnează indicele ultimei apariții a caracterului ch în cadrul unui șir de caractere.

De exemplu:
String s = "Programare";
System.out.println(s.lastIndexOf("r"));
//8
System.out.println(s.lastIndexOf("b")); //-1
System.out.println(s.lastIndexOf("o")); //2

k. public String concat(String str)– concatinează două șiruri de caractere.

De exemplu:
String s = "programez in " ;
String s1 = " Java" ;
s.concat(s1);
System.out.println(s);
// programez
String s3 = s.concat(s1);
System.out.println(s3); // programez in Java
System.out.println("Eu ".concat(s3)+" azi"); //Eu programez in Java azi

l. public String replace(char oldChar, char newChar) - returnează un string rezultat din înlocuirea tuturor aparițiilor caracterelor specificate în oldChar prin newChar.   

De exemplu:
String s = "tata";
System.out.println(s.replace("t", "m"));
//mama
System.out.println("Ei pleaca".replace("Ei", "Ele")); //Ele pleaca

m. public boolean contains(CharSequence s)– returnează true daca și numai dacă șirul de caractere conține secvența căutată specificată prin s.

De exemplu:
String s = "Programez in Java";
System.out.println(s.contains("Java"));
//true
System.out.println("Ei pleaca".contains("Ele")); //false

n. public String toLowerCase()- Convertește toate literele șirului de caractere în litere mici.

De exemplu:
String s = "Programez";
System.out.println(s.toLowerCase());
//programez
System.out.println("Ei pleaca".toLowerCase()); //ei pleaca

o. public String toUpperCase()- Convertește toate literele șirului de caractere în litere mari.

De exemplu:
String s = "Programez";
System.out.println(s.toUpperCase());
//PROGRAMEZ
System.out.println("in java".toUpperCase()); //IN JAVA

p. public String substring(int beginIndex)- returnează un subșir din șirul asupra căruia s-a apelat metoda începând cu indexul elementului din șir specificat prin beginIndex.

De exemplu:
String s = "Programez";
System.out.println(s.substring(3)); // gramez
System.out.println(s.substring(-1)); 
// StringIndexOutOfBoundsException
System.out.println(s.substring(9)); // nu se afiseaza nimic

q. substring(int IndexInitial, int IndexFinal)- returnează un subșir din șirul asupra căruia s-a apelat metoda data începând cu  caracterul aflat pe poziția IndexInitial până la caracterul cu indicele IndexFinal.

De exemplu:
String s = "Programez";
System.out.println(s.substring(0,7)); // Program
System.out.println(s.substring(0,10)); //StringIndexOutOfBoundsException
System.out.println(s.substring(1,1)); // nu se afiseaza nimic
System.out.println(s.substring(3,1)); 
// StringIndexOutOfBoundsException

r. public String trim() - întoarce o copie a șirului fără spațiile de la începutul și sfârșitul șirului.  

De exemplu:
String s = " Programez ";
String s1 = "Programez";
System.out.println(s.equals(s1));
//false
System.out.println(s.trim().equals(s1)); //true

s. boolean Character.isDigit(char c)– verifică dacă caracterul c este o cifră (0–9). Returnează true dacă este cifră și false în caz contrar.

De exemplu:
char c = '5';
System.out.println(Character.isDigit(c)); // true
char c = 'A';
System.out.println(Character.isDigit(c)); // false

t. boolean Character.isUpperCase(char c) – verifică dacă caracterul c este o literă mare. Returnează true dacă este literă mare și false în caz contrar.

De exemplu:
char c = 'J';
System.out.println(Character.isUpperCase(c)); // true
char c = 'j';
System.out.println(Character.isUpperCase(c)); // false

u. boolean Character.isLowerCase(char c) – verifică dacă caracterul c este o literă mică. Returnează true dacă este literă mică și false în caz contrar.

De exemplu:
char c = 'a';
System.out.println(Character.isLowerCase(c)); // true
char c = 'A';
System.out.println(Character.isLowerCase(c)); // false

Aceste metode nu aparțin clasei String, ci clasei Character, dar sunt utilizate frecvent împreună cu String.charAt(), atunci când analizăm caracterele unui șir. De exemplu: 
String text = "Java2026";

// parcurgem fiecare caracter din șir
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);

    System.out.print(c + " -> ");

    if (Character.isUpperCase(c)) {
        System.out.println("literă mare");
    } else if (Character.isLowerCase(c)) {
        System.out.println("literă mică");
    } else if (Character.isDigit(c)) {
        System.out.println("cifră");
    } else {
        System.out.println("alt caracter");
    }
}

Deci:
  • charAt() extrage un caracter dintr-un String;
  • Character.isDigit(), isUpperCase(), isLowerCase() analizează caracterul extras.

Rețineți ! 
A se acorda o deosebită atenție atunci când lucrați cu operatorul de concatenare +. Se va ține cont de următoarele reguli:
1. Dacă ambii operanzi sunt numerici operatorul + va efectua operația de adunare.
2. Dacă unul din operanzi este String operatorul + va efectua concatenarea.
3. Expresia este evaluată de la stânga la dreapta.

De exemplu:
String s1 = "Hello";
int a = 3;
String s2 ="4";
String s3 ="4";
System.out.println(a+s1); // 3Hello
System.out.println(s1+a); // Hello3
System.out.println(s2+s3); // 44
System.out.println(1+2); // 3
System.out.println("a"+"b"); // ab
System.out.println("a"+3); // a3
System.out.println("a"+3+4); // a34
System.out.println(3+"a"); // 3a
System.out.println(3+4+"a"+6+1); // 7a61
System.out.println("a"+6+1); // a61
System.out.println(6+1+"a"); // 7a


Restricții impuse de limbaj

Obiectele de tip String sunt imutabile adică conținutul nu poate fi modificat după creare

String s = "abc";
s = s + "d";
// se creează un obiect nou

Accesarea caracterelor se face doar prin metode, nu prin index direct:
char c = s.charAt(0);
 
Metode pentru conversii

String t = String.valueOf(456); - convertește valoarea de tip întreg în șir de caractere

int x = Integer.parseInt("123"); - convertește un șir de caractere în valoare întreagă.

marți, 27 ianuarie 2026

Membri de instanță

MEMBRI DE INSTANȚĂ sunt membrii clasei declarați FĂRĂ cuvântul cheie static. Sunt asociate obiectelor. Aceștia definesc starea și comportamentul specific al fiecărei instanțe a unei clase. Sunt utilizați pentru a reprezenta date și operații care depind de particularitățile fiecărui obiect individual. Pentru a putea fi accesate este nevoie de a avea create obiectele în prealabil, adică de a avea clasa instanțiată.
a) Variabile de instanță. 
Pentru așa tip de variabile sistemul alocă spațiu de memorie pentru fiecare în parte. Fiecare instanță are valoarea sa pentru un membru al clasei din care fac parte. Sunt stocate în Stivă.

b) Metode de instanță. 
Lucrează direct atât cu variabile statice cât și cu cele nestatice în corpul lor. Metodele de instanță pot fi apelate cu ajutorul unei instanțe a clasei respective:

MyClass.metodaDeInstanta(); // ilegal 

MyClass obj = new MyClass();
obj.metodaDeInstanta(); // legal

c) Blocuri de inițializare de instanță. 
Blocurile de inițializare de instanță sunt utilizate pentru a inițializa variabilele de instanță înainte ca oricare metoda să fie apelată pe instanța respectivă. Aceste blocuri nu conțin cuvântul cheie static.






Membri de clasă

MEMBRI DE CLASA sunt membrii declarați cu ajutorul cuvântului cheie static. Fiind aplicat la diverse elemente, le face asociate cu clasa în loc de o instanță specifică a acelei clase. Datorită acestui fapt, puteți utiliza numele clasei pentru a face referire la un câmp static (variabilă statică) sau pentru a apela o metodă statică, fără a fi necesitate de a instanția clasa în acest sens.

Iată câteva elemente care pot fi marcate ca fiind statice:

a) Variabile statice.
Sunt folosite atunci când avem nevoie ca variabilele clasei să fie partajate de toate instanţele clasei. Sunt stocate în Heap. De obicei sunt constante simbolice. Pentru aşa tip de variabile sistemul aloca o singura zonă de memorie, la care au acces toate instanţele clasei respective. Nu vom putea avea pentru fiecare instanţă a clasei valoarea ei proprie pentru o astfel de variabila. Dacă o instanţă va modifica valoarea unei variabile statice aceasta valoare se va modifica pentru toate instanţele.

b) Metode statice. 
Sunt accesate fară o instanţiere a clasei respective:

DenumireClasa.metodaStatica();  //legal

<=>

MyClass obj = new MyClass();
obj.metodaStatica(); //legal, dar NU este recomandat


Este legal să apelați o metodă statică folosind un obiect în Java, dar este considerat o practică nepotrivită și este recomandat să evitați acest lucru. De obicei, metodele statice sunt apelate pe clasa în sine, nu pe o instanță specifică a clasei. Acest lucru se datorează faptului că metodele statice NU au acces la variabilele de instanță și nu sunt legate de o anumită instanță a clasei.
Din corpul unei metode statice nu pot fi apelați membri de instanță:


Pot utiliza variabile statice declarate în clasa respectivă:

Deoarece metodele statice nu aparțin unui obiect anumit asupra lor nu putem folosi cuvântul cheie
this:
Orice metodă statică este implicit şi finală.

c) Blocuri de inițializare statice.

Un bloc de inițializare este un bloc de cod definit între { și }, asemănător cu blocuri/corpuri de metode, principala diferență fiind, blocurile de inițializare nu au un nume. Ele sunt ca metodele, însă fără antet/header (tip returnat, nume metoda, lista de parametri). Deoarece în Java nu există cod înafara clasei, blocurile de inițializare vor fi la rândul lor definite în interiorul unei clase.

Blocurile de inițializare statice sunt blocuri de cod care sunt executate DOAR O DATA atunci când clasa este încărcată de Java Virtual Machine. Aceste tipuri de blocuri de inițializare sunt utile pentru inițializarea atributelor statice din clase sau pentru a efectua o singura data un set de prelucrări. Blocurile statice de inițializare pot accesa DOAR atributele statice ale clasei în care sunt definite. NU se pot folosi variabile de instanță în blocuri de inițializare statice. Dacă încercați să faceți acest lucru veți primi o eroare de compilare: non-static variable value cannot be referenced from a static context).
Dacă nu declarați un astfel de bloc, Java colectează toate câmpurile statice într-o singură listă și le inițializează atunci când clasa este încărcată.

Se poate defini atât de multe blocuri de inițializare (statice sau nu) de câte este nevoie, dar trebuie sa se acorde atenție ordinii lor de definire, deoarece aceasta este și ordinea lor de execuție!

d) Clase interne statice (static inner classes). 
O clasă statică internă este o clasă definită în interiorul altei clase, iar aceasta este declarată ca fiind statică. Ea nu are acces la membrii non-statice ai clasei exterioare. 

public class Exemplu {
static class ClasaStaticaIncorporata {
// Codul clasei încorporate statice
}
}

e) Variabile statice finale. 
Sunt de fapt constante. Pentru a fi accesate nu va fi necesar de instanțiat clasa.

f) Importuri statice. 
În Java, puteți importa membrii statici ai unei clase atunci când nu doriți să utilizați numele clasei în mod repetat.