5. Pokrocile OOP
Plan na cvicenie
Pokročilé princípy OOP
Na cvičeni si preštudujte prednášku 4 a prednášku 5Konkretne :
- 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 ? } } |
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" )); } } } } |
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