750 likes | 877 Views
16. Objektumok, karakterláncok, csomagolók 17. Osztály készítése. V. Osztályok használata, készítése. 16. Objektumok, karakterláncok, csomagolók 1. A fejezet osztályainak rendszerezése 2. Primitív típus - referenciatípus 3. Objektum létrehozása, deklarálása
E N D
16. Objektumok, karakterláncok, csomagolók 17. Osztály készítése V. Osztályok használata, készítése
16. Objektumok, karakterláncok, csomagolók 1. A fejezet osztályainak rendszerezése 2. Primitív típus - referenciatípus 3. Objektum létrehozása, deklarálása 4. Értékadás az objektumok körében 5. Az objektum élete, automatikus szemétgyűjtés 6. String osztály 7. StringBuffer osztály 8. Objektum átadása paraméterként 9. Primitív típusok csomagolása 10. StringTokenizer osztály V. Osztályok használata, készítése
java.lang Object Boolean Character Number Math System String StringBuffer Short Integer Long Float Double Byte A fejezet osztályainak rendszerezése • Java API: kb. 2000 osztály • A java.lang csomag legfontosabb osztályai:
Az Object osztály • Minden osztály közös őse • Bármely osztályból létrehozott példány “az egy” objektum • A Java minden objektumára jellemző metódusokat tartalmaz. Például: • boolean equals(Object obj) • String toString() • Class getClass()
Az Object osztály leszármazottai • Csomagoló osztályok • Boolean, Character, Byte, Short, Integer, Long, Float, Double • Math osztály • Matematikai konstansok és függvények • System osztály • exit() • in, out objektumok • String, StringBuffer
Primitív típus – referenciatípus Primitív típus • 8 primitív típus: boolean, char, byte, short, int, long, float, double • A változó azonosítójával közvetlenül hivatkozunk a változó memóriahelyére • A deklaráló utasítás végrehajtása: memória foglalás • A programozó nem definiálhat primitív típust
byte eletkor=12; 52145. eletkor 52144. 12 52143. 52142. Memóriacímek Memória Közvetlen (direkt) címzés Itt az adat!
Referenciatípus • Objektumra mutat • A változó azonosítójával az objektum memóriahelyére közvetvehivatkozunk egy referencián (hivatkozáson) keresztül • A hivatkozás rejtve marad (automatikus indirekció)
"Erika",1953 82345. 82345 ember 35284. 35283. 35282. Memóriacímek Memória Közvetett (indirekt) címzés Ember ember = new Ember("Erika",1953); ember objektum címe ember.megy(); Automatikus indirekció!
Például: ember = null; null ember A null referencia • Referencia típusú konstans • Foglalt szó • Értéke: a nulla cím • Nem mutat semmire, nem hivatkozik objektumra
Objektum létrehozása new <OsztályAzonosító>(<aktuális paraméterlista>) • Példányosítás • Memóriafoglalás • Konstruktorhívás (a megfelelő szignatúrájú) Beállítja az objektum kezdeti állapotát • adatok • kapcsolatok • Visszaadja az új objektum referenciáját • A létrehozásnak nem feltétele a deklarálás!
Objektum deklarálása <OsztályAzonosító> objektum; • Az objektum egy referencia típusú változó • Memóriafoglalás: csak a referencia részére • Az objektum létrehozása a programozó feladata <OsztályAzonosító> objektum; objektum=new <OsztályAzonosító>(<aktuális paraméterlista>); <OsztályAzonosító> objektum = new <OsztályAzonosító>(<aktuális paraméterlista>);
new String("Pirkadat") toUpperCase() szöveg: String "Pirkadat" String +String(value: String) +toUpperCase(): String +toString(): String ... Példa: String objektum létrehozása String szoveg; szoveg = new String("Pirkadat"); System.out.println(szoveg.toUpperCase()); // PIRKADAT System.out.println(szoveg); // Pirkadat
Értékadás az objektumok körében String ember1 = new String("Timea"); //1 String ember2 = new String("Roland"); //2 Object obj; String ember3; ember1 = ember2; //3 obj = ember1; //4 // ember1 = obj; Szintaktikai hiba! obj általánosabb! // ember1 = ember3; Szintaktikai hiba! ember3-nak // nincs értéke!
:String //1 ember1 Object ember3 "Timea" //3 :String String //4 ember2 obj //2 "Roland"
Nem azonosakEgyenlok Objektumok egyenlőségvizsgálata String s1 = new String("Hello"), s2 = new String("Hello"); System.out.println((s1==s2)?"Azonosak":"Nem azonosak"); System.out.println((s1.equals(s2))?"Egyenlok":"Nem egyenlok");
ember1 :String :String "Anikó" "Gábor" Az objektum élete,automatikus szemétgyűjtés ember1 = new String("Gábor"); ember1 = new String("Anikó");
0 1 2 3 4 K é s z ! String osztály • Értéke egész élete során állandó • Unikód karakterek sorozata String szoveg=new String("Kész!"); String szoveg="Kész!"; // optimalizáció
String osztály (folyt.) • Konstruktorok • String() • String(value: String) • String(buffer: StringBuffer) • Hossz, index • length(): int • charAt(index: int): char
String osztály (folyt.) • Manipulált karakterláncok • toLowerCase(): String • toUpperCase(): String • toString(): String • trim(): String • replace(oldChar: char, newChar: char): String • substring(beginIndex: int): String • substring(beginIndex: int, endIndex: int): String
String osztály (folyt.) • Egyenlőségvizsgálat, hasonlítás • equals(anObject: Object): boolean • equalsIgnoreCase(anotherString: String): boolean • compareTo(o: Object): int • compareTo(str: String): int • compareToIgnoreCase(str: String): int • Konkatenálás • concat(str: String): String
String osztály (folyt.) • Keresések • indexOf(ch: int): int • indexOf(ch: int, fromIndex: int): int • indexOf(str: String): int • indexOf(str: String, fromIndex: int): int • Karakterláncformák • valueOf(value: Type): String • valueOf(value: type): String • Kivételek • StringIndexOutOfBoundsException • NullPointerException
Feladat – StringTeszt • Kérjünk be terminálról egy szöveget, majd: • 1) Írjuk ki fordítva! • 2) Írjuk ki csupa nagybetűvel, aztán csupa kisbetűvel! • 3) Írjuk ki az első 9 karakterét és az utolsó 3 karakterét! • 4) Cseréljük ki az összes szóközt kötőjelre! import extra.*; public class StringTeszt { public static void main(String[] args) { // következő dián } }
String szoveg = Console.readLine("Szöveg: "); for (int i=szoveg.length()-1; i>=0; i--) //1 System.out.print(szoveg.charAt(i)); System.out.println(); System.out.println(szoveg.toUpperCase()); //2 System.out.println(szoveg.toLowerCase()); if (szoveg.length()>=9) //3 System.out.println(szoveg.substring(0,9)); if (szoveg.length()>=3) System.out.println(szoveg.substring(szoveg.length()-3)); System.out.println(szoveg.replace(' ','-')); //4
StringBuffer osztály Manipulálható szöveg • Konstruktorok • StringBuffer() • StringBuffer(length: int) • StringBuffer(str: String) • Kapacitás, hossz, index • capacity(): int • length(): int • ensureCapacity(minimumCapacity: int) • setLength(newLength: int) • charAt(index: int): char
StringBuffer osztály (folyt.) • Bővítés • append (value: <Type>): StringBuffer • append (value: <type>): StringBuffer • insert (offset: int, value: <Type>): StringBuffer • insert (offset: int, value: <type>): StringBuffer • Törlés • deleteCharAt(index: int): StringBuffer • delete(start: int, end: int): StringBuffer
StringBuffer osztály (folyt.) • Egyéb • setCharAt(index: int, ch: char) • replace(start: int, end: int, str: String): StringBuffer • reverse(): StringBuffer • substring(start: int): String • substring(start: int, end: int): String • toString(): String
//1 //2 hegy1 hegy1 hegy2 //3 hegy1 hegy2 :StringBuffer :StringBuffer :StringBuffer "Machu" "Machu Picchu" "Ez is Machu Picchu" StringBuffer hegy1 = new StringBuffer("Machu"); //1 StringBuffer hegy2 = hegy1.append(" Picchu"); //2 hegy2.insert(0,"Ez is "); //3
Feladat – Csere • Olvassunk be egy szöveget, majd cseréljük ki az összes & jelet az and szóra! import extra.*; public class Csere { public static void main(String[] args) { // következő dián } }
StringBuffer szoveg = new StringBuffer(Console.readLine("Szoveg: ")); //1 int poz = szoveg.toString().indexOf('&'); //2 while (poz!=-1) { szoveg.replace(poz,poz+1,"and"); //3 poz = szoveg.toString().indexOf('&'); //4 } System.out.println(szoveg); //5
Objektum átadása paraméterként • Feladat – Objektum paraméter • Írjunk egy olyan eljárást, amely a paraméterként megkapott szöveget széthúzza, vagyis minden karaktere után beszúr egy szóközt! import extra.*; public class ObjektumParameter { //következő dián }
static void szethuz(StringBuffer str) { for (int i=str.length()-1; i>0; i--) str.insert(i,' '); str = null; // csak demonstrációs célú utasítás } public static void main(String[] args) { StringBuffer sb = new StringBuffer("Peace"); szethuz(sb); System.out.println("*"+sb+"*"); // "*P e a c e*" } Értékadás szerintikompatibilitás! Csak a referencia másolódik át!
A metódusba való belépéskor: A metódusból való kilépés előtt: null str str sb sb :StringBuffer :StringBuffer "Peace" "P e a c e" A metódus csak a mutatott objektumot változtathatja meg, a referenciát nem!
Primitív típusok csomagolása • Célok: • Primitív típusú változók objektumként kezelése • Primitív típusokkal kapcsolatos információk lekérdezése • Minden primitív típushoz tartozik egy csomagoló osztály:Character, Boolean, Byte, Short, Integer, Long, Float, Double • A csomagoló osztályok példányai változtathatatlanok!
Konstruktorok • <Type> (<type> value)Például:Character cObj = new Character('A'); • <Type> (String s)Például:Boolean bObj = new Boolean("True"); Példánymetódusok • String toString()Például:Double dObj = new Double(6099.8);String s = dObj.toString(); //s=="6099.8"
Példánymetódusok (folyt.) • <type> <type>Value()Például:Integer iObj = new Integer(30);int i = iObj.intValue(); // i==30double d = iObj.doubleValue(); // d==30.0 • boolean equals(Object obj)Például:Integer iObj = new Integer(30), jObj = new Integer(30);if (iObj.equals(jObj)) … // trueif (iObj.equals("30")) … // false, más osztály
Statikus metódusok • static <Type> valueOf(String s)Például:Integer iObj, jObj;iObj = Integer.valueOf("30");jObj = Integer.valueOf("45D"); //NumberFormatException! Boolean osztály • static final Boolean TRUE = new Boolean(true); • static final Boolean FALSE = new Boolean(false);
static final char MIN_VALUE = '\u0000';static final char MAX_VALUE = '\uffff'; Character osztály • static boolean isUpperCase(char ch)static boolean isLowerCase(char ch)static boolean isDigit(char ch)static boolean isLetter(char ch)static boolean isSpaceChar(char ch)static boolean isWhitespace(char ch) • static char toUpperCase(char ch)static char toLowerCase(char ch)
Feladat – Milyen karakter? • Kérjünk be karaktereket '-' végjelig! Állapítsuk meg minden egyes karakterről, hogy az szám, betű (azon belül kisbetű vagy nagybetű), szóköz, fehér szóköz vagy egyéb! import extra.*; public class MilyenKarakter { public static void main(String[] args) { //következő dián } }
char kar = Console.readChar("Karakter:"); while (kar != '-') { if (Character.isDigit(kar)) System.out.println("szam"); else if (Character.isLetter(kar)) { if (Character.isUpperCase(kar)) System.out.println("nagybetu"); else System.out.println("kisbetu"); } else if (Character.isSpaceChar(kar)) System.out.println("szokoz"); else if (Character.isWhitespace(kar)) System.out.println("fehér szokoz"); else System.out.println("egyeb"); kar = Console.readChar("Karakter:"); }
static final <type> MIN_VALUE = <a típusnak megfelelő érték>;static final <type> MAX_VALUE = <a típusnak megfelelő érték>;Például:System.out.println(Byte.MIN_VALUE); Numerikus csomagoló osztályok • static <type> parse<Type>(String s)Például:int i = Integer.parseInt("50"); // i==50
17. Osztály készítése 1. OO paradigma - Emlékeztető 2. Első mintaprogram - Raktárprogram 3. Második mintaprogram - Bank és a “Jószerencse” 4. Az osztály felépítése, az osztály deklarációi 5. Osztálytag, példánytag 6. Azonosító, hivatkozási kör, takarás 7. Változók alapértelmezés szerinti kezdeti értékei 8. A this objektumreferencia 9. Konstruktorok 10. Inicializálók V. Osztályok használata, készítése
OO paradigma - Emlékeztető • Példánydeklaráció: példányváltozó, példánymetódus • Osztálydeklaráció: osztályváltozó, osztálymetódus • Objektumok, osztályok sztereotípusai: információhordozó, határ, kontroll, konténer • Objektumdiagram, osztálydiagram, együttműködési diagram • Két osztály közötti egy-egy kapcsolat • Láthatóság: nyilvános (+), védett (#), privát (-)
Osztály feje Az osztály felépítése [<módosítók>] class <OsztályAzon> [extends <OsztályAzon>] [implements <InterfészAzon>[, <InterfészAzon> ... ]] { <osztály blokk (az osztály deklarációi)> } Példák public class JoSzerencse public class Bank public final class String implements java.io.Serializable,Comparable Módosítók • public • abstract • final
Osztály szintű deklaráció Példánytag Konstruktor Osztály- inicializáló blokk Példány- inicializáló blokk Belső osztály Osztálytag Osztályváltozó Példányváltozó Osztálymetódus Példánymetódus Az osztály deklarációi Ajánlott deklarálási sorrend: • változók, kapcsolatok • konstruktorok • metódusok (get/set/main)
A tagok módosítói • Hozzáférési módosítók • public • protected • private • alapértelmezés: csomag • Egyéb módosítók • static • final • abstract (metódus)
Feladat – Raktárprogram • Adott egy zöldségraktár, melyben pillanatnyilag egyetlen árut, paradicsomot raktározunk. A raktárba gyakran teszünk be, illetve veszünk ki onnan paradicsomot. A paradicsom pillanatnyi egységára 300 Ft, de ez változhat. Készítsünk olyan programot, mely segítségével rögzíteni tudjuk a megfelelő adatokat, és bármikor jelentést tudunk adni a paradicsom aktuális mennyiségéről, egységáráról és értékéről! • Végezzük el a következő akciókat: Tegyünk a raktárba 125 kg paradicsomot, aztán vegyünk ki 25 kg-ot, majd szállítsuk le a paradicsom egységárát 210 Ft-ra! Mindhárom akció után írjuk ki, mennyi paradicsom van raktáron és milyen értékben!
3: Aru(aNev,aEgysegar) 5: hozzatesz(aMenny) 6: elvesz(aMenny) 7: setEgysegar(aEgysegar) 1: main(args) 2: RaktarProgram() 4: akciok() RaktarProgram program: RaktarProgram aru:Aru Együttműködési diagram
Aru -nev: String -egysegar: double -menny: double RaktarProgram +Aru(aNev:String,aEgysegar:double) +getNev(): String +getEgysegar(): double +setEgysegar(aEgysegar:double) +getMenny(): double +getAr(): double +hozzatesz(aMenny:double) +elvesz(aMenny:double) +toString(): String -aru +RaktarProgram() +akciok() +main(args) Osztálydiagram
Példányváltozók Konstruktor class Aru { private String nev; private double egysegar; private double menny; public Aru(String aNev, double aEgysegar) { nev = aNev; egysegar = aEgysegar; menny = 0; } public String getNev() { return nev; }