¿Diferencia entre estática y final?

174

Siempre estoy confundido entre staticy finalpalabras clave en Java .

En qué se diferencian ?

TechnoCorner
fuente

Respuestas:

238

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

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

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

Variable estática

  • Es una variable que pertenece a la clase y no al objeto (instancia).
  • Las variables estáticas se inicializan solo una vez, al comienzo de la ejecución. Estas variables se inicializarán primero, antes de la inicialización de cualquier variable de instancia.
  • Una única copia para ser compartida por todas las instancias de la clase.
  • Se puede acceder directamente a una variable estática por el nombre de la clase 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 / cree una instancia de la clase.
  • Un método estático solo puede llamar a otros métodos estáticos y no puede llamar a un método no estático a menos que tenga / cree una instancia de la clase.
  • Se puede acceder directamente a un método estático por el nombre de la clase y no necesita ningún objeto.
  • Sintaxis: Class.methodName()
  • Un método estático no puede referirse a thiso superpalabras clave 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 staticque debe ser accesible para que una aplicación se ejecute antes de que se produzca una instanciación.

final La palabra clave se utiliza en varios contextos diferentes para definir una entidad que luego no se puede cambiar.

  • Una finalclase no puede ser subclaseada. 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.Systemy java.lang.String. Todos los métodos en una finalclase son implícitamente final.

  • Un finalmétodo no puede ser anulado por subclases. Esto se utiliza para evitar un 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 finalvariable solo se puede inicializar una vez, ya sea a través de un inicializador o una declaración de asignación. No necesita ser inicializado en el punto de declaración: esto se llama blank finalvariable. 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 compilació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 todavía es mutable, si originalmente era mutable.

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

Ashish
fuente
55
(No lo rechacé) Algunas aclaraciones adicionales: "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 / cree una instancia de la clase. "Un método estático solo puede llamar a otros métodos estáticos y no puede llamar a un método no estático desde él". - A MENOS que tenga / cree una instancia de la clase.
xagyg
1
en el método estático, la explicación de la sintaxis que mencionaste erróneamente, creo. podría serClass.methodName()
Mdhar9e
También podemos tener clase estática. Haga correcciones en su respuesta. Gracias :)
Madhusudan
A partir de Java 8, una clase anónima (y lambda) puede acceder efectivamente a las variables finales y sin restricción de la palabra clave final.
akhil_mittal
38

estática significa que pertenece a la clase, no 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 inicialización única. Puede inicializar al definir la variable o dentro del constructor, en ningún otro lugar.

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

Lectura adicional Entonces, en el tema de la estática, estábamos hablando de los otros usos que puede tener, a veces se usa en bloques estáticos. Cuando se usan 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<String> cars = new ArrayList<String>();

    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 invocan antes del constructor por instancia.

Jon Taylor
fuente
La siguiente información proporcionada por usted es capaz de despejar toda confusión gracias ...final is entirely unrelated, it is a way of defining a once only initialization. You can either initialize when defining the variable or within the constructor, nowhere else.
prashant thakre
2
Simple y claro como deberían ser las cosas. La respuesta aceptada es simplemente ... detallada.
22

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

class C {
    public static int n = 42;
}

Aquí, el staticcampo nno está asociado con ninguna instancia en particular, Csino con toda la clase en general (es por eso que C.nse puede usar para acceder a él). ¿Todavía puedes usar una instancia de Cpara acceder n? Sí, pero no se considera una práctica especialmente buena.

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

class C {
    public final int n = 42;
}

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

Además, se pueden declarar clases finalque indican que no se pueden extender:

final class C {}

class B extends C {}  // error!

Del mismo modo, los métodos se pueden declarar definitivos para indicar que una clase extendida no puede anularlos :

class C {
    public final void foo() {}
}

class B extends C {
    public void foo() {}  // error!
}
arshajii
fuente
Gracias por los aportes. El código da error: clase C {public static int n = 42; } dice que el campo no puede declarar estático en tipo no estático. ¿Por qué no puedo declarar o hacer Cn?
TechnoCorner
@TechnoCorner solo las clases de nivel superior (la publicclase potencial que define el archivo) o staticlas clases internas pueden definir staticvariables. Otras clases internas son instancias de la clase externa y no pueden tener variables estáticas.
zapl
17

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 la vida útil de un programa

estática

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

Rohit
fuente
12

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

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

Emmanuel Osimosu
fuente
3

Estática 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 programa se ejecutaría hasta que intentara cambiar el "primer" número entero, lo que provocaría un error. Fuera de esta clase, solo tendría acceso a la "primera" variable si hubiera instanciado la clase. Esto está en contraste con "segundo", que está disponible todo el tiempo.

alistair
fuente
3

Piensa en un objeto como un orador. 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 compilador 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 cree una instancia de esta clase, el valor del campo de color sea "Negro" a menos que no se cambie.

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

Puede copiar / pegar este código directamente en su emulador e intentarlo.

vishnulphb
fuente
2

Diferencia fácil

Final : significa que el Valor de la variable es Final y no cambiará en ningún lado. Si dice que final x = 5 significa que x no se puede cambiar, su valor es final para todos.

Estático: significa que solo tiene un objeto. supongamos que tiene x = 5, en la memoria hay x = 5 y está presente dentro de una clase. si crea un objeto o instancia de la clase, lo que significa que hay un cuadro específico que representa esa clase y sus variables y métodos. y si crea otro objeto o instancia de esa clase, significa que hay dos cuadros de esa misma clase que tienen diferentes x dentro de la memoria. y si llama a ambas x en diferentes posiciones y cambia su valor, entonces su valor será diferente. el cuadro 1 tiene x que tiene x = 5 y el cuadro 2 tiene x = 6. pero si hace que la x sea estática significa que no se puede volver a crear. puede crear un objeto de clase pero ese objeto no tendrá una x diferente en ellos. si x es estática, la casilla 1 y la casilla 2 tendrán la misma x que tiene el valor de 5. Sí, puedo cambiar el valor de static en cualquier lugar ya que no es final. así que si digo que el cuadro 1 tiene xy cambio su valor a x = 5 y luego hago otro cuadro que es box2 y cambio el valor de box2 x a x = 6. entonces, como X es estática, ambas cajas tienen la misma x. y ambas cajas darán el valor de caja como 6 porque box2 sobrescribe el valor de 5 a 6.

Tanto final como estático son totalmente diferentes. Final, que es final, no se puede cambiar. estático, que permanecerá como uno, pero se puede cambiar.

"Este es un ejemplo. Recuerde que las variables estáticas siempre se llaman por su nombre de clase. Porque son solo una para todos los objetos de esa clase. Por lo tanto, la Clase A tiene x = 5, puedo llamarla y cambiarla por Ax = 6; "

Malick Usman
fuente
1

Estático es algo que cualquier objeto en una clase puede llamar, que pertenece inherentemente a un tipo de objeto.

Una variable puede ser final para toda una clase, y eso simplemente significa que ya no se puede cambiar. Solo se puede configurar una vez, e intentar configurarlo nuevamente generará un error. Es útil por varias razones, quizás desee declarar una constante, que no se puede cambiar.

Algún 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 .

PearsonArtPhoto
fuente
¿Qué quieres decir con un objeto en particular? ¿Puedes por favor ilustrar?
TechnoCorner
0

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

statices para miembros de una clase (atributos y métodos) y debe entenderse en contraste con los miembros de instancia (no estáticos). Recomiendo leer "Comprender los miembros de instancia y clase" en los Tutoriales de Java. También puedo usarlo en staticbloques, pero no me preocuparía por eso para empezar.

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

madth3
fuente
-1

Los valores de la variable estática se pueden cambiar aunque una copia de la variable atraviese la aplicación, mientras que los valores de la Variable final se pueden inicializar una vez y no se pueden cambiar en toda la aplicación.

Debasish Paul
fuente