This shows you the differences between two versions of the page.
poo-ca-cd:laboratoare:agregare-mostenire [2021/09/19 15:15] rares_stefan.epure [Cuvântul cheie super. Întrebuințări] |
poo-ca-cd:laboratoare:agregare-mostenire [2022/10/24 10:40] (current) diana.tatulescu [Exerciții] |
||
---|---|---|---|
Line 31: | Line 31: | ||
<code java> | <code java> | ||
public class Foo { | public class Foo { | ||
- | // Obiectul Bar nu poate exista dacă obiectul Foo nu există | + | // Obiectul de tip Bar nu poate exista dacă obiectul Foo nu există |
private Bar bar = new Bar(); | private Bar bar = new Bar(); | ||
} | } | ||
Line 40: | Line 40: | ||
private Bar bar; | private Bar bar; | ||
| | ||
- | // Obiectul Bar poate continua să existe chiar dacă obiectul Foo nu există | + | // Obiectul de tip Bar poate continua să existe chiar dacă obiectul Foo nu există |
Foo(Bar bar) { | Foo(Bar bar) { | ||
this.bar = bar; | this.bar = bar; | ||
Line 141: | Line 141: | ||
// Obiectele Wind sunt instrumente | // Obiectele Wind sunt instrumente | ||
- | // deoarece au aceeași interfață: | + | // deoarece au ca si clasa-parinte clasa Instrument |
public class Wind extends Instrument { | public class Wind extends Instrument { | ||
public static void main(String[] args) { | public static void main(String[] args) { | ||
Line 183: | Line 183: | ||
} | } | ||
- | class Test { | + | public class Test { |
public static void main(String[] args) { | public static void main(String[] args) { | ||
- | Animal a [] = new Animal[2]; | + | Animal[] animals = new Animal[2]; |
- | + | ||
- | a[0] = new Wolf(); // Upcasting automat | + | |
- | a[1] = new Snake(); // Upcasting automat | + | |
- | for (int i = 0; i < a.length; i++) { | + | animals[0] = new Wolf(); // Upcasting automat |
- | a[i].eat(); // 1 | + | animals[1] = new Snake(); // Upcasting automat |
- | + | ||
- | if (a[i] instanceof Wolf) { | + | for (int i = 0; i < animals.length; i++) { |
- | ((Wolf)a[i]).howl(); // 2 | + | animals[i].eat(); // 1 |
+ | |||
+ | if (animals[i] instanceof Wolf) { | ||
+ | ((Wolf)animals[i]).howl(); // 2 | ||
} | } | ||
- | | + | |
- | if (a[i] instanceof Snake) { | + | if (animals[i] instanceof Snake) { |
- | ((Snake)a[i]).bite(); // 3 | + | ((Snake)animals[i]).bite(); // 3 |
} | } | ||
} | } | ||
} | } | ||
- | } | + | } |
</code> | </code> | ||
Line 526: | Line 526: | ||
<note important>Chiar dacă nu se specifică apelul metodei ''super()'', compilatorul va apela automat constructor-ul implicit al părintelui însă dacă se dorește apelarea altui constructor, apelul de ''super(args)'' respectiv este obligatoriu</note> | <note important>Chiar dacă nu se specifică apelul metodei ''super()'', compilatorul va apela automat constructor-ul implicit al părintelui însă dacă se dorește apelarea altui constructor, apelul de ''super(args)'' respectiv este obligatoriu</note> | ||
- | ====Utilizarea ArrayList. Example==== | + | ====Utilizarea clasei ArrayList. Exemple==== |
+ | |||
+ | Clasa ArrayList este un array redimensionabil, iar această clasă poate fi găsită în pachetul ''java.util''. | ||
+ | Principalele metode ale acestei clase sunt: | ||
+ | * ''add()'' - adaugă un element la ArrayList. | ||
+ | * ''get()'' - accesează elementul de pe o anumită poziție din ArrayList. | ||
+ | * ''size()'' - returnează numărul de elemente din ArrayList. | ||
+ | * ''set()'' - modifica un element de pe o anumită poziție din ArrayList. | ||
+ | * ''remove()'' - șterge un element de pe o anumită poziție din ArrayList. | ||
+ | * ''clear()'' - șterge toate elementele din ArrayList. | ||
+ | |||
+ | Pentru a putea parcurge elementele unui ArrayList se poate folosit atât un for-each, cât și clasa Iterator. | ||
+ | Un exemplu de utilizare a metodelor clasei ArrayList și de parcurgere a elementelor stocate de această clasă este următorul: | ||
+ | |||
+ | <code java5> | ||
+ | import java.util.ArrayList; | ||
+ | import java.util.Iterator; | ||
+ | |||
+ | public class Main { | ||
+ | public static void main(String[] args) { | ||
+ | |||
+ | ArrayList<String> animals = new ArrayList<>(); | ||
+ | animals.add("Dog"); | ||
+ | animals.add("Cat"); | ||
+ | animals.add("Sheep"); | ||
+ | |||
+ | System.out.println("First animal from the list is: " + animals.get(0)); | ||
+ | System.out.println("Number of animals from the list: " + animals.size()); | ||
+ | |||
+ | animals.set(0, "Lion"); | ||
+ | System.out.println("First animal from the list is: " + animals.get(0)); | ||
+ | |||
+ | animals.remove(0); | ||
+ | |||
+ | for (String animal : animals) { | ||
+ | System.out.println(animal); | ||
+ | } | ||
+ | |||
+ | Iterator iterator = animals.iterator(); | ||
+ | while(iterator.hasNext()) { | ||
+ | System.out.println(iterator.next()); | ||
+ | } | ||
+ | |||
+ | animals.clear(); | ||
+ | } | ||
+ | } | ||
+ | </code> | ||
| | ||
====Summary==== | ====Summary==== | ||
Line 555: | Line 601: | ||
====Exerciții==== | ====Exerciții==== | ||
+ | |||
+ | <note important> | ||
+ | Veti încărca soluția voastră pe LambdaChecker, contest [[https://beta.lambdachecker.io/contest/11 | POO - LAB3]]. | ||
+ | |||
+ | Încercați să accesați de aici contest-ul, altfel e posibil să vă ceară o parolă care nu există. De asemena, să fiți logați pe LambdaChecker înainte de accesa link-ul. m( | ||
+ | </note> | ||
+ | Pentru acest laborator este de recomandat să creați un pachet numit ''lab3'', unde veți face subpachete pentru task-uri. | ||
Gigel vrea să-i facă mamei sale un cadou de ziua ei și știe că-i plac foarte mult bomboanele. El are nevoie de ajutorul vostru pentru a construi cel mai frumos și gustos cadou: | Gigel vrea să-i facă mamei sale un cadou de ziua ei și știe că-i plac foarte mult bomboanele. El are nevoie de ajutorul vostru pentru a construi cel mai frumos și gustos cadou: | ||
Line 560: | Line 613: | ||
**Task 1** [2p] | **Task 1** [2p] | ||
- | Veți proiecta o clasă ''CandyBox'', care va conține câmpurile private ''flavor'' (String) și ''origin'' (String). Clasa va avea, de asemenea: | + | Veți proiecta o clasă CandyBox, care va conține câmpurile private flavor (String) și origin (String). |
- | * un constructor fără parametri | + | |
- | * un constructor ce va inițializa toate câmpurile | + | |
- | * o metodă de tip float ''getVolume()'', care va întoarce valoarea 0; | + | Clasa va avea, de asemenea: |
- | * Întrucât clasa ''Object'' se află în rădăcina arborelui de moștenire pentru orice clasă, orice instanță va avea acces la o serie de facilități oferite de Object. Una dintre ele este metoda ''toString()'', al cărei scop este de a oferi o reprezentare unei instanțe sub forma unui șir de caractere, utilizată în momentul apelului System.out.println(). Adăugați o metodă ''toString()'', care va returna flavor-ul și regiunea de proveniență a cutiei de bomboane. | + | * un constructor fără parametri ce va inițializa câmpurile cu "sugar-free", respectiv "Switzerland" |
+ | * un constructor cu parametri | ||
+ | * o metodă de tip float getVolume(), care va întoarce valoarea 0; | ||
+ | * o metodă toString(), care va returna flavor-ul și regiunea de proveniență a cutiei de bomboane ("The [flavor] [origin] chocolate"). | ||
**Task 2** [2p] | **Task 2** [2p] | ||
- | Din ea derivați clasele ''Lindt'', ''Baravelli'', ''ChocAmor''. Pentru un design interesant, cutiile vor avea forme diferite: | + | Din clasa CandyBox derivați clasele Lindt, Baravelli, ChocAmor. |
- | * //Lindt// va conține ''length'', ''width'', ''height'' (float); | + | |
- | * //Baravelli// va fi un cilindru. Acesta va conține un câmp ''radius'' și unul ''height'' (float); | + | Pentru un design interesant, cutiile vor avea forme diferite: |
- | * //ChocAmor//, fiind un cub, va conține un camp ''length'' (float); | + | * Lindt va conține length, width, height (float); |
+ | * Baravelli va fi un cilindru. Acesta va conține un câmp radius și unul height (float); | ||
+ | * ChocAmor, fiind un cub, va conține un camp length (float). | ||
Clasele vor avea: | Clasele vor avea: | ||
- | * constructori fără parametri | + | * constructori fără parametri ce vor initializa cu 0.0 campurile float; |
- | * constructori care permit inițializarea membrilor. Identificați o modalitate de reutilizare a codului existent. Pentru fiecare tip de cutie veți inițializa, în constructor, câmpurile ''flavor'' și ''origin'' cu tipul corespunzător | + | * constructori cu parametri (Identificați o modalitate de reutilizare a codului existent. Pentru fiecare tip de cutie veți inițializa, în constructor, câmpurile flavor și origin cu tipul corespunzător); |
- | * Suprascrieți metoda //getVolume()// pentru a întoarce volumul specific fiecărei cutii de bomboane, în funcție de tipul său. | + | * Suprascrieți metoda getVolume() pentru a întoarce volumul specific fiecărei cutii de bomboane, în funcție de tipul său; |
- | * Suprascrieți metoda //toString()// în clasele derivate, astfel încât aceasta să utilizeze implementarea metodei toString() din clasa de bază. Returnați un mesaj de forma //"The " + origin + " " + flavor + " has volume " + volume//; | + | * Suprascrieți metoda toString() în clasele derivate, astfel încât aceasta să utilizeze implementarea metodei toString() din clasa de bază. Returnați un mesaj de forma "Lindt/Baravelli/Chocamor (*in functie de clasa de care apartine metoda): The [origin] [flavor] chocolate has volume [volume]". |
**Task 3** [1p] | **Task 3** [1p] | ||
- | Adăugați o metodă ''equals()'' în clasa ''CandyBox''. Justificați criteriul de echivalentă ales. Vedeți metodele clasei [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Object.html | Object]], moștenită de toate clasele - Object are metoda equals, a cărei implementare verifică echivalența obiectelor comparând referințele. Creați obiecte de tip Lindt și testați egalitatea lor. | + | Adăugați o metodă equals() în clasa CandyBox. |
+ | |||
+ | Justificați criteriul de echivalentă ales. | ||
+ | |||
+ | Creați obiecte de tip Lindt și testați egalitatea lor. | ||
<note important>**Hint:** | <note important>**Hint:** | ||
Puteți genera automat metoda, cu ajutorul IDE. Selectați câmpurile considerate și | Puteți genera automat metoda, cu ajutorul IDE. Selectați câmpurile considerate și | ||
Line 589: | Line 651: | ||
**Task 4** - //''Upcasting''// [2p] | **Task 4** - //''Upcasting''// [2p] | ||
- | Acum că am stabilit tipul cutiilor de bomboane, putem construi cadoul, rămânând la latitudinea vostră care va fi designul lui. În pachetul java.util se găsește clasa ''ArrayList'', care definește un resizable array, cu metodele specifice (add, size, get, lista lor completa este în [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/ArrayList.html|documentatie]]). Creați o clasă ''CandyBag'', care va conține un ArrayList cu mai multe cutii din fiecare tip. | + | Acum că am stabilit tipul cutiilor de bomboane, putem construi un cadou default care va contine in aceasta ordine: |
+ | * 3 cutii Lindt: Austria cherry, Austria apricot , Austria strawberry, toate cu dimensiunile length 20, width 5.4, height 19.2 | ||
+ | * o cutie Baravelli: Italy grape, radius 6.7, height 8.7 | ||
+ | * 2 cutii ChocAmor: France coffee, France vanilla, ambele cu length 5.5 | ||
+ | |||
+ | Creați o clasă CandyBag, care va conține un ArrayList populat cu lista de mai sus. | ||
+ | |||
+ | |||
+ | În pachetul java.util se găsește clasa ''ArrayList'', care definește un resizable array, cu metodele specifice (add, size, get, lista lor completa este în [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/ArrayList.html|documentatie]]). Creați o clasă ''CandyBag'', care va conține un ArrayList cu mai multe cutii din fiecare tip. | ||
**Task 5** - //''Downcasting''// [1p] | **Task 5** - //''Downcasting''// [1p] | ||
- | Adăugați clasei ''Baravelli'', funcția ''printBaravelliDim()'', care va afișa dimensiunile razei și înălțimii. În mod analog, procedați cu celelalte tipuri de cutii, adaugând metodele ''printChocAmorDim()'' și ''printLindtDim()'', în care să afișați dimensiunile fiecărei cutii. | + | Adăugați clasei Baravelli, funcția printBaravelliDim(), care va afișa dimensiunile razei și înălțimii. În mod analog, procedați cu celelalte tipuri de cutii, adaugând metodele printChocAmorDim() și printLindtDim(), în care să afișați dimensiunile fiecărei cutii. |
**Task 6** - //''Agregare''// [2p] | **Task 6** - //''Agregare''// [2p] | ||
- | Gigel va vrea sa trimită prin curier cadoul, pentru a nu-l găsi mama lui mai devreme. Ajutați-l să determine locația, creând clasa "Area", care va conține un obiect de tip ''CandyBag'', un câmp "number" (int) și un câmp "street" (String) | + | Gigel va vrea sa trimită prin curier cadoul, pentru a nu-l găsi mama lui mai devreme. Ajutați-l să determine locația, creând clasa “Area”, care va conține un obiect de tip CandyBag, un câmp “number” (int), un câmp “street” (String) si un camp "message" (String). |
Clasa va avea, de asemenea: | Clasa va avea, de asemenea: | ||
- | * un constructor fără parametri | + | * un constructor fără parametri ce va initializa campurile cu 0, respectiv "nowhere"; |
- | * un constructor ce va inițializa toate câmpurile | + | * un constructor cu parametri. |
- | * Acum ca am finalizat construcția, îi vom oferi mamei informații despre cadoul ei printr-o felicitare. Creați o metoda ''getBirthdayCard()'', care va afișa, pe primul rand, adresa completă, iar apoi un mesaj de ''la multi ani''. | + | |
- | * Tot aici, parcurgeți array-ul, apelând metoda ''toString()'' pentru elementele sale. | + | Acum ca am finalizat construcția, îi vom oferi mamei informații despre cadoul ei printr-o felicitare: |
- | * Parcurgeți array-ul și, folosind downcasting la clasa corespunzătoare, apelați metodele specifice fiecărei clase. Pentru a stabili tipul obiectului curent folosiți operatorul ''instanceof'' | + | * Creați o metoda getBirthdayCard(), care va afișa, pe primul rand, adresa completă, iar apoi un mesaj de la multi ani. |
- | * În final, modificați cum considerați programul anterior astfel încât să nu mai aveți nevoie de instanceof. | + | * Tot aici, parcurgeți array-ul, apelând metoda toString() pentru elementele sale. |
+ | |||
+ | Parcurgeți array-ul și, folosind downcasting la clasa corespunzătoare, apelați metodele specifice fiecărei clase. | ||
+ | |||
+ | Pentru a stabili tipul obiectului curent folosiți operatorul **instanceof**. | ||
+ | |||
+ | <note important> | ||
+ | În final, modificați cum considerați programul anterior astfel încât să nu mai aveți nevoie de instanceof (getBirtdayCardv2() method).</note> | ||
==== Resurse ==== | ==== Resurse ==== |