static vs final java, ambos son conocidos modificadores de acceso en Java haciendo diferentes funcionalidades (utilizados para diferentes trabajos).
- static: la palabra clave static se puede aplicar a las variables de instancia y a los métodos pero no a las clases. Cuando se aplica, las variables y los métodos pueden ser llamados sin la ayuda de un objeto. Cuando se llama a un método o variable sin objeto, no se mantiene la encapsulación. Es decir, con las variables y métodos estáticos, la encapsulación no existe.
- final: la palabra clave final se puede aplicar a todas las construcciones – variables, métodos y clases. Cuando se aplica, final se comporta de manera muy diferente con cada uno con diferentes funcionalidades.
Vamos a explorar java estática vs final programáticamente.
I) Uso de la palabra clave estática
Generalmente, una variable de instancia o método requiere un objeto para llamar con. Pero las variables y métodos estáticos no requieren un objeto. Observe, el siguiente código.
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 }}
En el código anterior, age no es estático y requiere un objeto para llamarlo. Observe, el método main(). el salario al ser estático no requiere un objeto. De manera similar con el método estático display(). Se llama sin necesidad de un objeto.
II) Uso de la palabra clave final
Como se dijo anteriormente, la palabra clave final puede aplicarse en tres lugares – variables, métodos y clases. Cuando se aplica se comporta de manera diferente.
- Una variable final no puede ser reasignada.
- Un método final no puede ser anulado.
- Una clase final no puede ser heredada.
Pero se puede encontrar una cosa en común entre las tres anteriores, «final significa que algo no se puede hacer».
a) final con variables
Una variable final funciona como una constante de C/C++. Es decir, una variable final no puede ser reasignada. Java no soporta la palabra clave const y en su lugar utiliza la palabra clave 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 variable rupias no es final y por tanto se reasigna con un nuevo valor de 600. $rate es final y por lo tanto no puede ser reasignada.
b) final con métodos
Si la superclase no permite a la subclase sobrescribir, simplemente declara el método como final. Los métodos finales de la superclase no pueden ser sobrescritos por la subclase.
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(); }}
En la superclase Manager, doSomeThing() se declara final. La subclase Worker no puede anularla. Si se intenta una vez, se produce un error de compilación. Si la superclase tiene métodos no finales (no mostrados en el código), la subclase puede sentirse libre de anular a su conveniencia.
c) final con clases
Al programador puede no gustarle que una clase sea heredada por otras clases porque le gustaría permitir la accesibilidad a través de la composición y no por herencia.
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); }}
En el código anterior, Fruta está declarada como final y por tanto Mango no puede extenderla. Entonces, ¿cómo puede hacer uso de los métodos de la clase Fruit? Simplemente creando un objeto de Fruit y llamando a los métodos de la clase Fruit. Esto se conoce como composición.
¿Qué es la composición en Java?
Crear un objeto de otra clase en nuestra clase y llamar a las variables y métodos de otra clase se conoce como composición (conocida como relación has-a ya que una clase «tiene un» objeto de otra clase). Aquí, el objeto y el método o la variable pertenecen a la misma clase. Por el contrario, en la herencia el objeto pertenece a la subclase y la variable o el método pertenecen a la superclase.
Ver todo para las diferencias de Java en 90 temas