static vs final java, obojí jsou známé modifikátory přístupu v Javě, které vykonávají různé funkce (používají se pro různé úlohy).
- static: Klíčové slovo static lze použít na proměnné instance a metody, ale ne na třídy. Při jeho použití lze proměnné a metody volat bez pomoci objektu. Když je metoda nebo proměnná volána bez objektu, zapouzdření není zachováno. To znamená, že u statických proměnných a metod zapouzdření neexistuje.
- final: Klíčové slovo final lze použít na všechny konstrukce – proměnné, metody i třídy. Při použití se final chová u každé z nich velmi odlišně a má jinou funkčnost.
Prozkoumejme static vs final javu programově.
I) Použití klíčového slova static
Všeobecně platí, že instanční proměnná nebo metoda vyžaduje objekt, se kterým se volá. Statické proměnné a metody však objekt nevyžadují. Všimněte si následujícího kódu.
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 }}
V uvedeném kódu je věk nestatický a vyžaduje objekt, se kterým se volá. Všimněte si, metoda main(). plat je statický a nevyžaduje objekt. Podobně je tomu u statické metody display(). Je volána bez potřeby objektu.
II) Použití klíčového slova final
Jak již bylo uvedeno, klíčové slovo final lze použít na třech místech – v proměnných, metodách a třídách. Při jeho použití se chová různě.
- Finální proměnnou nelze znovu přiřadit.
- Finální metodu nelze přepsat.
- Finální třídu nelze dědit.
Jednu věc však lze mezi výše uvedenými třemi najít společnou: „final znamená, že něco nelze udělat.“
a) final s proměnnými
Finální proměnná funguje jako konstanta jazyka C/C++. To znamená, že proměnnou final nelze znovu přiřadit. Java nepodporuje klíčové slovo const a na jeho místě používá klíčové slovo final.
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 }}
Proměnná rupie není konečná a tím pádem je znovu přiřazena s novou hodnotou 600.
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 }}
Proměnná rupie není konečná. $rate je konečná a tím pádem ji nelze znovu přiřadit.
b) final u metod
Pokud nadtřída nedovolí podtřídě přepisovat, jednoduše deklaruje metodu jako konečnou. Finální metody nadtřídy nemůže podtřída přepsat.
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(); }}
V nadtřídě Manager je metoda doSomeThing() deklarována jako finální. Podtřída Worker ji nesmí přepisovat. Zkuste to jednou, vyvolá to chybu kompilace. Pokud má nadtřída nefinální metody (v kódu nejsou uvedeny), podtřída je může bez obav přepsat podle svého uvážení.
c) final u tříd
Programátor nemusí chtít, aby třída byla děděna jinými třídami, protože by rád umožnil přístupnost prostřednictvím kompozice, nikoli dědičnosti.
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); }}
V uvedeném kódu je třída Fruit deklarována jako final, a proto ji Mango nemůže rozšířit. Jak tedy může využívat metody třídy Fruit? Jednoduše tak, že vytvoří objekt třídy Fruit a zavolá metody třídy Fruit. Tomu se říká kompozice.
Co je to kompozice v Javě?
Vytvoření objektu jiné třídy v naší třídě a volání proměnných a metod jiné třídy se nazývá kompozice (známá jako vztah has-a, protože jedna třída „má“ objekt jiné třídy). Zde platí, že objekt a metoda nebo proměnná patří do stejné třídy. Naproti tomu u dědičnosti patří objekt podtřídě a proměnná nebo metoda nadtřídě.
Zobrazit vše pro Java Rozdíly v 90 tématech
.