Elméleti alapozás
Az inicializálás II. - Mit is inicializál a Java?
Adattípusok alapértelmezett (default) értékei
Az előző fejezetben általánosságban került ismertetésre az inicializálás folyamata. A teljesség igényétől űzve kell most tisztáznunk az inicializálás különböző szintjeit, amely attól függ, hogy az inicializálandó egyszerű adattípusok (változók) a kód éppen melyik szintjén vannak deklarálva.
Négyféle pozíciójú változónk lehetséges:
-
példányváltozó,
-
osztályváltozó,
-
paraméter változó,
-
helyi (lokális) változó.
Az osztály létrehozása a new paranccsal az osztály 1 db futó példányát, objektumát eredményezi. Ha nincs egyéb korlátozás, akármennyi objektumot létrehozhatunk 1 db osztályból, ekkor a példányváltozóból minden példányban keletkezni fog 1 db, ezért hatóköre példányon belüli.
A példányváltozókat a Java-rendszer automatikusan, értelemszerűen 0 értékkel inicializálja.
Vigyázzunk, ha az alábbi kódot ellenőrizzük: az osztály neve nem Main, hanem Number! Jól láthatjuk a 2 db példányváltozót int a és int b deklaráció formájában, amelyeket szabványos módszerrel getter-setter függvényekkel menedzselünk:
public class Number {
int a;
int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public static void main(String[] args) {
Number number = new Number();
System.out.println(number.getA());
System.out.println(number.getB());
}
}
Végeredmény:
0
0
A 2 db int típusú példányváltozónak nem adtunk kezdőértéket, a szabványos getA() és getB() függvények mégis 0 értékeket adtak vissza, amely bizonyítja, hogy a Java-rendszer a változókat valóban 0 értékkel inicializálta.
Ebből a változóból csakis 1 példány létezik, amely csakis az osztályhoz tartozik, hatóköre osztály belüli. Fő jellegzetessége a változó elé tett static módosítószó (Alapszinten a static módosítóról című fejezet).
Az osztályváltozókat a Java-rendszer automatikusan, értelemszerűen 0 értékkel inicializálja.
Vigyázzunk, ha az alábbi kódot ellenőrizzük: az osztály neve nem Main, hanem Number! Jól láthatjuk a 2 db osztályváltozót int a és int b deklaráció formájában, amelyeket szabványos módszerrel getter-setter függvényekkel menedzselünk:
public class Number {
static int a;
static int b;
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public int getB() {
return b;
}
public void setB(int b) {
this.b = b;
}
public static void main(String[] args) {
Number number = new Number();
System.out.println(number.getA());
System.out.println(number.getB());
}
}
Végeredmény:
0
0
A 2 db int típusú osztályváltozónak nem adtunk kezdőértéket, a szabványos getA() és getB() függvények mégis 0 értékeket adtak vissza, amely bizonyítja, hogy a Java-rendszer a változókat valóban 0 értékkel inicializálta.
Ezen változók a metódusok belépési pontjai (az alábbi kódban int a és int b). Hatókörük csakis a metóduson belül érvényes.
A paraméter változókat a Java-rendszer NEM inicializálja!
public int addingNumbers(int a, int b) {
return a + b;
}
Ezen változók belső utasításblokkon belül működnek és érvényességük is ide korlátozódik.
A helyi (lokális) változókat a Java-rendszer NEM inicializálja!
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
int a;
System.out.println(a);
}
}
}
A kód nem fog lefutni, mert az Eclipse érzékeli, hogy for cikluson belül deklarált int a nincs megfelelően inicializálva, ezért ennek megfelelő hibaüzenetet küld:
Exception in thread "main" java.lang.Error: Unresolved
compilation problem:
The local variable a may not have been initialized at Main.main(Main.java:7)
Adattípusok alapértelmezett (default) értékei
A Java-rendszer az alábbi adattípusokat (a fentiek figyelembevételével) a létrehozásuk pillanatában a következő alapértékekre állítja:
-
Boolean - boolean - false
-
Karakter - char - '\u0000'
-
-
byte - 0
-
short - 0
-
int - 0
-
long - 0L
-
-
-
float - 0.0f
-
double - 0.0d
-
-
Referencia típus - null