Diferencia entre estático y final?

Siempre estoy confundido entre las palabras clave static y final en java .

En qué se diferencian ?

La palabra clave estática se puede usar en 4 escenarios

  • variables estáticas
  • métodos estáticos
  • bloques estáticos de código
  • clase anidada estática

Miremos primero las variables estáticas y los métodos estáticos.

Variable estática

  • Es una variable que pertenece a la clase y no a un objeto (instancia).
  • Las variables estáticas se inicializan solo una vez, al inicio de la ejecución. Estas variables se inicializarán primero, antes de la inicialización de cualquier variable de instancia.
  • Una sola copia para ser compartida por todas las instancias de la clase.
  • El nombre de clase puede acceder directamente a una variable estática y no necesita ningún objeto.
  • Sintaxis: Class.variable

Método estático

  • Es un método que pertenece a la clase y no al objeto (instancia).
  • Un método estático solo puede acceder a datos estáticos. No puede acceder a datos no estáticos (variables de instancia) a menos que tenga / crea una instancia de la clase.
  • Un método estático puede llamar solo a otros métodos estáticos y no puede invocar un método no estático a menos que tenga / cree una instancia de la clase.
  • Un método estático se puede acceder directamente por el nombre de clase y no necesita ningún objeto.
  • Sintaxis: Class.methodName()
  • Un método estático no puede hacer referencia a this o a super palabras clave super de todos modos.

Clase estática

Java también tiene “clases anidadas estáticas”. Una clase anidada estática es solo una que no tiene implícitamente una referencia a una instancia de la clase externa.

Las clases anidadas estáticas pueden tener métodos de instancia y métodos estáticos.

No existe una clase estática de nivel superior en Java.

Nota al margen:

El método principal es static ya que debe ser accesible para que una aplicación se ejecute antes de que se lleve a cabo cualquier instancia.

final palabra clave final se usa en varios contextos diferentes para definir una entidad que no puede cambiarse más tarde.

  • Una clase final no puede ser subclasificada. Esto se hace por razones de seguridad y eficiencia. En consecuencia, muchas de las clases de biblioteca estándar de Java son final , por ejemplo, java.lang.System y java.lang.String . Todos los métodos en una clase final son implícitamente final .

  • Un método final no puede ser anulado por subclases. Esto se usa para evitar el comportamiento inesperado de una subclase que altera un método que puede ser crucial para la función o la coherencia de la clase.

  • Una variable final solo se puede inicializar una vez, ya sea a través de un inicializador o una statement de asignación. No necesita ser inicializado en el momento de la statement: esto se llama una variable blank final . Una variable de instancia final en blanco de una clase debe asignarse definitivamente al final de cada constructor de la clase en la que se declara; de manera similar, una variable estática final en blanco debe asignarse definitivamente en un inicializador estático de la clase en la que se declara; de lo contrario, se produce un error en tiempo de comstackción en ambos casos.

Nota: Si la variable es una referencia, esto significa que la variable no se puede volver a vincular para hacer referencia a otro objeto. Pero el objeto al que hace referencia sigue siendo mutable, si fue originalmente mutable.

Cuando se define una clase interna anónima dentro del cuerpo de un método, todas las variables declaradas final en el scope de ese método son accesibles desde dentro de la clase interna. Una vez que se ha asignado, el valor de la variable final no puede cambiar.

estático significa que pertenece a la clase, no a una instancia, esto significa que solo hay una copia de esa variable / método compartida entre todas las instancias de una Clase en particular.

 public class MyClass { public static int myVariable = 0; } //Now in some other code creating two instances of MyClass //and altering the variable will affect all instances MyClass instance1 = new MyClass(); MyClass instance2 = new MyClass(); MyClass.myVariable = 5; //This change is reflected in both instances 

final no tiene ninguna relación, es una forma de definir una única inicialización. Puede inicializar al definir la variable o dentro del constructor, en ninguna otra parte.

note Una nota sobre los métodos finales y las clases finales, esta es una forma de indicar explícitamente que el método o la clase no pueden ser anulados / ampliados respectivamente.

Lectura extra Entonces, sobre el tema de estática, estábamos hablando de otros usos que podría tener, a veces se usa en bloques estáticos. Cuando se utilizan variables estáticas, a veces es necesario configurar estas variables antes de usar la clase, pero desafortunadamente no se obtiene un constructor. Aquí es donde entra la palabra clave estática.

 public class MyClass { public static List cars = new ArrayList(); static { cars.add("Ferrari"); cars.add("Scoda"); } } public class TestClass { public static void main(String args[]) { System.out.println(MyClass.cars.get(0)); //This will print Ferrari } } 

No debe confundirse con los bloques de inicializador de instancia que se llaman antes del constructor por instancia.

Los dos realmente no son similares. static campos static son campos que no pertenecen a ninguna instancia particular de una clase .

 class C { public static int n = 42; } 

Aquí, el campo static n no está asociado con ninguna instancia particular de C sino con toda la clase en general (razón por la cual Cn se puede usar para acceder a ella). ¿Todavía puedes usar una instancia de C para acceder a n ? Sí, pero no se considera particularmente una buena práctica.

final por otro lado, indica que una variable en particular no puede cambiar después de que se inicializa.

 class C { public final int n = 42; } 

Aquí, n no se puede reasignar porque es final . Otra diferencia es que cualquier variable puede declararse final , mientras que no todas las variables pueden declararse estáticas.

Además, las clases pueden declararse final que indica que no se pueden extender:

 final class C {} class B extends C {} // error! 

De forma similar, los métodos pueden declararse finales para indicar que no pueden ser anulados por una clase extendida:

 class C { public final void foo() {} } class B extends C { public void foo() {} // error! } 

final –

1) Cuando aplicamos la palabra clave ” final ” a una variable , el valor de esa variable permanece constante. (o) Una vez que declaramos una variable como final, el valor de esa variable no se puede cambiar.

2) Es útil cuando un valor variable no cambia durante el tiempo de vida de un progtwig

estático –

1) cuando aplicamos una palabra clave ” estática ” a una variable , significa que pertenece a la clase.
2) Cuando aplicamos la palabra clave ” estática ” a un método , significa que se puede acceder al método sin crear ninguna instancia de la clase

static significa que solo hay una copia de la variable en la memoria compartida por todas las instancias de la clase.

La palabra clave final solo significa que el valor no se puede cambiar. Sin final , cualquier objeto puede cambiar el valor de la variable.

Estático y final tienen algunas grandes diferencias:

Las variables o clases estáticas siempre estarán disponibles desde (prácticamente) en cualquier lugar. Final es solo una palabra clave que significa que una variable no se puede cambiar. Entonces si tuviera:

 public class Test{ public final int first = 10; public static int second = 20; public Test(){ second = second + 1 first = first + 1; } } 

El progtwig se ejecutaría hasta que intentara cambiar el “primer” entero, lo que causaría un error. Fuera de esta clase, solo tendrías acceso a la “primera” variable si hubieras instanciado la clase. Esto está en contraste con “segundo”, que está disponible todo el tiempo.

Piensa en un objeto como un Altavoz. Si Speaker es una clase, tendrá diferentes variables, como volumen, agudos, graves, color, etc. Usted define todos estos campos mientras define la clase Speaker. Por ejemplo, declaró el campo de color con un modificador estático, lo que significa que le está diciendo al comstackdor que existe exactamente una copia de esta variable, independientemente de cuántas veces se haya instanciado la clase.

Declarando

 static final String color = "Black"; 

se asegurará de que cada vez que se crea una instancia de esta clase, el valor del campo de color sea “Negro” a menos que no se modifique.

 public class Speaker { static String color = "Black"; } public class Sample { public static void main(String args[]) { System.out.println(Speaker.color); //will provide output as "Black" Speaker.color = "white"; System.out.println(Speaker.color); //will provide output as "White" }} 

Nota: Ahora una vez que cambie el color del altavoz como final, este código no se ejecutará, porque la palabra clave final se asegura de que el valor del campo nunca cambie.

 public class Speaker { static final String color = "Black"; } public class Sample { public static void main(String args[]) { System.out.println(Speaker.color); //should provide output as "Black" Speaker.color = "white"; //Error because the value of color is fixed. System.out.println(Speaker.color); //Code won't execute. }} 

Puedes copiar / pegar este código directamente en tu emulador e intentarlo.

La estática es algo que cualquier objeto en una clase puede llamar, que pertenece intrínsecamente a un tipo de objeto.

Una variable puede ser definitiva para una clase completa, y eso simplemente significa que ya no se puede cambiar. Solo se puede configurar una vez, e intentar establecerlo nuevamente generará un error. Es útil por una serie de razones, quizás quiera declarar una constante, que no se puede cambiar.

Un código de ejemplo:

 class someClass { public static int count=0; public final String mName; someClass(String name) { mname=name; count=count+1; } public static void main(String args[]) { someClass obj1=new someClass("obj1"); System.out.println("count="+count+" name="+obj1.mName); someClass obj2=new someClass("obj2"); System.out.println("count="+count+" name="+obj2.mName); } } 

Wikipedia contiene la lista completa de palabras clave de Java .

No intentaré dar una respuesta completa aquí. Mi recomendación sería centrarme en comprender lo que cada uno de ellos hace y luego debería ser claro ver que sus efectos son completamente diferentes y por qué a veces se usan juntos.

static es para los miembros de una clase (atributos y métodos) y debe entenderse en contraste con los miembros de la instancia (no estáticos). Recomiendo leer “Comprensión de instancia y miembros de la clase” en Los tutoriales de Java. También puedo usarlo en bloques static , pero no me preocuparía para empezar.

final tiene diferentes significados según se aplique a variables, métodos, clases u otros casos. Aquí me gustan las explicaciones de Wikipedia mejor.