Plan na cvicenie

Pokročilé princípy OOP

Na cvičeni si preštudujte prednášku 4 a prednášku 5
Konkretne :
  • dedenie (extends),
  • abstraktna trieda,
  • špecializácia a generalizácia,
  • viac-úrovňové dedenie
  • polymorfizmus
  • volanie rodičovského konštruktora (śuper())
  • metódy equals() a toString()

Uloha 1

Hlavna.java

Použijeme príklad z minulého cvičenia.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package main;
 
public class Hlavna {
     public static void main(String[] args) {
         System.out.println("Populacia : "+ Clovek.populacia);
         ArrayList<Clovek> ludia = new ArrayList<Clovek>();
          
         Clovek cviciaci = new Clovek("Maroš","Čavojský");
         ludia.add(cviciaci);
         Clovek studentka = new Clovek("Barbora","Krásna");
         ludia.add(studentka)
         Clovek student = new Clovek("Patrik","Športový");
         ludia.add(student);
         System.out.println("Populacia : "+ Clovek.populacia);
          
         for (Clovek c : ludia){
             System.out.println("Meno : " + c.getCeleMeno());
         }
          
     }
 }

Clovek.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package triedy;
public class Clovek {
     public static int populacia = 0;
     private String meno;
     protected String priezvisko;
      
     public Clovek(String meno, String priezvisko){
         this.meno = meno;
         this.priezvisko = priezvisko;
         populacia++;
     }
      
     public String getMeno(){ return this.meno; }
     public String getPriezvisko() {return this.priezvisko; }
     public String getCeleMeno(){ return this.meno + " " + this.priezvisko; }
      
     public void setMeno(String meno){ this.meno = meno; }
     public void setPriezvisko(String priezvisko) { this.priezvisko = priezvisko; }         
      
     public static String zistiZivost(){ return "Žive"; }
 }

Uloha 2

Využite dedičnosť pri vytváraní ľudí. Triedu Clovek zmente na abstraktnu a vytvorte dve triedy Cviciaci a Student, ktoré budú od nej dediť. V tychto dedených triedach použite rodičovský konštruktor. V maine použite 1x triedu Cviciaci a 2x triedu Student. Vytvorené inštancie obdobným spôsobom vložte do kolekcie. Následne použite zdedené metódy na výpis celého mena v cykle for.

Uloha 3

Použitie polymorfizmu. Preťažte metódu getCeleMeno(), tak aby pred celym menom vracala buď "Cvičiaci" alebo "Študent" v závislosti od toho inštancie triedy.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package triedy;
public class Student extends Clovek {
      
     ....
      
     @Override
     public String getCeleMeno() {
         //return "Študent "+ getCeleMeno(); // je implementácia na tomto riadku správna ? prečo ?
         //return "Študent "+ meno + " " + priezvisko; // je implementácia na tomto riadku správna ? prečo ?
         //return "Študent "+ getMeno()  + " " + priezvisko; // je implementácia na tomto riadku správna ? prečo ?
         //return "Študent "+ meno  + " " + getPriezvisko(); // je implementácia na tomto riadku správna ? prečo ?          
     }
}   
Ukážkový výstup
Populacia : 0
Populacia : 3
Meno : Cvičiaci Maroš Čavojský
Meno : Študent Barbora Krásna
Meno : Študent Patrik Športový

Uloha 4

Použitie equals(), hashCode() a toString(). Preťažte metódy equals(), hashCode() v triede Clovek a toString() v zdedených triedach. Dva objekty Clovek sú zhodné ak majú zhodné meno aj priezvisko. Metódu toString() implementujte, tak aby ju bolo možné použiť namiesto celeMeno().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package triedy;
public abstract class Clovek {
      
     ....
      
     @Override
     public int hashCode() {
         ....
         //return hash;
     }
 
     @Override
     public boolean equals(Object obj) {
         if (obj == null) {
             return false;
         }
         if ((obj instanceof Clovek) == false){
            return false;
         }
         final Clovek other = (Clovek) obj;
 
         .....
    }   
1
2
3
4
5
6
7
package triedy;
public class Student {
     .....
     @Override
     public String toString() {
         ....
     }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main;
 
public class Hlavna {
    public static void main(String[] args) {
        ArrayList<Clovek> ludia = new ArrayList<Clovek>();
         
        Clovek cviciaci = new Cviciaci("Maroš","Čavojský");
        ludia.add(cviciaci);
        Clovek studentka = new Student("Barbora","Krásna");
        ludia.add(studentka)
        Clovek student = new Student("Patrik","Športový");
        ludia.add(student);
        Clovek cviciaca = new Cviciaci("Barbora","Krásna");
        ludia.add(cviciaca);
         
         for (Clovek c1 : ludia) {
            for (Clovek c2 : ludia) {
                System.out.println(c1.toString() + " a " + c2.toString() + " : ZHODA "  + (c1.equals(c2) ? "Ano" : "Nie"));
            }
        }
         
         
    }
}
Ukážkový výstup
	
Cvičiaci Maroš Čavojský a Cvičiaci Maroš Čavojský : ZHODA Ano
Cvičiaci Maroš Čavojský a Študent Barbora Krásna : ZHODA Nie
Cvičiaci Maroš Čavojský a Študent Patrik Športový : ZHODA Nie
Cvičiaci Maroš Čavojský a Cvičiaci Barbora Krásna : ZHODA Nie

Študent Barbora Krásna a Cvičiaci Maroš Čavojský : ZHODA Nie
Študent Barbora Krásna a Študent Barbora Krásna : ZHODA Ano
Študent Barbora Krásna a Študent Patrik Športový : ZHODA Nie
Študent Barbora Krásna a Cvičiaci Barbora Krásna : ZHODA Ano

Študent Patrik Športový a Cvičiaci Maroš Čavojský : ZHODA Nie
Študent Patrik Športový a Študent Barbora Krásna : ZHODA Nie
Študent Patrik Športový a Študent Patrik Športový : ZHODA Ano
Študent Patrik Športový a Cvičiaci Barbora Krásna : ZHODA Nie

Cvičiaci Barbora Krásna a Cvičiaci Maroš Čavojský : ZHODA Nie
Cvičiaci Barbora Krásna a Študent Barbora Krásna : ZHODA Ano
Cvičiaci Barbora Krásna a Študent Patrik Športový : ZHODA Nie
Cvičiaci Barbora Krásna a Cvičiaci Barbora Krásna : ZHODA Ano