Programozási alapismeretek ismétlése
Az előadás videója elérhető a itt.
Minden objektum...¶
A Java nyelv feltételezi, hogy benne objektum orientáltan szeretnének programozni. Ezért mielőtt belevágnánk, a gondolkodásunkat mindenképp eszerint kell alakítani. Áttekintve a Java alapvető komponenseit, látni fogjuk, hogy minden objektum, még a legapróbb Java program is.
Objektum referenciák¶
Minden programozási nyelvnek megvan a maga módszere arra, hogy a memóriában levő elemeket manipulálja. A programozónak tisztában kell lennie azzal, hogy adott esetben egy elemet direkt módon, vagy valamilyen indirekt módon tud módosítani, amihez esetlegesen egy külön szitaxist is kell használnia, ahogy ezt láttuk a C/C++ nyelvben. Ehhez képest a Java egyszerűbb, mert minden referencia, amit egy konzisztens szintaxissal érünk el. Habár objektumokat kezelünk, valójában minden objektumot egy referencián keresztül érünk el. Pont, mint amikor a tévé csatornáit nem úgy kapcsolgatjuk, hogy odamegyünk a tévéhez, hanem a távirányítón babrálunk valamit, ami majd átkapcsol a másik csatornára, vagy módosítja a hangerőt.
Primitív típusok¶
Az objektumokkal ellentétben a primitív típusú adatokat direkt tudjuk elérni a stacken. (Ennek legfőképp hatékonysági okai vannak). Ezen primitív adatok kezelése így egy kicsit más lesz, mint az objektumoké.
A hordozhatóság egyik alapfeltétele, hogy a primitív típusú adatok fix hosszúságúak:
Primitív típus | Méret | Min | Max | Wrapper |
---|---|---|---|---|
boolean | - | - | - | Boolean |
char | 16 bit | Unicode 0 | Unicode 216 − 1 | Character |
byte | 8 bit | -128 | +127 | Byte |
short | 16 bit | −2^15 | +2^15 − 1 | Short |
int | 32 bit | −2^31 | +2^31 − 1 | Integer |
long | 64 bit | −2^63 | +2^63 − 1 | Long |
float | 32 bit | IEEE754 | IEEE754 | Float |
double | 64 bit | IEEE754 | IEEE754 | Double |
void | - | - | - | Void |
Ahogy az a táblázatból látszik, minden numerikus típus előjeles, azaz nincsenek előjeles típusok. A boolean típus mérete nincs expliciten definiálva, ennek oka, hogy csak annyi van definiálva, hogy képes legyen eltárolni a true vagy false literálokat. A IEEE754 egy olyan szabvány, amely rögzíti a lebegőpontos számok tárolását, ez definiálja a legkisebb és legnagyobb ábrázolható értékeket is.
Minden primitív típushoz létezik egy Wrapper osztály, ami képes arra, hogy adott primitív adatból létre tudjunk hozni egy nem primitív objektumot, ami az adott primitívet a heapen tárolja. Erre például akkor lehet szükség, amikor a primitív típusokat különböző kollekciókba szeretnénk tenni, amik csak referenciák tárolására alkalmasak.
Operátorok¶
A C-ben megismert operátorok használhatóak. Így:
- Értékadás: primitív típusoknál értékmásolás, objektum referenciáknál csak referenciamásolás (igazi objektum másolás: clone() metódussal)
- Matematikai : +, -, *, /, %
- Összevont: +=, -=, *=, /=, %=
- Egy operandusú: +, - ,++, - -
- Relációk: ==, !=, <, >, <=, >=
Primitív típusoknál érték összehasonlítás történik, objektum referenciáknál csak referencia összehasonlítás (igazi objektum összehasonlítás: equals() metódussal) - Bitműveletek: &, | , ˆ (xor), (not)
- Értékadással összevont: &=, |=, ˆ=
- Biteltolás: <<, >>,>>> (unsigned)
- Értékadással összevont: <<=, >>=, >>>=
- Logikai: &&, ||, !
C/C++-szal ellentétben csak boolean értékekre használható, összetett kifejezés csak addig értékelődik ki, amíg ki nem derül egyértelműen az értéke (lusta kiértékelés). - Háromoperandusú if-else: boolean-exp ? val0 : val1
- Vessző: ,
csak for ciklusban használható - Típuskonverzió: (type)value
Primitív típusok között használható korlátok nélkül (kivéve a boolean-t), osztályok között csak egy öröklődési fán belül engedélyezett. - Nincs sizeof()
Precedencia¶
A műveletek precedenciája is hasonló a már megismerthez:
Operátor típusa | Operátorok |
---|---|
Unáris postfix operátorok | ++, - - , [ ], ., (<param>) |
Unáris prefix operátorok | ++, - -, +, -, , ! |
Multiplikatív operátorok | *, /, % |
Additív operátorok | +, - |
Bitenkénti léptető operátorok | <<<,>>,>>> |
Összehasonlító | <, >, <=, >=, (instanceof) |
Egyenlőség | ==, != |
Bitenkénti ÉS | & |
Bitenkénti kizáró vagy | ^ |
Bitenkénti VAGY | | |
Logikai és | && |
Logikai VAGY | || |
Feltételes | ?: |
Értékadás | =, (és összetettek, pl.: +=) |
Vezérlési szerkezetek¶
A Java támogat minden C vezérlési szerkezetet, kivéve a goto-t.
- Szekvenciális
- Szelekciós vezérlés
(Figyelem!!! A feltétel csak boolean kifejezés lehet, ez egy kicsit talán szokatlan elsőre.)
- Kezdőfeltételes ismétléses vezérlés
- Végfeltételes ismétléses vezérlés
- Számlálásos ismétléses vezérlés
- Eset kiválasztásos szelekciós vezérlés
switch (selector) {
case value1:
statement;
break;
case value2:
statement;
break;
case value3:
statement;
break;
// ...
default:
statement;
}
A szelektor lehet byte, short, char, int primitív típusok bármelyike, felsorolási típusok, String és a fenti primitívek wrapper osztályai (Character, Byte, Short, Integer).
A ciklusok végrehajtását a break és a continue utasításokkal meg tudjuk szakítani, éppúgy, mint a C-ben, annyi kiegészítéssel, hogy ezek után egy-egy címkét is lehet tenni, ilyenkor azon ciklus végrehajtása áll meg, amelyik parancsszava előtt ugyanaz a címke szerepel.
A return utasítás a metódusokból való visszatérést szolgálja.