Objektum Orientált Programozás
6. JAVA öröklődés
B IT M A N
30/1
v: 2016.03.16 B IT MAN
Feladatok Órai egyéni feladat (T: kb. 30 perc) Készítsen egy osztályt (Ember), melyben emberek nevét, magasságát és súlyát tudja tárolni. Legyen konstruktora, legyenek az adattagokat kezelő metódusai. Definiálja felül a toString() metódusát, mely így az ember nevét, magasságát, súlyát adja vissza. Készítsen egy metódust (Magasabb), mely két Ember-t kap paraméterül, és visszaadja a magasabb Ember-t. Készítsen egy metódust (Konnyebb), mely kap két súlyt (számadatot), és ha az első kisebb, igaz értéket ad vissza, egyébként hamisat.
Készítsen egy futtatható osztályt (Emberek), melyben beolvassa N darab ember adatait. - Írja ki a legmagasabb ember adatait. - Írja ki a legnehezebb ember adatait.
30/2
B IT M A N
Ember osztály
Ember.java public class Ember { private String nev; private int magassag; private int suly; public Ember(String nev, int magassag, int suly){ this.nev = nev; this.magassag = magassag; this.suly = suly; } public String toString() { return nev + "-" + magassag + "-" + suly; } 30/3
B IT M A N
Ember osztály
Ember.java public int getSuly(){ return suly; } public static Ember Magasabb(Ember a, Ember b){ if (a.magassag > b.magassag) return a; else return b; } public static boolean Konnyebb (int a, int b){ return a < b; } }
30/4
B IT M A N
Emberek osztály
Emberek.java import java.util.Scanner; public class Emberek { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Emberek száma: "); String s1 = sc.nextLine(); int N = Integer.parseInt(s1); Ember[] E = new Ember[N]; String nev, s2; int suly, magassag; for (int i=0; i
B IT M A N
Emberek osztály
Emberek.java magassag = Integer.parseInt(s1); suly = Integer.parseInt(s2); E[i] = new Ember(nev, magassag, suly); } Ember legmagasabb = E[0]; for (int i = 1; i < N; i++) legmagasabb = Ember.Magasabb(E[i],legmagasabb ); System.out.println("A legmagasabb: " + legmagasabb.toString()); Ember legnehezebb = E[0]; for (int i = 1; i < N; i++) if (!Ember.Konnyebb(E[i].getSuly(),legnehezebb.getSuly()))
legnehezebb = E[i]; System.out.println("A legnehezebb: " + legnehezebb.toString()); } } 30/6
B IT M A N
Feladatok 1. Készítsen java nyelvű osztályt (arus.Aru) egy áru modellezésére - legyen név, nettó ár (egész), áfakulcs (egész, százalék) adata - legyen konstruktora, amely mindhárom adata megadásával inicializálja az adatokat - legyen metódusa, amely visszaadja a bruttóárat (egész, kerekítve) - legyen metódusa, amely egy stringbe összefűzve vissza adja a nevet és a bruttó árat. (Definiálja felül az Object osztálybeli toString metódust!) - legyen metódusa, amely paraméterben megadott százalék értékkel növeli a nettó árat. - legyen metódusa, amely 1 ad ha az aru drágább (buttóár), mint egy paraméterben kapott, 0-t ad, ha egyforma árúak, és -1-t ad ha a paraméterben kapott a drágább.
30/7
B IT M A N
arus.Aru osztály, adattagok: név, nettoAr, afaKulcs Konstruktor: 3 értékkel inicializál Metódus: toString() Aru.java package arus; public class Aru { private String nev; private int nettoAr; private int afaKulcs; public Aru(String nev, int nettoAr, int afaKulcs) { this.nev = nev; this.nettoAr = nettoAr; this.afaKulcs = afaKulcs; } @Override public String toString() { return nev + ", bruttó ár: " + bruttoAr(); 30/8}
B IT M A N
Metódus: aratEmel(szazalék) Metódus: hasonlit(másik Aru) Metódus: bruttoAr() Aru.java public void aratEmel(int szazalek) { this.nettoAr += Math.round(this.nettoAr * szazalek/100.0); } public int hasonlit(Aru masik) { int ar = this.bruttoAr(); int masikar = masik.bruttoAr(); if (ar > masikar) return 1; if (masikar > ar) return -1; return 0; } public int bruttoAr() { return (int)Math.round(this.nettoAr * (1 + this.afaKulcs/100.0));
} } 30/9
B IT M A N
Feladatok Készítsen egy arus.Kenyer osztályt, amely az Aru leszármazottja - legyen mennyiség (valós, pl. 0.75) adata - legyen konstruktura, amely négy paraméterben kapott adattal inicializálja az objektumot - legyen felüldefiniálva a String-et visszaadó metódusa úgy, hogy az ősbelihez képest fűzze még hozzá az egységárat (bruttóár/mennyiség). - legyen metódusa, amely visszaadja a mennyiséget. - legyen osztályszintű metódusa, amely igazat ad, ha paraméterként kapott két Kenyer közül az elsőnek nagyobb az egységára.
30/10
B IT M A N
Öröklődés Eclipse-ben
30/11
B IT M A N
Aru arus.Kenyer osztály, adattagok: mennyiség Konstruktor: 4 értékkel inicializál Metódus: toString(), getMennyiség(), elsőNagyobbE(Kenyér A,B)
Kenyer.java package arus; public class Kenyer extends Aru { private double mennyiseg; public Kenyer(String nev, int nettoAr, int afaKulcs, double mennyiseg) { super(nev, nettoAr, afaKulcs); this.mennyiseg = mennyiseg; } @Override public String toString() { return super.toString() + ", egységár: " + egysegAr(); } public double getMennyiseg() { return mennyiseg; } public static boolean elsoNagyobbE(Kenyer a, Kenyer b) { return a.egysegAr() > b.egysegAr(); } private double egysegAr() { return this.bruttoAr()/mennyiseg; } 30/12 }
B IT M A N
Feladatok Készítsen egy arus.futo.AruProba futtatható osztályt, amelyben létrehoz egy Aru és egy Kenyer objektumot tetszőleges adatokkal. Kiírja az adataikat, kiírja a drágábbat. Hozzon létre még egy Kenyer típusú objektumot, de a referenciáját egy Aru típusú változóba tárolja (neve: aru2). Próbálja ki, hogy az "aru2" referenciával, mit ad a String-et visszaadó metódusa, megtudja-e hívni ezzen a referencián keresztül a mennyiséget visszaadó metódusát. Hozzon létre még egy Kenyer példányt (neve: keny2) és az "aru2" referenciával hivatkozott másik Kenyerrel összehasonlítva a nagyobb egységárút kell kiírni (konvertálásra lesz szükség).
30/13
B IT M A N
Osztály importálása Eclipse-ben
Source \ Organize Imports
30/14
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, drágábbik kiírása
Szam.java package arus.futo; import arus.Aru; import arus.Kenyer; public class AruProba { public static void main(String[] args) { Aru aru1 = new Aru("Naptár", 140, 27); System.out.println(aru1.toString()); Kenyer k1 = new Kenyer("Miskolci fehér", 150, 10, 0.75); System.out.println(k1.toString()); System.out.print("A drágább: "); if (aru1.hasonlit(k1) == 1) System.out.println(aru1.toString()); else System.out.println(k1.toString()); } } 30/15
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, drágábbik kiírása
Konzol Naptár, bruttó ár: 178 Miskolci fehér, bruttó ár: 165, egységár: 220.0 A drágább: Naptár, bruttó ár: 178
30/16
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, Kenyér példányosítás Aru referenciával, Kenyér példányosítás, Nagyobb egységárú kenyér kiírása Szam.java package arus.futo; import arus.Aru; import arus.Kenyer; public class AruProba { public static void main(String[] args) { Aru aru1 = new Aru("Naptár", 140, 27); Kenyer k1 = new Kenyer("Miskolci fehér", 150, 10, 0.75); Aru aru2 = new Kenyer("Barna", 180, 10, 0.5); System.out.println(aru2.toString()); //System.out.println(aru2.getMennyiseg()); Kenyer k2 = new Kenyer("Rozsos", 200, 10, 0.5); System.out.println(k2.toString()); } } 30/17
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, Kenyér példányosítás Aru referenciával, Kenyér példányosítás, Nagyobb egységárú kenyér kiírása
Konzol Naptár, bruttó ár: 178 Miskolci fehér, bruttó ár: 165, egységár: 220.0 Barna, bruttó ár: 198, egységár: 396.0 Rozsos, bruttó ár: 220, egységár: 440.0
30/18
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, Kenyér példányosítás Aru referenciával, Kenyér példányosítás, Nagyobb egységárú kenyér kiírása Szam.java package arus.futo; import arus.Aru; import arus.Kenyer; public class AruProba { public static void main(String[] args) { Aru aru1 = new Aru("Naptár", 140, 27); Kenyer k1 = new Kenyer("Miskolci fehér", 150, 10, 0.75); Aru aru2 = new Kenyer("Barna", 180, 10, 0.5); Kenyer k2 = new Kenyer("Rozsos", 200, 10, 0.5); Kenyer nagyobbEaru; if (Kenyer.elsoNagyobbE(k2, (Kenyer)aru2)) nagyobbEaru = k2; else nagyobbEaru = (Kenyer)aru2; System.out.println("A nagyobb egységárú kenyér: " + nagyobbEaru.toString()); } } 30/19
B IT M A N
arus.futo.AruProba osztály, Aru és Kenyér példányosítás, Kenyér példányosítás Aru referenciával, Kenyér példányosítás, Nagyobb egységárú kenyér kiírása
Konzol Naptár, bruttó ár: 178 Miskolci fehér, bruttó ár: 165, egységár: 220.0 Barna, bruttó ár: 198, egységár: 396.0 Rozsos, bruttó ár: 220, egységár: 440.0 A nagyobb egységárú kenyér: Rozsos, bruttó ár: 220, egységár: 440.0
30/20
B IT M A N
Feladatok 2. Készítsen java nyelvű osztályt ujkonyves.KonyvStilussal néven a korábbi konyves.alap.Konyv osztály kiterjesztésére. - legyen még stílus (szöveg) adata - legyen konstruktora, amely minden adatát paraméterben kapott adatokkal inicializálja. - legyen metódusa, amely visszaadja a stílust - legyen metódusa, amely felüldefiniálva a String-et visszadó metódus, úgy hogy az ősbeli Stringhez még fűzze hozzá a stílust is. Készítsen egy futtatható osztályt az ujkonyves.futo csomagba, amelyben beolvas n darab konyvet egy tömbbe és kiírja a legkisebb oldalárút valamint a "Scifi" stílusú könyveket. (A String-ek egyezésének vizsgálatára használja a String osztály következő metódusát: boolean equalsIgnoreCase(String anotherString) Compares this String to another String, ignoring case considerations.) 30/21
B IT M A N
Konyv osztály, konyves.alap csomagba, adattagok: író, cím, oldalszám, ár Alap konstruktor Metódus: toString – könyv adatok Konyv.java package konyves.alap; public class Konyv { private String iro; private String cim; private int oldal; private int ar; public Konyv(String iro, String cim, int oldal, int ar) { this.iro = iro; this.cim = cim; this.oldal = oldal; this.ar = ar; } @Override public String toString() { return "Konyv [iro="+iro+", cim="+cim+", oldal="+ oldal+", ar="+ar+"]"; } 30/22
B IT M A N
Metódus: dragabbE Metódus: oldalAr Metódus: hosszabb Konyv.java public boolean dragabb(Konyv masik) { return this.oldalAr() > masik.oldalAr(); } private double oldalAr() { return (double)this.ar/this.oldal; } public static Konyv hosszabb(Konyv a, Konyv b) { if (a.oldal > b.oldal) return a; return b; } }
30/23
B IT M A N
KonyvStilussal létrehozása Eclipse-ben
30/24
B IT M A N
Konyv ukjonyves.KonyvStilussal osztály, stilus adattag, Alap konstruktor, Metódusok: getStílus(), toString() KonyvStilussal.java package ujkonyves; import konyves.alap.Konyv; public class KonyvStilussal extends Konyv { private String stilus; public KonyvStilussal(String iro, String cim, int oldal, int ar, String stilus) { super(iro, cim, oldal, ar); this.stilus = stilus; } public String getStilus() { return stilus; } @Override public String toString() { return super.toString() + ", Stílusa=" + this.stilus; } } 30/25
B IT M A N
KonyvesProba futtatható osztály a ujkonyves.futo nevű csomagba, Beolvasni N darab könyvet egy tömbbe, Kiírni legkisebb oldalárút, és a Scifi könyveket (equalsIgnoreCase-t használva) KonyvesProba.java package ujkonyves.futo; import ujkonyves.KonyvStilussal; import java.util.Scanner; public class KonyvesProba { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("Könyvek száma: "); String s1 = sc.nextLine(); int N = Integer.parseInt(s1); KonyvStilussal[] K = new KonyvStilussal[N]; String iro, cim, s2, stil; int oldal, ar; 30/26
B IT M A N
KonyvesProba futtatható osztály a ujkonyves.futo nevű csomagba, Beolvasni N darab könyvet egy tömbbe, Kiírni legkisebb oldalárút, és a Scifi könyveket (equalsIgnoreCase-t használva) KonyvesProba.java for (int i=0; i
30/27
B IT M A N
KonyvesProba futtatható osztály a ujkonyves.futo nevű csomagba, Beolvasni N darab könyvet egy tömbbe, Kiírni legkisebb oldalárút, és a Scifi könyveket (equalsIgnoreCase-t használva) KonyvesProba.java KonyvStilussal legolcsobb = K[0]; for (int j = 1; j < N; j++) if (legolcsobb.dragabb(K[j])) legolcsobb = K[j]; System.out.println("A legolcsóbb: "+legolcsobb.toString());
System.out.println("SciFi könyvek: "); for (int j = 0; j < N; j++) if (K[j].getStilus().equalsIgnoreCase("scifi")) System.out.println(K[j].toString()); } }
30/28
B IT M A N
KonyvesProba futtatható osztály a ujkonyves.futo nevű csomagba, Beolvasni N darab könyvet egy tömbbe, Kiírni legkisebb oldalárút, és a Scifi könyveket (equalsIgnoreCase-t használva)
Konzol Könyvek száma: 3 0. könyv írójának neve: aaa 0. könyv címe: aaa 0. könyv oldalszáma: 297 0. könyv ára: 1899 0. könyv stílusa: scifi 1. könyv írójának neve: bbb 1. könyv címe: bbb 1. könyv oldalszáma: 372 1. könyv ára: 1700 1. könyv stílusa: matek 2. könyv írójának neve: ccc 2. könyv címe: ccc 2. könyv oldalszáma: 433 2. könyv ára: 2999 2. könyv stílusa: scifi
30/29
Konzol A legolcsóbb: Konyv [iro=bbb, cim=bbb, oldal=372, ar=1700], Stílusa=matek SciFi könyvek: Konyv [iro=aaa, cim=aaa, oldal=297, ar=1899], Stílusa=scifi Konyv [iro=ccc, cim=ccc, oldal=433, ar=2999], Stílusa=scifi
B IT M A N
VÉGE 30/30
B IT M A N