joi, 26 septembrie 2024

Calcule matematice în Java. Clasa Math

În Java, calculele matematice pot fi realizate ușor și precis folosind clasa Math. Aceasta conține metode și constante utile pentru operații numerice, trigonometrice, logaritmice și exponențiale.
Clasa Math face parte din pachetul java.lang, ceea ce înseamnă că nu trebuie importată. Toate metodele sunt statice, adică se apelează direct cu numele clasei, fără a crea un obiect.

Exemplu

double rezultat = Math.sqrt(25); // returnează 5.0

Clasa Math conține două constante matematice foarte folosite. Acestea sunt:

Math.PI // 3.141592653589793
Math.E  // 2.718281828459045

Metode de bază pentru calcule numerice

MetodăDescriereExempluRezultat
Math.abs(x)Valoarea absolutăMath.abs(-7)7
Math.max(a, b)Valoarea mai mareMath.max(10, 20)20
Math.min(a, b)Valoarea mai micăMath.min(3, 8)3
Math.sqrt(x)Rădăcină pătratăMath.sqrt(16)4
Math.pow(a, b)Ridicare la putereMath.pow(2, 3)8
Math.cbrt(x)Rădăcină cubică dintr-un numărMath.cbrt(27)3

Rotunjiri și conversii

MetodăDescriereExempluRezultat
Math.round(x)Rotunjește la cel mai apropiat întregMath.round(3.6)4
Math.floor(x)Rotunjește în josMath.floor(3.9)3
Math.ceil(x)Rotunjește în susMath.ceil(3.1)4

Funcții trigonometrice și logaritmice

MetodăDescriereExempluRezultat
Math.sin(x)Sinus (radiani)Math.sin(Math.PI / 2)1
Math.cos(x)CosinusMath.cos(0)1
Math.tan(x)TangentăMath.tan(Math.PI / 4)1
Math.log(x)Logaritm natural (baza e)Math.log(Math.E)1
Math.log10(x)Logaritm zecimalMath.log10(100)2

Conversii între grade și radiani:

Math.toRadians(180); // 3.1415... Math.toDegrees(Math.PI); // 180

Generarea numerelor aleatoare

Cu ajutorul clasei în studiu, în Java, putem genera numere aleatoare folosind metoda
Math.random(). Aceasta returnează un număr real între 0.0 (inclusiv) și 1.0 (exclusiv).

Exemple: 
Generare număr aleator între 0 și 1 
double aleator = Math.random(); 
System.out.println("Număr aleator: " + aleator);

Generare număr întreg între 0 și 9:
int numarInt = (int)(Math.random() * 10);
System.out.println("Număr întreg aleator: " + numarInt);


Generare un număr întreg între două valori, de exemplu notate cu min și max: 
int min = 5; 
int max = 15; 
int numarAleator = min + (int)(Math.random() * (max - min + 1)); System.out.println("Număr aleator între " + min + " și " + max + ": " + numarAleator); 

sau
int aleator = (int)(Math.random() * 9) + 5; // min=5 și max=13
System.out.println("Număr aleator între 5...13 " + aleator);
Această metodă este foarte utilă pentru simulări, jocuri sau teste care necesită valori aleatoare.

Exemple practice

1️⃣ Aria și circumferința unui cerc:

double r = 5;
double aria = Math.PI * Math.pow(r, 2);
double circumferinta = 2 * Math.PI * r;
System.out.println("Aria: " + aria);
System.out.println("Circumferința: " + circumferinta);

2️⃣ Distanța dintre două puncte:

double x1 = 2, y1 = 3, x2 = 7, y2 = 9;
double distanta = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
System.out.println("Distanța: " + distanta);

3️⃣ Calcul trigonometric:

double grade = 45;
double rad = Math.toRadians(grade);
System.out.println("Sin(45 grade) = " + Math.sin(rad)); 

Știai că? Constanta Math.PI

PI (π) este raportul dintre circumferința unui cerc și diametrul său. Indiferent de mărimea cercului, acest raport este mereu același: aproximativ 3.14159.

Se utilizează în calcule geometrice și trigonometrice, cum ar fi aria sau lungimea cercului.

PI este un număr irațional – are infinit de multe zecimale care nu se repetă niciodată.

Știai că? Constanta Math.E

E (≈ 2.71828) este cunoscută drept constanta lui Euler și reprezintă baza logaritmului natural.

Se folosește în calcule cu creșteri exponențiale, logaritmi și funcții matematice avansate:

System.out.println(Math.E);       // 2.718281828459045
System.out.println(Math.exp(1));  // e^1 = 2.718281828459045
System.out.println(Math.log(Math.E)); // 1

E apare frecvent în calculele din știință, economie și informatică, unde sunt implicate procese de creștere continuă.

Să aveți o zi deosebită! 
💝

luni, 23 septembrie 2024

Set de probleme pentru exersarea și aplicarea operațiilor pe vectori unidimensionali

  1. Elaborați un program Java care va declara un vector ce va conține elementele 4, 5, 7, 0, 5, 6. Programul va afișa la ecran elementele vectorului.
  2. Elaborați un program care va întreba numele utilizatorului, îl va saluta, îi va cere dimensiunea vectorului și apoi elementele acestuia. Programul să afișeze vectorul introdus.
  3. Elaborați un program Java care va va calcula suma elementelor unui vector.
  4. Elaborați un program Java care va înlocui elementele divizibile la 3 dintr-un vector cu cifra 3.
  5. Se dă un vector de n numere și un număr d. Elaborați un program care va afișa elementele vectorului divizibile la d.
  6. Elaborați un program Java care va afișa numărul de elemente pare dintr-un vector, elementele pare şi pozițiile acestora.
  7. Se dă un vector de 10 numere întregi. Elaborați un program care va afișa pe primul rând numerele pare şi pe al doilea cele impare.
  8. Să se elaboreze un program care va calcula maximul elementelor negative și suma elementelor pozitive ce se conțin într-un vector de dimensiunea n cu elemente numere întregi.
  9. Să se elaboreze un program care va determina elementul maximal și numărul de apariții ale lui într-un tablou liniar de dimensiunea n cu elemente numere reale.
  10. Să se scrie un program care va determina numărul schimbărilor de semn într-un tablou liniar de dimensiunea n cu elemente numere naturale nenule.
  11. Elaborați un program care va citi dimensiunea și elementele unui vector de la tastatură și va afișa media aritmetică a tuturor elementelor vectorului.
  12. Elaborați un program care va citi dimensiunea și elementele unui vector de la tastatură. Programul va număra câte elemente sunt pozitive, negative și egale cu zero.
  13. Elaborați un program care va citi dimensiunea și elementele unui vector de la tastatură. Programul va solicita utilizatorului o valoare de căutat în vector și va afișa dacă aceasta există sau nu. Dacă valoarea este găsită, se va afișa și poziția la care se află.
  14. Elaborați un program care să citească de la tastatură dimensiunea și elementele a doi vectori de aceeași mărime. Programul va calcula suma celor doi vectori element cu element și va stoca rezultatul într-un al treilea vector. La final, se vor afișa pe ecran toate valorile cele trei vectori însoțite de mesaje user-friendly.
  15. Elaborați un program Java care va citi de la tastatură dimensiunea și elementele unui vector. Programul va calcula și afișa două valori, suma elementelor de pe poziții pare și suma elementelor de pe poziții impare.
  16. Elaborați un program Java care va citi de la tastatură dimensiunea și elementele unui vector. Programul va calcula și afișa câte elemente sunt mai mari decât media elementelor din vector.
  17. Elaborați un program Java care să citească de la tastatură dimensiunea și elementele unui vector, precum și două valori care definesc un interval. Programul va afișa toate valorile din vector care se încadrează în acest interval.
  18. Elaborați un program Java care va citi de la tastatură dimensiunea și elementele unui vector. Va afișa vectorul introdus pe o singură linie. După care va cere utilizatorului să aleagă cum dorește să fie vectorul sortat: prin metoda bulelor, prin metoda inserției sau prin metode selecției. În dependență de opțiunea aleasă programul va sorta vectorul introdus de utilizator și va afișa vectorul sortat însoțit de mesaje sugestive.
  19. Elaborați un program Java care va citi de la tastatură dimensiunea și elementele a doi vectori de aceeași dimensiune. Programul va combina vectorii, astfel încât să se obțină un al treilea vector intercalat (elemente alternativ din primul și al doilea vector). De exemplu: dacă avem doi vectori: Vector A: 1, 3, 5 și Vector B: 2, 4, 6 se va afișa Vector C: 1, 2, 3, 4, 5, 6

joi, 12 septembrie 2024

Aplicații AI pentru generare de imagini

  • https://www.recraft.ai/Recraft este o platformă avansată de design asistată de inteligență artificială, destinată profesioniștilor din domeniul graficii. Aceasta oferă o varietate de instrumente pentru generarea și editarea imaginilor, inclusiv: generator de imagini, convertor de imagini AI (convertește imaginile raster în vectori scalabili), generator de imagini vectoriale, ș.a.
  • https://redpandaai.com/tools/ai-image-generator: Permite generarea automată de imagini realiste, artistice sau stilizate cu ajutorul AI, pornind de la un text introdus de utilizator. Nu este necesară crearea unui cont pentru a încerca instrumentul.
  • https://www.fotor.com/images/create/: Platformă online care permite crearea şi editarea de imagini — de la simplă modificare de fotografii la generarea de imagini noi cu ajutorul inteligenţei artificiale. Fotor este potrivit pentru oricine — studenți, profesori, bloggeri, mici afaceri — cu sau fără experiență în editare de imagine. Interfața este simplă, intuitivă și nu necesită cunoștințe avansate.

duminică, 1 septembrie 2024

Cont pe platforma educațională Moodle - creare automată folosind cont Google versus crearea manuală

Avem posibilitatea de a crea un cont pe platforma educațională Moodle prin două modalități:  

  1. creare automată folosind cont Google 
  2. creare manuală folosind o adresă gmail. 
Care este diferența? 

Dacă veți crea contul Moodle automat folosind contul Google aveți în vedere următoarele: 

  • Utilizatorul nu trebuie să completeze un formular de înregistrare complex. În schimb, se poate autentifica direct cu contul său Google.
  • Autentificarea în cont se face folosind datele de autentificare ale contului Google (email și parolă). Moodle utilizează sistemul de autentificare oferit de Google.
  • Utilizatorul nu are nevoie să-și amintească un alt set de  login și parolă anume pentru Moodle.
  • Deoarece autentificarea este gestionată de Google, beneficiază de măsurile de securitate Google (de exemplu, autentificare în doi pași).
  • Datele personale (nume, email) sunt preluate automat din contul Google.
  • Dacă utilizatorul își pierde accesul la contul Google, va pierde și accesul la contul Moodle (în cazul autentificării automate)
Dacă veți crea contul Moodle manual folosind adresa Gmail aveți în vedere următoarele: 

  • Utilizatorul trebuie să completeze un formular de înregistrare pe platforma Moodle, oferind detalii precum nume, email, parolă, etc.
  • Autentificarea se face folosind credențiale create manual (email și parolă specifice Moodle).
  • Utilizatorul trebuie să gestioneze separat parola contului de Moodle, care poate necesita resetare în caz de uitare.
  • Utilizatorul nu este dependent de un cont extern (Google) și poate folosi orice adresă de email pentru crearea contului.
  • Securitatea contului depinde de politica de parole și măsurile de securitate implementate de administratorii Moodle.

Recomand desigur crearea manuală a contului Moodle!

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

luni, 26 august 2024

Operațiile destinate prelucrării tipurilor de date tablou unidimensional

În programarea Java, vectorii (tablourile) sunt utilizați pentru a stoca un număr fix de valori de același tip. Mai jos veți găsi câteva operații importante prezentate cât se poate de simplu, cu algoritm și exemple practice.

1️⃣ Declararea și inițializarea unui vector

Operația: Crearea unui vector și alocarea de valori.
Algoritm:
  1. Se declară vectorul.
  2. Se initializează cu valori.
int[] v = {3, 5, 7, 2, 9};

2️⃣ Citirea elementelor unui vector de la tastatură

Operația: Crearea unui vector și alocarea de valori citite de la tastatură.
Algoritm:
  1. Citește numărul de elemente.
  2. Creează vectorul.
  3. Parcurge și citește fiecare valoare.
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] v = new int[n];
for(int i = 0; i < n; i++){
    v[i] = sc.nextInt();
}

3️⃣ Afișarea elementelor unui vector

Operația: Afișarea tuturor valorilor din vector.
Algoritm:
  1. Parcurge vectorul.
  2. Afișează fiecare element.
for(int i = 0; i < v.length; i++){
    System.out.print(v[i] + " ");
}

4️⃣ Calculul sumei elementelor din vector

Operația: Determinarea sumei tuturor valorilor.
Algoritm:
  1. Inițializează suma cu 0.
  2. Adună succesiv toate elementele.
int suma = 0;
for(int i = 0; i < v.length; i++){
    suma += v[i];
}
System.out.println("Suma = " + suma);

5️⃣ Determinarea valorii maxime

Operația: Găsirea celui mai mare element.
Algoritm:
  1. Se presupune că primul element este maxim.
  2. Se compară toate valorile cu acesta.
int max = v[0];
for(int i = 1; i < v.length; i++){
    if(v[i] > max)
        max = v[i];
}
System.out.println("Maximul = " + max);

6️⃣ Determinarea valorii minime

Operația: Găsirea celui mai mic element.
Algoritm:
  1. Se consideră primul element minim.
  2. Se compară toate valorile cu el.
int min = v[0];
for(int i = 1; i < v.length; i++){
    if(v[i] < min)
        min = v[i];
}
System.out.println("Minimul = " + min);

7️⃣ Căutarea unui element în vector

Operația: Verificarea existenței unei valori.
Algoritm:
  1. Se parcurge vectorul.
  2. Dacă un element coincide cu cel căutat → găsit.
int caut = 7;
boolean gasit = false;
for(int i = 0; i < v.length; i++){
    if(v[i] == caut){
        gasit = true;
        break;
    }
}
if(gasit)
    System.out.println("Elementul a fost găsit.");
else
    System.out.println("Elementul NU există.");

8️⃣ Determinarea mediei elementelor

Operația: Calculul mediei aritmetice.
Algoritm:
  1. Se calculează suma.
  2. Se împarte la numărul elementelor.
int suma = 0;
for(int x : v){
    suma += x;
}
double media = (double)suma / v.length;
System.out.println("Media = " + media);

9️⃣ Sortarea elementelor prin metoda bulelor (Bubble Sort)

Operația: Sortarea vectorului în ordine crescătoare prin compararea elementelor vecine.
Algoritm:
  1. Parcurge vectorul de mai multe ori.
  2. Compară elementele adiacente.
  3. Dacă sunt în ordine greșită, le interschimbă.
  4. Cel mai mare element „urcă” spre final.
for(int i = 0; i < v.length - 1; i++){
    for(int j = 0; j < v.length - 1 - i; j++){
        if(v[j] > v[j + 1]){
            int temp = v[j];
            v[j] = v[j + 1];
            v[j + 1] = temp;
        }
    }
}
System.out.println("Vector sortat cu metoda bulelor:");
for(int x : v)
    System.out.print(x + " ");

🔟 Inversarea elementelor din vector

Operația: Ultimul element devine primul și invers.
Algoritm:
  1. Se folosesc doi indici (stânga și dreapta).
  2. Se interschimbă valorile până la mijloc.
int left = 0, right = v.length - 1;
while(left < right){
    int temp = v[left];
    v[left] = v[right];
    v[right] = temp;
    left++;
    right--;
}

joi, 22 august 2024

Explorează diferența dintre abstract și concret

    Bine venit în această postare unde veți găsi un videoclip educațional, creat de Hodoroja Sorin (aprilie 2024), în care veți descoperi diferențele dintre conceptele de abstract și concret în limbajul Java. 

    Aceste două concepte sunt fundamentale pentru programarea orientată pe obiecte și reprezintă cheia pentru a construi aplicații flexibile și reutilizabile.

    Pe parcursul acestui video, vom explora ce înseamnă o clasă abstractă și cum se diferențiază aceasta de o clasă concretă. Vom înțelege când și de ce să folosim metode abstracte și cum să implementăm aceste concepte în codul nostru Java. 

    Cu ajutorul unor exemple practice, vom clarifica modul în care abstractizarea ne ajută să definim comportamente generale, lăsând detaliile concrete să fie implementate în subclase.

Alăturați-vă pentru a aprofunda aceste noțiuni esențiale și a învăța cum să le aplicați eficient în proiectele voastre Java!




Mulțumim Sorin pentru implicare activă!!!!


Conceptele Static și Non-Static în limbajul Java

În Java, clasele și obiectele sunt elementele de bază ale oricărui program. 
Dar știați că clasele pot avea două tipuri de membri: statice și non-statice? 
Membrii statice aparțin clasei în sine, în timp ce membrii non-statice aparțin instanțelor clasei. 
Această distincție poate părea subtilă, dar are un impact semnificativ asupra modului în care codul dvs. se comportă și se execută.

În acest video, elevul Morari Sandu (martie 2020) explorează lumea conceptelor statice și non-statice în Java!

La sfârșitul acestui tutorial, veți avea o înțelegere solidă a când să utilizați membrii statice și non-statice și cum să scrieți cod Java mai eficient și mai bun. 

Așa că, să începem și să vă ridicăm abilitățile Java la nivelul următor!



Îți mulțumim Sandu pentru acest video util!!!


joi, 15 august 2024

Instrucţiunea repetitivă do-while

În limbajul Java există încă o instrucțiune iterativă, do‑while — asemănătoare cu while, dar cu o diferenţă importantă: corpul buclei se execută cel puţin o dată, indiferent dacă condiţia iniţială este adevărată sau falsă.

Scop:
Se foloseşte atunci când:
  1. vrem să efectuăm cel puţin o dată o acţiune (de ex. afişarea unui meniu, citirea input-ului) şi apoi să continuăm repetarea doar cât timp condiţia este îndeplinită;
  2. condiţia de continuare apare după corpul buclei (post-condiţie).
Sintaxa:
do { 
 // instrucţiuni 
} while (expresie_conditie);


Semantica:
  1. Se execută corpul buclei.
  2. Se verifică expresia_conditie.
  3. Dacă este adevărată, se revine la pasul 1 (se repetă).
  4. Dacă este falsă, bucla se opreşte şi apoi execuţia continuă.

Exemplu

Rezultate


Explicație
Codul solicită utilizatorului un număr pozitiv cel puţin o dată, şi repetă solicitarea dacă numărul este negativ.
Chiar dacă expresia_conditie este falsă de la început (ex. numar este deja pozitiv), corpul se va executa o dată.
Ca şi în cazul instrucțiunii while, trebuie să existe o cale de ieşire — altfel va apărea o buclă infinită.
Evitaţi folosirea condiţiei true fără mecanism de întrerupere.



joi, 4 iulie 2024

Exemplu comparativ. Instrucțiuni iterative Java


Toate cele trei programe determină numărul valorilor pare dintre 1 și n (unde n = 10).

Exemplul1. Utilizarea instrucţiunii for:

public class Ex_for {

public static void main (String [] args){

  int n=10, nr=0;

  for (int i=1; i<=n; i++) if (i%2==0) nr++;

  System.out.println(nr);

}}                              


Exemplul2. Utilizarea instrucţiunii while:

public class Ex_while {

public static void main (String [] args){

  int i = 1, n=10, nr=0;

  while (i<=n){

       if (i%2==0)

       nr++;

       i++;

  }

     System.out.println(nr);}}


Exemplul3. Utilizarea instrucţiunii do ... while:

 public class Ex_do_while {

public static void main (String [] args){

  int i = 1, n=10, nr=0;

  do {

       if (i%2==0)

       nr++;

       i++;}

  while (i<=n);

  System.out.println(nr);

}}



Să aveți o zi deosebită!
💝

miercuri, 3 iulie 2024

Lecție practică Instrucțiunea for


Probleme propuse spre rezolvare

1. Elaborați un program care afișează pe ecran numerele de la 1 la 10, fiecare pe o linie nouă.

2. Elaborați un program care va afișa toate numerele din intervalul [a, b], unde a și b se citesc de la tastatură.

3. Elaborați un program care va afișa pe ecran factorialul unui număr citit de la tastatură.

4. Elaborați un program care va citi de la tastatură n numere, va calcula și afișa suma acestora.

5. Elaborați un program care va citi n numere întregi, va determina și afișa elementul maxim.

6. Elaborați un program care citește un număr n și afișează toate numerele mai mici sau egale cu n care sunt divizibile cu 3, dar nu cu 5.

7. Un profesor dorește să determine dacă un elev a promovat disciplina. El introduce notele elevului obținute pe parcursul semestrului și vrea ca programul să calculeze media aritmetică și să afișeze un mesaj corespunzător. Elaborați un program care:
- Citește de la tastatură un număr n — numărul de note;
- Citește n note (numere reale între 1 și 10);
- Calculează media aritmetică a notelor;
- Folosește instrucțiunea if pentru a afișa:
a. „Elevul a promovat” – dacă media ≥ 5;
b. „Elevul nu a promovat” – dacă media < 5.

8. Un contabil dorește să calculeze salariul total al unui angajat pentru mai multe luni. Dacă salariul lunar depășește 10.000 lei, se acordă un bonus de 10%. Elaborați un program care:
- Citește un număr n – numărul de luni;
- Pentru fiecare lună, citește salariul de bază;
- Dacă salariul > 10.000, aplică un bonus de 10%;
- Afișează salariul total acumulat.

9. Managerul unui magazin vrea să analizeze vânzările dintr-o săptămână. Dacă vânzarea zilnică depășește 5000 lei, se consideră o „zi profitabilă”. Elaborați un program care:
- Se citesc vânzările pentru n zile.
- Se calculează totalul vânzărilor și numărul de zile profitabile.
- Se afișează media zilnică și un mesaj:
a. „Vânzări excelente!” – dacă mai mult de jumătate din zile au fost profitabile;
b. „Necesită îmbunătățiri” – altfel.

10. Un client economisește o sumă într-un cont bancar. Se aplică o dobândă anuală de 5%. Elaborați un program care:
- citește suma inițială S și numărul de ani n.
- pentru fiecare an, se actualizează suma:
- suma = suma + suma*0,05
- Dacă la final suma > 150% din cea inițială, se afișează mesajul „Investiție reușită!”.

11. Utilizatorul efectuează mai multe operații la un ATM. Elaborați un program care va simulat ATM:
- soldul inițial este 1000 lei.
- se citește n – numărul de operații.
- pentru fiecare operație se citește un cod:
1 → Depunere
2 → Retragere
3 → Interogare sold
- switch tratează tipul de operație.
- se actualizează soldul în dependență de acțiunea utilizatorului.
- În cazul în care din soldul nu conține suma care se dorește a fi extrasă utilizatorul să fie anunțat că operațiunea nu poate fi admisă din cauza mijloacelor financiare indisponibile.

Succes! ❤️

Instrucțiunea repetitivă for

În programarea Java, structurile repetitive ne ajută să executăm același set de instrucțiuni de mai multe ori, fără a repeta codul. 
Una dintre cele mai utilizate structuri este instrucțiunea for, datorită clarității și eficienței sale.
  • știm de la început de câte ori vrem să repetăm o acțiune;
  • avem nevoie de un contor (de exemplu, o variabilă care crește sau scade la fiecare pas);
  • vrem să parcurgem o succesiune de valori (indici, numere, caractere etc.).
  • calculul sumei primelor n numere naturale;
  • afișarea unei liste de elemente;
  • generarea de tabele (ex. tabla înmulțirii);
  • prelucrarea datelor într-un vector sau matrice;
  • repetarea unei instrucțiuni de un anumit număr de ori.
Scop:
Se folosește atunci când:
Exemple tipice de aplicare:

Sintaxa:

for (expresie_initializare; expresie_conditie; expresie_iteratie) {

    // instrucțiuni

}

Semantica:

  1. Se execută expresia de inițializare (de obicei, o variabilă contor este inițializată).
  2. Se verifică expresia condiției.
    • Dacă este adevărată (true), se execută instrucțiunile din corpul buclei.
    • Dacă este falsă (false), bucla se oprește.
  3. După execuția corpului buclei, se evaluează expresia de iterație, apoi se revine la pasul 2. 
Exemplu:

Atenție!

Variabilele declarate în zona de inițializare sunt locale buclei for și nu pot fi utilizate în afara acesteia: 


Poți declara mai multe expresii separate prin virgulă: 

Oricare dintre cele trei componente poate fi omisă. Următoarele exemple sunt corecte, dar atenție mare la buclele infinite! În aceste cazuri, este necesar să controlezi ieșirea din buclă cu instrucțiunea break.



Să aveți o zi deosebită!
💝

duminică, 31 martie 2024

Clase interne

 

În Java, este posibil să se declare o clasă în cadrul altei clase. Aceasta fiind numită clasă imbricată (nested classes, clase încuibate). Clasa externă se numește clasă de bază (de acoperire).

Acestea permit gruparea claselor care sunt legate logic și controlul vizibilității uneia din cadrul celorlalte.

Vizibilitatea și domeniul de aplicare al clasei imbricate este delimitată de clasa în care este declarată. Astfel, dacă o clasă B este declarată în cadrul clasei A, înseamnă că existența clasei B depinde de existența clasei A. Clasa imbricată, B, este un membru al clasei A.

Spre deosebire de clasele obișnuite, clasele interne pot fi statice și/sau private. O clasă de acoperire poate avea orice număr de obiecte de tipul claselor imbricate în interiorul ei.

Sintaxa:

public class A_ClasaDeAcoperire{

   class B_ClasaImbricata{

   ...}

...}

Clasele imbricate se folosesc atunci când o clasă are nevoie în implementarea sa de o altă clasă şi nu există motiv pentru care clasa imbricată  se fie folosită de sine stătătoare (nu mai este folosită nicăieri).

La fel ca și câmpurile, metodele, blocurile de inițializare, acestea sunt de două tipuri statice și nestatice care la rândul lor sunt de diverse tipuri.

Clase imbricate statice posedă următoarele caracteristici:

ü  sunt declarate cu ajutorul modificatorului static;

ü  pot fi declarate abstracte sau finale;

ü  pot fi declarate cu orice tip de modificatori (public, protected, private, implicit);

ü  pot defini constructor;

ü  pot defini atât membri statici, cât și de instanță;

ü  nu au acces direct la membrii clasei externe care sunt nestatici, accesul fiind realizat doar prin intermediul obiectelor;

ü  există independent de instanțele clasei exterioare;

ü  pentru a crea un obiect al clasei imbricate statice respectăm sintaxa:

ClasaDeBaza.clasaStatica obStatica  = 

             new ClasaDeBaza.clasaStatica();

 

Exemplul 1:

class DeAcoperire {

  static class ImbricataStatica {

   public void afiseaza() {

     System.out.println("Mesaj din clasa statica");

     }

  }

 public static void main(String args[]) {

 DeAcoperire.ImbricataStatica ob = new DeAcoperire.ImbricataStatica();

 ob.afiseaza();

 }

}

La ecran se va afișa Mesaj din clasa statica

Clase imbricate nestatice posedă următoarele caracteristici:

ü  Se mai numesc interne (non - static nested classes, inner classes).

ü  sunt  declarate fără modificatorul static, au acces direct la membrii clasei externe fără a declara un obiect al clasei externe, chiar dacă aceștia sunt declarați private;

ü  o clasă internă nu este accesibilă direct din exteriorul clasei de bază;

ü  nu pot conţine membri statici în interiorul lor, excepție fiind constanta final static;

ü  pot fi clase de acoperire pentru alte clase;

ü  pot implementa interfețe;

ü  sunt legate de o instanță a clasei exterioare;

ü  sintaxa de instanțiere din exterior a unei clase interne este următoarea:

 

ClasaDeBaza  obClasaBaza = new ClasaDeBaza();

ClasaDeBaza.ClasaInterna obIntern = obClasaBaza.new ClasaInterna();

sau:  DeBaza.InternaNeStatica ob = new DeBaza().new InternaNeStatica();

Exemplul 2:

class ClasaDeAcoperire{

     int num=2;

     static int x=3;

     class ClasaInterna {

      public void print() {

      System.out.println("Aceasta este o clasă internă");

      System.out.println("Pot accesa variabila de instanta num = "+ num);

      System.out.println("Pot accesa variabila de clasa x = "+ x);

      }

}}

class Testare {

     public static void main(String args[]) {

      ClasaDeAcoperire ob = new ClasaDeAcoperire();

      ClasaDeAcoperire.ClasaInterna x = ob.new ClasaInterna();

      x.print();

     }}


Exemplul 3:

class ClasaDeAcoperire{

  ClasaInterna x = new ClasaInterna();

   class ClasaInterna {

   public void print() {

    System.out.println("Aceasta este o clasă internă");

           }

     }}

class Testare {

     public static void main(String args[]) {

           ClasaDeAcoperire ob = new ClasaDeAcoperire();

           ob.x.print();

}}

Deoarece clasa imbricată este un membru al clasei sale exterioare, puteți utiliza notația punct (.) pentru a accesa clasa imbricată și membrii acesteia: ob.x.print();

Clasele interne nestatice sunt de 2 tipuri : locale și anonime.

 

 Clase imbricate nestatice locale posedă următoarele caracteristici:

-  pot fi definite în corp de clasă, corp de metodă sau corp de instrucțiune;

-  sunt vizibile doar în blocul în care au fost implementate, deci pot fi instanțiate doar în blocul dat;

-  nu pot fi private, publice, protected sau static, pot fi finale sau abstracte;

-  nu pot conține în corpul lor câmpuri și metode statice;

-  sunt rar utilizate din cauza codului lizibil pe care îl creează, dar acestea există și pot fi utilizate la dorința programatorului;

-  sunt de trei tipuri:

a)     declarate în direct în corpul unei clase (exemplul de mai sus);

b)    în corpul unui bloc de instrucțiuni;

c)     declarate în corpul unei metode ( nu pot folosi variabilele declarate în metoda respectivă și nici parametri metodei, pentru a le putea accesa acestea trebuie să fie declarate final);

 Exemplul 4:

class ClasaExerna {

private int x = 5;

public void metoda1() {

  class InMetoda{

   public void afisare() {

    x= x+3;

    System.out.println("Valoarea lui x din clasă locală în metodă: " + x);

   }}

  InMetoda obLocal = new InMetoda();

  obLocal.afisare();

}

 public static void main(String[] args) {

  ClasaExerna obj = new ClasaExerna();

  obj.metoda1();

}}

 

Clase imbricate nestatice anonime posedă următoarele caracteristici:

-  sunt clase locale fără nume.

-  nu au constructor.

-  nu pot extinde clase sau implementa interfeţe.

-  extind o altă clasă sau implementează o interfaţă prin instanţierea acesteia cu ajutorul operatorului new().

-  nu pot conţine declaraţii statice.

-  se folosesc efectiv atunci când este nevoie de supradefinirea metodelor pentru un singur  obiect, iar crearea unei clase obişnuite special pentru acesta nu are rost.

-  sunt pe larg utilizate la gestionarea evenimentelor în interfeţe grafice cu utilizatorul în cadrul metodelor de tip listener.

-  se folosesc atunci când avem nevoie de o sigură instanţă pentru o clasă.

-  nu pot fi public, private, protected sau static.

Sintaxa:

NumeClasa_Interfata numeObiect  = new                            NumeClasa_Interfata(){

      //descrierea membrilor clasei anonime

 };

 

Exemplul 5:

class Mesaj {

    public void afiseaza() {

        System.out.println("Mesaj din clasa Mesaj");

    }

}

 

class TestMesaj{

    public static void main(String[] args) {

        Mesaj ob1 = new Mesaj(){

            public void afiseaza(){

                System.out.println("Mesaj din clasa Test");

            }};

        ob1.afiseaza();

        Mesaj ob2 = new Mesaj();

        ob2.afiseaza();

    }}

 

Exemplul 6:

interface MMesaj {

    void afiseaza1();

    void afiseaza2();

}

class TestMMesaj {

    public static void main(String[] args) {

        MMesaj ob1 = new MMesaj() {

         public void afiseaza1() {

         System.out.println("Afiseaza 1 din clasa Test");

          }

          public void afiseaza2() {

            System.out.println("Afiseaza 2 din clasa Test");

            }

          };

        ob1.afiseaza1();

        ob1.afiseaza2();

    }

}


Alegerea tipului de clasă internă depinde de mai mulți factori, cum ar fi:

Diferență

Nestatice

Statice

Anonime

Accesul la membrii clasei exterioare

Au acces la toți membrii clasei exterioare, inclusiv cei privați.

Au acces doar la membrii statici ai clasei exterioare.

Au acces doar la membrii finali ai clasei exterioare.

Vizibilitatea

Pot fi public, private, protected sau default.

Pot fi public, private sau protected.

Nu pot avea modificatori de vizibilitate.

Durata de viață

Sunt legate de o instanță a clasei exterioare.

Există independent de instanțele clasei exterioare.

Există doar în cadrul metodei în care sunt declarate.

Utilizare

Pot fi utilizate pentru a implementa comportamente legate de o instanță specifică a clasei exterioare.

Pot fi utilizate pentru a implementa comportamente legate de clasa exterioară în general.

Pot fi utilizate pentru a implementa comportamente ad-hoc, de unică folosință.

Din punct de vedere al POO, pentru a asigura reutilizare și flexibilitate/extensibilitate trebuie să vă mențineți clasele cât mai specifice. Adică, o clasă trebuie să conțină cod numai pentru lucrurile pe care trebuie să le facă un obiect al acelui tip; orice alt comportament ar trebui să facă parte dintr-o altă clasă mai potrivită pentru acea funcționalitate.

Unul dintre motivele principale pentru utilizarea claselor interioare este capacitatea de a fi o subclasă a oricărei clase, indiferent dacă clasa de bază are o superclasă sau nu. Utilizarea acestor tipuri de clase rămâne la discreția programatorului. 


👌 Analizează și discută!  

Lucrați în pereche cu colegul de bancă. Realizați în caiete diagrama UML al următorului proiect astfel încât să utilizați clase concrete, clase abstracte, interfețe, clase interne.

Proiect. Planificare produsului software Management Parc Auto.

Descriere: Acest proiect are ca scop implementarea unui sistem simplu de management pentru un parc auto.

Funcționalități:

-        Înregistrarea vehiculelor (mașini, camioane, motociclete)

-        Adăugarea de informații detaliate despre vehicule (model, an, kilometraj, etc.)

-        Efectuarea de reparații și revizii

-        Urmărirea costurilor de întreținere

-        Generarea de rapoarte





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