Java Made Clear: Difference between static and final Keywords

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).
  1. 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.
  2. 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.

  1. Egy final változó nem rendelhető át.
  2. Egy final metódus nem írható felül.
  3. 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

.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.