static vs final java, beide zijn bekende access modifiers in Java die verschillende functionaliteiten doen (gebruikt voor verschillende taken).
- static: het static-sleutelwoord kan worden toegepast op instance-variabelen en -methoden, maar niet op klassen. Wanneer het wordt toegepast, kunnen variabelen en methoden worden aangeroepen zonder de hulp van een object. Wanneer een methode of variabele wordt aangeroepen zonder object, wordt de inkapseling niet behouden. Dat wil zeggen, met statische variabelen en methoden, inkapseling niet bestaat.
- final: het sleutelwoord final kan worden toegepast op alle constructen – variabelen, methoden en klassen. Wanneer toegepast, gedraagt final zich zeer verschillend met elk met verschillende functionaliteiten.
Laten we static vs final java programmatisch verkennen.
I) Gebruik van static Keyword
Over het algemeen vereist een instance variabele of methode een object om aan te roepen. Maar statische variabelen en methoden vereisen geen object. Kijk eens naar de volgende code.
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 }}
In de bovenstaande code is age niet statisch en is een object nodig om het aan te roepen. Merk op dat de methode main(). salaris statisch is, geen object nodig heeft. Hetzelfde geldt voor de statische display() methode. Deze wordt aangeroepen zonder dat een object nodig is.
II) Gebruik van final Keyword
Zoals eerder gezegd, kan het final keyword op drie plaatsen worden toegepast – variabelen, methoden en klassen. Wanneer het wordt toegepast, gedraagt het zich verschillend.
- Een finale variabele kan niet opnieuw worden toegewezen.
- Een finale methode kan niet worden overridden.
- Een finale klasse kan niet worden geërfd.
Maar één ding hebben de bovenstaande drie gemeen, “final betekent dat iets niet kan”.
a) final met variabelen
Een final variabele werkt als een constante van C/C++. Dat wil zeggen, een finale variabele kan niet opnieuw worden toegewezen. Java ondersteunt het trefwoord const niet en gebruikt in plaats daarvan het trefwoord 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 }}
De variabele rupees is niet definitief en wordt daarom opnieuw toegewezen met een nieuwe waarde van 600. $rate is wel definitief en kan dus niet opnieuw worden toegekend.
b) definitief met methoden
Als de superklasse niet toestaat dat de subklasse een methode overschrijft, verklaart zij de methode eenvoudigweg als definitief. De finale methoden van de superklasse kunnen niet worden overschreven door de subklasse.
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(); }}
In de superklasse Manager wordt doSomeThing() als final gedeclareerd. De subklasse Worker mag deze niet overschrijven. Probeer het eens, maar er treedt een compilatiefout op. Als de superklasse niet-definitieve methoden heeft (niet in de code weergegeven), kan de subklasse deze naar believen overschrijven.
c) final with classes
De programmeur kan er niet van houden dat een klasse door andere klassen wordt overgeërfd, omdat hij de toegankelijkheid wil toestaan via compositie en niet via overerving.
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); }}
In de bovenstaande code is Fruit als final gedeclareerd, zodat Mango het niet kan uitbreiden. Hoe kan hij dan gebruik maken van de methoden van de Fruit-klasse? Simpelweg door een object van Fruit te maken en de methoden van de Fruit-klasse aan te roepen. Dit staat bekend als compositie.
Wat is Compositie in Java?
Het creëren van een object van een andere klasse in onze klasse en het aanroepen van andere klasse variabelen en methoden staat bekend als compositie (bekend als heeft-een relatie als een klasse “heeft een” object van een andere klasse). Hier behoren object en methode of variabele tot dezelfde klasse. Bij overerving daarentegen behoort het object tot een subklasse en de variabele of methode tot de superklasse.
Bekijk alles voor Java Verschillen over 90 Onderwerpen