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.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
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.
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().
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; ..... }
package triedy; public class Student { ..... @Override public String toString() { .... }
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