Java Made Clear: Differenza tra parole chiave statiche e finali

static vs final java, entrambi sono noti modificatori di accesso in Java che svolgono funzioni diverse (usati per lavori diversi).
  1. static: la parola chiave static può essere applicata a variabili di istanza e metodi ma non alle classi. Quando viene applicata, le variabili e i metodi possono essere chiamati senza l’aiuto di un oggetto. Quando un metodo o una variabile viene chiamata senza oggetto, l’incapsulamento non viene mantenuto. Cioè, con variabili e metodi statici, l’incapsulamento non esiste.
  2. final: la parola chiave final può essere applicata a tutti i costrutti – variabili, metodi e classi. Quando viene applicata, final si comporta in modo molto diverso con ciascuna con diverse funzionalità.

Esploriamo programmaticamente java static vs final.

I) Uso della parola chiave static

Generalmente, una variabile di istanza o un metodo richiede un oggetto da chiamare. Ma le variabili e i metodi statici non richiedono un oggetto. Osservate il seguente codice.

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 }}

Nel codice qui sopra, age non è statico e richiede un oggetto da chiamare. Osservate, il metodo main(). salario essendo statico non richiede un oggetto. Allo stesso modo con il metodo statico display(). Viene chiamato senza la necessità di un oggetto.

II) Uso della parola chiave final

Come detto prima, la parola chiave final può essere applicata in tre posti – variabili, metodi e classi. Quando viene applicata si comporta diversamente.

  1. Una variabile finale non può essere riassegnata.
  2. Un metodo finale non può essere sovrascritto.
  3. Una classe finale non può essere ereditata.

Ma una cosa può essere trovata in comune tra le tre precedenti, “finale significa che qualcosa non può essere fatto”.

a) finale con le variabili

Una variabile finale funziona come una costante di C/C++. Cioè, una variabile finale non può essere riassegnata. Java non supporta la parola chiave const e al suo posto usa la parola chiave 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 }}


La variabile rupie non è finale e quindi riassegnata con un nuovo valore di 600. $rate è finale e quindi non può essere riassegnato.

b) finale con i metodi

Se la classe super non permette alla sottoclasse di sovrascrivere, dichiara semplicemente il metodo come finale. I metodi finali della superclasse non possono essere sovrascritti dalla sottoclasse.

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(); }}

Nella superclasse Manager, doSomeThing() è dichiarato finale. La sottoclasse Worker non è autorizzata a sovrascrivere. Prova una volta, solleva un errore di compilazione. Se la superclasse ha metodi non finali (non mostrati nel codice), la sottoclasse può sentirsi libera di sovrascrivere a suo piacimento.

c) finale con le classi

Il programmatore potrebbe non gradire che una classe sia ereditata da altre classi perché vorrebbe permettere l’accessibilità attraverso la composizione e non per ereditarietà.

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); }} 

Nel codice sopra, Fruit è dichiarato come finale e quindi Mango non può estenderlo. Allora come può fare uso dei metodi della classe Fruit? Semplicemente creando un oggetto di Fruit e chiamando i metodi della classe Fruit. Questo è noto come composizione.
Che cos’è la composizione in Java?

Creare un oggetto di un’altra classe nella nostra classe e chiamare variabili e metodi di altre classi è noto come composizione (nota come relazione has-a, in quanto una classe “ha un” oggetto di un’altra classe). Qui, oggetto e metodo o variabile appartengono alla stessa classe. Al contrario, nell’ereditarietà l’oggetto appartiene alla sottoclasse e la variabile o il metodo appartengono alla superclasse.

Vedi tutto per le differenze Java su 90 argomenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.