static vs final java, mindkettő ismert hozzáférés-módosító a Java-ban, amely különböző funkciókat végez (különböző feladatokra használják).
- static: a static kulcsszó alkalmazható példányváltozókra és metódusokra, de osztályokra nem. Alkalmazása esetén a változók és metódusok objektum segítsége nélkül hívhatók. Ha egy metódust vagy változót objektum nélkül hívunk meg, a kapszulázás nem marad meg. Vagyis statikus változók és metódusok esetén a kapszulázás nem létezik.
- final: A final kulcsszó minden konstrukcióra – változókra, metódusokra és osztályokra – alkalmazható. Alkalmazásakor a final nagyon eltérően viselkedik, mindegyiknél más-más funkcionalitással.
Vizsgáljuk meg a static vs final java programmatikusan.
I) A static kulcsszó használata
Általában egy példányváltozó vagy metódus hívásához egy objektumra van szükség. A statikus változók és módszerek azonban nem igényelnek objektumot. Figyeljük meg a következő kódot.
public class Employee{ int age = 45; // non-static variable static double salary = 8877.66; // static variable public static void display() // static method { System.out.println("Hello World"); } public static void main(String args) { // System.out.println(age); // raises error, it is non-static and requires object System.out.println(salary); // works fine as salary is static, object not required display(); // works fine as display() is static, object not required }}
A fenti kódban az age nem statikus, és egy objektumot igényel a híváshoz. Figyeljük meg, a main() metódus. salary mivel statikus, nem igényel objektumot. Hasonlóan a statikus display() metódushoz. Meghívása objektum nélkül történik.
II) A final kulcsszó használata
Mint korábban említettük, a final kulcsszó három helyen alkalmazható: változókban, metódusokban és osztályokban. Alkalmazásakor különbözőképpen viselkedik.
- Egy final változó nem rendelhető át.
- Egy final metódus nem írható felül.
- Egy final osztály nem örökölhető.
De egy dolog közös a fenti háromban: “a final azt jelenti, hogy valamit nem lehet csinálni”.
a) final változókkal
A final változó úgy működik, mint a C/C++ konstans. Vagyis egy final változót nem lehet újra hozzárendelni. A Java nem támogatja a const kulcsszót, helyette a final kulcsszót használja.
public class Bank{ public static void main(String args) { int rupees = 500; // non-final can be reassigned System.out.println("rupees before reassigned: " + rupees); rupees = 600; // non-final System.out.println("rupees after reassigned: " + rupees); final double $rate = 61.5; // final cannot be reassigned System.out.println("$ Rate is Rs." + $rate); // $rate = 62.8; // raises error }}
A rúpiák változó nem végleges, és ezáltal 600-as új értékkel újra átadja. A $rate végleges, és ezáltal nem rendelhető újra.
b) final metódusokkal
Ha a szuperosztály nem engedélyezi az alosztály számára a felülbírálást, akkor egyszerűen véglegesnek deklarálja a metódust. A szuperosztály végleges metódusait az alosztály nem írhatja felül.
class Manager{ public final void doSomeThing() // observe final { System.out.println("Do it right now"); }}public class Worker extends Manager{ public static void main(String args) { Worker w1 = new Worker(); w1.doSomeThing(); }}
A Manager szuperosztályban a doSomeThing() metódus véglegesnek van deklarálva. Az alosztály Worker nem írhatja felül. Próbáld meg egyszer, fordítási hibát ír elő. Ha a szuperosztálynak vannak nem végleges metódusai (a kódban nem szerepelnek), az alosztály nyugodtan felülbírálhatja a maga kénye-kedve szerint.
c) final with classes
A programozó nem szeretné, ha egy osztályt más osztályok örökölnének, mert nem örökléssel, hanem kompozícióval szeretné lehetővé tenni az elérhetőséget.
final class Fruit // observe, final class{ String nature = "Seedless";}public class Mango // extends Fruit raises compilation error{ public static void main(String args) { Fruit f1 = new Fruit(); System.out.println("Fruit type is " + f1.nature); }}
A fenti kódban a Fruit véglegesnek van deklarálva, és ezáltal a Mango nem tudja kiterjeszteni. Akkor hogyan tudja használni a Fruit osztály metódusait? Egyszerűen úgy, hogy létrehoz egy Fruit objektumot, és meghívja a Fruit osztály metódusait. Ezt nevezzük kompozíciónak.
Mi a kompozíció Java-ban?
A más osztály objektumának létrehozása az osztályunkban és más osztályok változóinak és metódusainak meghívása kompozíciónak nevezhető (más néven has-a kapcsolat, mivel az egyik osztály “rendelkezik” egy másik osztály objektumával). Itt az objektum és a metódus vagy változó ugyanahhoz az osztályhoz tartozik. Ezzel szemben az öröklésben az objektum az alosztályhoz, a változó vagy metódus pedig a szuperosztályhoz tartozik.
Minden megtekintése a Java különbségek 90 témakörben
.