5Osztalyok_Java
Download
Report
Transcript 5Osztalyok_Java
16. Objektumok, karakterláncok,
csomagolók
17. Osztály készítése
Java - V. / 1
16. Objektumok, karakterláncok,
csomagolók
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
A fejezet osztályainak rendszerezése
Primitív típus - referenciatípus
Objektum létrehozása, deklarálása
Értékadás az objektumok körében
Az objektum élete, automatikus szemétgyűjtés
String osztály
StringBuffer osztály
Objektum átadása paraméterként
Primitív típusok csomagolása
StringTokenizer osztály
Java - V. / 2
A fejezet osztályainak rendszerezése
Java API: kb. 2000 osztály
A java.lang csomag legfontosabb osztályai:
java.lang
Object
Boolean Character Number Math System String StringBuffer
Byte Short Integer Long Float Double
Java - V. / 3
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()
Java - V. / 4
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
Java - V. / 5
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
Java - V. / 6
Közvetlen (direkt) címzés
byte eletkor=12;
52145.
eletkor 52144.
12
Itt az adat!
52143.
52142.
Memóriacímek
Memória
Java - V. / 7
Referenciatípus
Objektumra mutat
A változó azonosítójával az objektum
memóriahelyére közvetve hivatkozunk egy
referencián (hivatkozáson) keresztül
A hivatkozás rejtve marad (automatikus
indirekció)
Java - V. / 8
Közvetett (indirekt) címzés
Ember ember = new Ember("Erika",1953);
"Erika",1953
82345.
ember objektum címe
ember 35284.
82345
35283.
ember.megy();
Automatikus indirekció!
35282.
Memóriacímek
Memória
Java - V. / 9
A null referencia
Referencia típusú konstans
Foglalt szó
Értéke: a nulla cím
Nem mutat semmire, nem hivatkozik objektumra
Például:
ember = null;
ember
null
Java - V. / 10
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!
Java - V. / 11
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>);
Java - V. / 12
Példa: String objektum létrehozása
String
+String(value: String)
+toUpperCase(): String
+toString(): String
...
szöveg: String new String("Pirkadat")
"Pirkadat"
toUpperCase()
String szoveg;
szoveg = new String("Pirkadat");
System.out.println(szoveg.toUpperCase()); // PIRKADAT
System.out.println(szoveg);
// Pirkadat
Java - V. / 13
Értékadás az objektumok körében
String ember1 = new String("Timea");
String ember2 = new String("Roland");
Object obj;
String ember3;
ember1 = ember2;
obj = ember1;
// ember1 = obj; Szintaktikai hiba! obj általánosabb!
// ember1 = ember3; Szintaktikai hiba! ember3-nak
// nincs értéke!
//1
//2
//3
//4
Java - V. / 14
Object
ember1
//1
:String
ember3
"Timea"
//3
String
ember2
:String
//2
//4
obj
"Roland"
Java - V. / 15
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");
Nem azonosak
Egyenlok
Java - V. / 16
Az objektum élete,
automatikus szemétgyűjtés
ember1 = new String("Gábor");
ember1 = new String("Anikó");
:String
ember1
"Gábor"
:String
"Anikó"
Java - V. / 17
String osztály
0
1
2
3
4
K
é
s
z
!
Értéke egész élete során állandó
Unikód karakterek sorozata
String szoveg=new String(”Kész!");
String szoveg=”Kész!";
// optimalizáció
Java - V. / 18
String osztály (folyt.)
Konstruktorok
• String()
• String(value: String)
• String(buffer: StringBuffer)
Hossz, index
• length(): int
• charAt(index: int): char
Java - V. / 19
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
Java - V. / 20
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
Java - V. / 21
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
Java - V. / 22
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
}
}
Java - V. / 23
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
Java - V. / 24
StringBuffer osztály
Konstruktorok
• StringBuffer()
• StringBuffer(length: int)
• StringBuffer(str: String)
Manipulálható szöveg
Kapacitás, hossz, index
•
•
•
•
•
capacity(): int
length(): int
ensureCapacity(minimumCapacity: int)
setLength(newLength: int)
charAt(index: int): char
Java - V. / 25
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
Java - V. / 26
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
Java - V. / 27
StringBuffer hegy1 = new StringBuffer("Machu");
StringBuffer hegy2 = hegy1.append(" Picchu");
hegy2.insert(0,"Ez is ");
//1
hegy1
:StringBuffer
"Machu"
hegy1
hegy2
hegy1
hegy2
//1
//2
//3
//2
:StringBuffer
"Machu Picchu"
//3
:StringBuffer
"Ez is Machu Picchu"
Java - V. / 28
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
}
}
Java - V. / 29
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
Java - V. / 30
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
}
Java - V. / 31
static void szethuz(StringBuffer str) {
for (int i=str.length()-1; i>0; i--)
Értékadás szerinti
kompatibilitás!
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);
Csak a referencia másolódik át!
System.out.println("*"+sb+"*");
// "*P e a c e*"
}
Java - V. / 32
A metódusba való
belépéskor:
A metódusból való kilépés
előtt:
null
str
sb
:StringBuffer
"Peace"
str
sb
:StringBuffer
"P e a c e"
A metódus csak a mutatott objektumot
változtathatja meg, a referenciát nem!
Java - V. / 33
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!
Java - V. / 34
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”
Java - V. / 35
Példánymetódusok (folyt.)
<type> <type>Value()
Például:
Integer iObj = new Integer(30);
int i = iObj.intValue();
double d = iObj.doubleValue();
// i==30
// d==30.0
boolean equals(Object obj)
Például:
Integer iObj = new Integer(30), jObj = new Integer(30);
if (iObj.equals(jObj)) … // true
if (iObj.equals("30")) … // false, más osztály
Java - V. / 36
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);
Java - V. / 37
Character osztály
static final char MIN_VALUE = '\u0000';
static final char MAX_VALUE = '\uffff';
static
static
static
static
static
static
boolean
boolean
boolean
boolean
boolean
boolean
isUpperCase(char ch)
isLowerCase(char ch)
isDigit(char ch)
isLetter(char ch)
isSpaceChar(char ch)
isWhitespace(char ch)
static char toUpperCase(char ch)
static char toLowerCase(char ch)
Java - V. / 38
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
}
}
Java - V. / 39
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:");
}
Java - V. / 40
Numerikus csomagoló osztályok
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);
static <type> parse<Type>(String s)
Például:
int i = Integer.parseInt("50");
// i==50
Java - V. / 41
17. Osztály készítése
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
OO paradigma - Emlékeztető
Első mintaprogram - Raktárprogram
Második mintaprogram - Bank és a “Jószerencse”
Az osztály felépítése, az osztály deklarációi
Osztálytag, példánytag
Azonosító, hivatkozási kör, takarás
Változók alapértelmezés szerinti kezdeti értékei
A this objektumreferencia
Konstruktorok
Inicializálók
Java - V. / 46
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 (-)
Java - V. / 47
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)> Osztály feje
}
Példák
public class JoSzerencse
Módosítók
• public
public class Bank
• abstract
public final class String implements
• final
java.io.Serializable,Comparable
Java - V. / 48
Az osztály deklarációi
Osztály szintű deklaráció
Osztálytag
Példánytag Konstruktor
Osztályváltozó Példányváltozó
Osztálymetódus
Példánymetódus
Osztály- Példány- Belső
inicializáló inicializáló osztály
blokk
blokk
Ajánlott deklarálási sorrend:
• változók, kapcsolatok
• konstruktorok
• metódusok (get/set/main)
Java - V. / 49
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)
Java - V. / 50
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!
Java - V. / 51
Együttműködési diagram
1: main(args)
2: RaktarProgram()
4: akciok()
RaktarProgram
3: Aru(aNev,aEgysegar)
5: hozzatesz(aMenny)
6: elvesz(aMenny)
7: setEgysegar(aEgysegar)
program:
RaktarProgram
aru:Aru
Java - V. / 52
Osztálydiagram
RaktarProgram
+RaktarProgram()
+akciok()
+main(args)
Aru
-nev: String
-egysegar: double
-menny: double
+Aru(aNev:String,aEgysegar:double)
-aru +getNev(): String
+getEgysegar(): double
+setEgysegar(aEgysegar:double)
+getMenny(): double
+getAr(): double
+hozzatesz(aMenny:double)
+elvesz(aMenny:double)
+toString(): String
Java - V. / 53
class Aru {
private String nev;
private double egysegar;
private double menny;
Példányváltozók
public Aru(String aNev, double aEgysegar) {
nev = aNev;
egysegar = aEgysegar;
menny = 0;
}
Konstruktor
public String getNev() {
return nev;
}
Java - V. / 54
public double getEgysegar() {
return egysegar;
}
public void setEgysegar(double aEgysegar) {
if (aEgysegar >= 0)
egysegar = aEgysegar;
}
public double getMenny() {
return menny;
}
public double getAr() {
return menny*egysegar;
}
Java - V. / 55
public void hozzatesz(double aMenny) {
if (aMenny>0)
menny += aMenny;
}
public void elvesz(double aMenny) {
if (aMenny>0 && aMenny<=menny)
menny -= aMenny;
}
public String toString() {
return nev+"\tEgysegar: "+egysegar+
"\tMenny: "+menny+"\tAr: "+getAr();
}
}
Java - V. / 56
public class RaktarProgram {
private Aru aru;
Kapcsolat
public RaktarProgram() {
aru = new Aru("Paradicsom",300);
}
public void akciok() {
aru.hozzatesz(125);
System.out.println(aru);
aru.elvesz(25);
System.out.println(aru);
aru.setEgysegar(210);
System.out.println(aru);
}
Java - V. / 57
public static void main(String[] args) {
RaktarProgram program = new RaktarProgram();
program.akciok();
}
Objektum létrehozása
}
saját osztályából
main()
RaktarProgram
RaktarProgram()
akciok()
program:
RaktarProgram
Java - V. / 58
Hivatkozási kör
class JoSzerencse {
int joSzerencse;
int joSzerencse() {
int joSzerencse = this.joSzerencse;
return joSzerencse;
Példányváltozó
}
…
Lokális változó
}
Java - V. / 73
Takarás
class Proba {
int szam=1;
static char kar='A';
void proba() {
int szam=2; char kar='B';
System.out.println(szam);
System.out.println(this.szam);
System.out.println(kar);
System.out.println(Proba.kar);
}
}
// 2
// 1
// B
// A
Java - V. / 74
A this objektumreferencia
Példánymetódusok utolsó, rejtett paramétere
A megszólított objektum referenciája
public long vasarlas(long osszeg, JoSzerence this) {
long db = jegyDb(osszeg);
this.jegyDb += db;
return ertek(db)+vasarKezKoltseg;
}
Java - V. / 75
Konstruktor
Beállítja az objektum kezdeti állapotát
• adatok
• kapcsolatok
Hasonlít a metódushoz, de nincs visszatérési értéke
Neve megegyezik az osztály nevével
Csak a new-val hívható
Csak a hozzáférési módosítók használhatók
Túlterhelhető
Nem öröklődik
Java - V. / 76
Alapértelmezés szerinti konstruktor
Nincs (explicit) konstruktor egy alapértelmezés
szerinti (implicit) konstruktor fut le
• paraméter nélküli
• adatok, kapcsolatok alapértelmezések
nullaszerű kezdőértékek:
false, ’\u0000’, 0, null
Van legalább 1 (explicit) konstruktor nincs
alapértelmezés szerinti konstruktor
Java - V. / 77
Inicializálók
class Tanulo2 {
static int alapTandij;
double atlag; int tandij; Osztályinicializáló blokk
static {
alapTandij = 2000;
Inicializáló kifejezés
}
{
atlag = Console.readDouble("Atlag: ");
tandij = alapTandij +
(int)Math.round(3000*(5-atlag));
} // …
Példányinicializáló blokk
}
Java - V. / 78
Az inicializálás sorrendje
Osztályadatok (osztály betöltésekor)
• alapértelmezés szerinti értékek
• osztályinicializáló kifejezések
• osztályinicializáló blokkok
Objektum adatai (objektum születésekor)
• alapértelmezés szerinti értékek
• példányinicializáló kifejezések
• példányinicializáló blokkok
• konstruktor(ok)
Java - V. / 79