Você está na página 1de 7

19/5/2018 java - ¿Cual es la diferencia entre static y final?

- Stack Overflow en español

_
Stack Overflow en español es un sitio de Así es como funciona:
preguntas y respuestas para
programadores y profesionales de la
informática. Únete a ellos; toma menos
de un minuto:
Se vota a favor de las
Registrarse Cualquiera puede mejores respuestas, y éstas
formular una Cualquiera puede suben a los primeros
pregunta responder puestos

¿Cual es la diferencia entre static y final? Formular una pregunta

He buscado por Internet pero no me ha quedado muy claro lo que significan estas palabras reservadas y qué funcionalidades tienen en una clase:

static
final

java

editada el 14 mar. 17 a las 13:30 formulada el 16 feb. 17 a las 21:17


Daniel Ruiz Anónimo
79 1 11 89 1 3 18

6 respuestas

Al usar la palabra reservada static la declaración de la constante ha de realizarse obligatoriamente en


cabecera de la clase.

Si tratamos de incorporarlo en un método obtendremos un error.

Este ejemplo no compila:

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */


class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
static final double PI = 3.1416;
}
}

pero este si:

class Ideone
{
static final double PI = 3.1416;

public static void main (String[] args) throws java.lang.Exception


{
System.out.println(Ideone.PI);
}
}

Por eso dentro del método main al ser este un método de clase y llevar incorporado static en su
declaración no podemos declarar constantes de clase.

Pero final si que puede ser usado dentro de métodos ademas también dentro del método main .

Ejemplo: final double PI = 3.1416; es valida dentro de un método.

Ademas final double PI = 3.1416; se puede usar para tener acceso a unos datos que sabes que en
teoría no pueden ser modificados una vez sea declarados/inicializados con un valor.

class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
final double PI = 3.1416;
}
}

Los miembros static puedes llamarlos sin tener que crear una instancia de la misma, por ejemplo cuando
usas new MiClase ... miClase.a . Ahora podrías hacer MiClase.a sin tener que usar o crear una instancia

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 1/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español
de la misma.

class MiClass{

static int a; // Puedes acceder sin crear una instancia por ejemplo MiClass.a
final double PI = 3.1416

Al hacer una clase static esta puede ser llamada, osea puedes usar por ejemplo sus métodos sin
tener que crear una instancia de la misma, por ejemplo cuando usas new MiClase ...
miClase.miMetodo(); . Ahora podrias hacer MiClaseEstatica.miMetodo(); sin tener que usar o crear una
instancia de la misma.

Java no tiene manera de hacer una clase de nivel superior estática puede hacer algo como lo siguiente:

public final class MiClaseEstatica {


static public int sumar (int a, int b){
return a + b;
}
}
//...
System.out.println(MiClaseEstatica.sumar(3, 2));

Aquí hacemos uso de una llamada estática sin necesidad de crear una instancia para acceder por
ejemplo algún método de la clase.

Se vendría a ahorra algo como:

public MiClase miClase = new MiClase();


System.out.println(MiClase.sumar(3, 2));

Puede que le interese leer esta pregunta/respuesta

Las clases internas pueden ser declaradas estáticas.

se creara un .class por cada una de estas clases internas.

public class Obj {

private int data1;


private String data2;

public Obj(int data1, String data2) {


this.data1 = data1;
this.data2 = data2;
}

private static class ObjComp implements Comparator<Obj> {

@Override
public int compare(Obj obj1, Obj obj2) {
return obj2.data1 - obj1.data1;
}

}
}

también se pueden crear bloques de código como estáticos para que sean ejecutados cuando se cargue
la clase.

se suelen conocer como (static initializer block) si no es declarado de forma explicita el compilador JIT
(just-in-time) combina todos los campos estáticos en un bloque y los ejecuta durante la carga de clases.

public class Obj {

private static int data1;

static {
data1 = 10;
}

Los bloques de inicialización pueden ser, sustituidos por métodos estáticos como en el siguiente ejemplo
puede ver:

public class Obj {

private static int data1 = inicializacionDeCampo();

private static int inicializacionDeCampo() {


return 10;
}
}

se puede aplicar esta lógica de inicialización de variables de clase static sin necesidad de incluirlo en
su constructor de clase.

static permite el acceso a métodos, variables de clase sin la necesidad de instanciar un objeto de la
clase en cuestión, suele ser usado por ejemplo para la creación de clases de utilidad. Java cuenta con
varias de estas como pueden ser:

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 2/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español
java.lang.String
java.lang.Math

Entonces los miembros static pertenecen a la clase en lugar de una instancia en concreto, esto es
clave para entender mas rápido lo siguiente:

Solo existirá un campo static aunque se creasen miles de instancias de la clase, y aun mas a tener
encuentra aunque "no exista" ninguna instancia de la misma.

Con lo que ese campo sera compartido por todas las instancias.

Esto si se analiza un poco tiene bastante sentido, tanto para lo anterior como aplicándose a métodos
estáticos. Cuando se dice que no pueden referirse a miembros de una instancia, porque de ser así a que
instancia se esta refiriendo cuando todas comparte el mismo campo o método estático.

Que no es lo mismo que acceder a través de una instancia específica.

Ejemplo:

public class Obj {

private static boolean data3;


private boolean data4Instancia;

public static void main(String[] args) {

data3 = true; //un método estático accediendo al campo estático

Obj instancia = new Obj();

instancia.data4Instancia = true; //un método estático acceda a un campo no


estático de una instancia especifica, aquí le decimos de alguna manera oye esta es
la instancia a la que quiero acceder.

Todo esto tiene sentido pues los valores, campos, métodos NO estáticos dependen de la creación de
instancias de la clase.

Cuando se dice que solo existirá un campo estático, es verdad a medias, pero dependiendo del nivel al
que se esta explicando puede ser mas valido o menos valido, por ejemplo puede ser uno por Class
Loader por o el hilo (thread), entre otros casos, solo lo menciono para que se tenga encuentra en cierta
manera, por si se quiere profundizar en ello.

https://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.html

editada el 23 ago. 17 a las 6:31 respondida el 16 feb. 17 a las 21:35


Cesar Romero Angel Angel
488 2 13 7,142 7 23 51

1 Toma tu tiempo :) Quieres incorporar los clases interiores estáticos, o lo hago yo? – Stefan Nolde el 16 feb. 17 a
las 21:58

@StefanNolde gracias por tu comprencion es que estoy un poco liado y tuve que dejarla a media, si quieres mira
mi respuesta y amplia tu la tuya, la verdad es que me haces un favor. P.D: en tu pregunta dices Clases
declarados como final no pueden ser usado como superclases. se me olvidaba el mencionar eso que Una clase
declarada final impide que pueda ser superclase de otras clases, muy bueno. – Angel Angel el 16 feb. 17 a las
22:13

1 Eso fue la idea, trabajar en equipo ;) Voy a leer que escribiste hasta ahora, con temas tan fundamentales es
bueno de tener más que una pregunta correcta, con distintos niveles de detalles. – Stefan Nolde el 16 feb. 17 a
las 23:04

@Stefan Nolde yo vote mas uno en la tuya entre otras cosas porque para serte sincero es probable que yo no
hubiera mencionado lo que tu comentas sobre de si una clase es declarada como final. Saludos. P.D: y gracias
de nuevo por la comprencion tanto es asi que me acabo de dar cuenta que hasta deje una respuesta en meta a la
mitad XD. – Angel Angel el 16 feb. 17 a las 23:08

1 Si, @TripleX. las cualidades no cambian combinando los modificadores. La combinación en si aun tiene su usos
especiales. – Stefan Nolde el 17 feb. 17 a las 12:46

Los modificadores static y final tienen contextos completamente distintos.

static

El modificador static implica que algo se define en el contexto general, no en un contexto de un objeto.
Sin este modificador, variables, clases o campos siempre existen en el contexto de una instancia de un
objeto en particular.

Campos definidos static son variables globales.


Métodos definidos static son funciones globales.

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 3/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español
Clases interiores declarado static funcionan como clases normales, pueden ser instados desde
fuera de la clase que los contienen y (obviamente) no tienen el mismo acceso a variables y métodos
de objetos instados de la clase contenedora.

final

Final en general significa inmutable. Hay dos usos principales:

Variables declarados como final no pueden ser sobreescrito. Eso no significa que un objeto que fue
asignado a una variable final no puede ser modificado en sus campos o por sus métodos, solamente
significa que la referencia de esta variable a este mismo objeto nunca cambiará.
Clases declarados como final no pueden ser usado como superclases. String por ejemplo es una
clase definido como final, así no es posible de declarar un MegaString extends String - Java no lo
permite. En forma parecida, métodos declarados como final no pueden ser sobreescrito por
@Override.

Usos comunes de static

Constantes (en combinación con final ):

public static final int RESULT_CANCELED=0;

Singletons (objetos de que se debería usar una sola instancia):

public static final SecureRandom sr = SecureRandom();

Variables globales:

private static int numLusers=0;

Métodos globales:

public static Luser newInstance(){


numLusers++;
return new Luser();
}

Clases internos públicos


public class Almacenamiento{

public static class AlmacenamientoCreateHelper{


...
}
...
}

¿Pero si una clase interna declarado static no tiene acceso directo a métodos y campos de la clase
exterior, que es la ventaja de declarar una clase interna así?

Es un tema de organisación y probablemente existe una variedad de opiniones sobre eso. personalmente
prefiero agrupar clases por paquetes para organizarlos, sin embargo se presenta una ventaja obvia: Si
mantengo clases que son altamente dependiente en su código, manteniendolos en el mismo archivo
ayuda mucho en evitar errores por combinar clases de distintos versiones, si uso el .java que contiene
clase exterior y interior, siempre puedo estar seguro que tengo las versiones compatibles.

Usos comunes de final

Constantes (en combinación con static )


public static final String AUTHORITY="com.snolde.app";

Campos de "Value Objects" usados en contextos de concurrencia.


public class LuserVO{
public final String uname;
public final int uid;
public final Token authToken;
public LuserVO(String uname, int uid, Token auth);
}

Variables locales par uso en clases anónimas:


final Socket sock = server.accept();
Task t = new Task(new Runnable(){
@Override
public void run(){
InputStream is = sock.getInputstream();
...
}
});

Clases finales que no deberían ser extendido:


public final class AuthToken{
...
public boolean hasPrivilege(int pId);
}

// No es posible de crear una clase como esa para pasarlo a un método que acepta
AuthToken:
WeonAuthToken extends AuthToken{
@Override
public boolean hasPrivilege(int pId){ return true; }
}

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 4/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español
Métodos que no deberían ser sobreescrito:
protected final void onAgregado(Contexto contexto, Node padre){
// aqui tengo código que esta llamado por otra clase de mi biblioteca
// que es importante para el funcionamiento, y quiero evitar
// cambios en el flujo. Después ofrezco un gancho para código
// extendido.
}

protected abstract void onDespuesAgregado(Contexto contexto, Node padre);

editada el 17 feb. 17 a las 15:03 respondida el 16 feb. 17 a las 21:50


Stefan Nolde
5,878 1 17 39

La palabra clave static se puede utilizar en 4 escenarios:

Variables estáticas
Métodos estáticos
Bloques estáticos de código.
Clase anidada estática

Veamos primeramente 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 sólo 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
Una variable estática se puede acceder directamente 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 sólo puede acceder
a los 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 puede llamar a otros métodos estáticos y no puede
llamar a un método no estático de él a menos que tenga / crea una instancia de la clase. Un método
estático puede ser accedido directamente por el nombre de la clase y no necesita ningún objeto Sintaxis:
Class.methodName () Un método estático no puede referirse a este o super palabras clave en cualquier
caso

Clase estática

Java también tiene "clases anidadas estáticas", Una clase anidada estática es una que no implica
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 hay tal cosa como una clase estática de nivel superior en Java.

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

Una clase final no puede ser subclasificada. Esto se hace por razones de seguridad y eficiencia. Por
consiguiente, 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 de una clase final son implícitamente
final .

Un método declarado como final no puede ser sobreescrito 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 consistencia de la clase.
Una variable final sólo 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 la declaración: esto se llama
una variable final en blanco ( 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 producirá un error de tiempo
de compilación en ambos casos.

Existe una respuesta en SO realizada por @Ashish

editada el 22 nov. 17 a las 19:27 respondida el 16 feb. 17 a las 23:15


Jorgesys ♦
52.8k 8 29 71

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 5/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español

Las Constantes son declaradas asi :

public static final String CONSTANTE = "VALOR";

static -> indica que es accesible a nivel de Clase y no necesita una instancia de ella para ser usada.

final -> indica que el valor una vez declarado no puede ser cambiado.

ejemplo

public class Clase1


{
public static final String CONSTANTE = "VALOR";
}

public class Clase2 {

public static void main (String[]agr)


{
System.out.println(Clase1.CONSTANTE);
}

respondida el 16 feb. 17 a las 21:27


Jose Felipe Charbel
Pavez Gass
1,375 4 9

A veces hacen complicado la definición de ciertas palabras claves, tratare de ser lo mas simple.

static :

hacer que una propiedad o método de la clase, sea propio de la clase, esto quiere decir, si tienes la clase
Perro, y tienes una propiedad color = "negro" todos los objetos perros que creas con esta clase serán
de color = negro , si en un momento cambias el valor a color = "azul" , ahora todos los objetos perros
que creaste con color negro, serán azules, porque es propio de clase.

Perro.color = "negro"; //se modifica el atributo public static String de la clase Perro

Perro perro1 = new Perro();


Perro perro2= new Perro();
// se crearon 2 perro con atributo color = "negro"
System.out.println(perro1.color); //imprime "negro"
System.out.println(perro2.color); //imprime "negro"

Perro.color = "azul"; // se modifica el atributo static


System.out.println(perro1.color); //imprime "azul"

System.out.println(perro2.color); //imprime "azul"

El cambio se debe a que es un atributo propio de la clase(especie) no del objeto, si cambiar un atributo
propio de la clase, todos los objetos de esa clase son "afectados"

En los métodos: te permite llamar directamente al método sin necesidad de que exista un objeto
creado.En el mismo caso del perro, si tiene un método correr() y no es static, solo podrías llamarlo así

Perro perro = new Perro();


perro.correr();// <- lo llamas desde el objeto perro creado.

Si fuera static , no es necesario tener un objeto creado, basta con llamar de la clase

Perro.correr() //<-- se llama desde la propia clase porque es static, propia de la


clase

final

Las tipo de variable Final , son mas simples, solo hacen que el atributo o lo que se defina con esta
palabra, no se pueda modificar.Es su valor final, sirve mayormente cuando quieres declarar
CONSTANTES, valores que nunca van a cambiar.

Nota: las variables static facilitan muchas cosas, pues cuando creas elementos con este valor,
pueden ser accesibles de forma fácil solo desde la clase. el atributo "final" permite solo asegurarte que el
elemento es inmutable, no puede ser modificable. los atributo "static final" permiten ambas cosas, se
accesibles desde cualquier parte solo desde su Clase, y son inmutables.

public static final double VALOR_PI = 3.1415926;

// por convención las contantes deben ir todas en mayusculas, esto quiere decir,
todas los atributos del tipo "final"

editada el 16 feb. 17 a las 23:08 respondida el 16 feb. 17 a las 22:58


Felix Apaza
101 4

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 6/7
19/5/2018 java - ¿Cual es la diferencia entre static y final? - Stack Overflow en español

Los static no se necesita instanciar la clase... osea = new Clase() para llamarlos, es simplemente
llamar el método por ejemplo: clase.metodoStatic(); ,sin requerir la instancia Clase clase = new
Clase() , dentro de estos solo puedes usar mas métodos estáticos, ninguno de instancia.

La clase Final significa que no pueden tener herencia.

Y esa es toda la diferencia, lo demás es pura paja... información de mas.

Espero pode ayudarte, saludos.

editada el 17 feb. 17 a las 16:46 respondida el 17 feb. 17 a las 0:03


Jorgesys ♦ Cristina Carrasco Angulo
52.8k 8 29 71 3,488 6 28

2 Me gustan las respuestas simple, pero si me doy la paja de poner en practica que escribes, te tengo otra
información demás: Si no uso Clase clase = new Clase(); no tengo ningún clase para llamar
estáticamente a clase.metodoStatic(); . Y por supuesto puedo usar métodos no estáticos dentro de un
método estático, mientras insto objetos dentro del método. Además me di la paja de leer la pregunta y me
sobraba la información de mas que no se trata de comparar métodos estáticos con clases finales. El arte de ser
conciso también requiere de no ser impreciso. ;) – Stefan Nolde el 17 feb. 17 a las 15:16

1 Lo que comenta Cristina es sobre los métodos static, si el método no esta definido como static, primeramente
tienes que instanciar la clase y llamar el método en la instancia. Clase clase = new Clase(); => clase.metodo(); ,
pero en cambio si se define el método como static se puede llamar directamente sin instanciar la clase
Clase.metodo(); – Jorgesys ♦ el 17 feb. 17 a las 16:59

1 @StefanNolde En mi experiencia esas son las diferenciasque he encontrado Por otra parte estos conceptos
muchas veces solo se aplican en arquitecturas muy abstractas y requieren mucha acertividad,en la vida
cotidiana..en el supuesto que programes Aplicaciones y no arquitecturas, ni frameworks,no le veo mucha
utilidad.Si ponemos atención en las clases automáticas que ya generan los frameworks,podremos ver que ya
vienen inmersa toda esa lógicaY con mi respuesta en ningún momento quise menospreciar todo el
concepto,soloque es una respuesta muy compleja y enredosa para alguien que esta aprendiendo –
Cristina Carrasco Angulo el 17 feb. 17 a las 17:55

1 La pregunta no se basa en opiniones, tal cual como se puede dar una respuesta completa y correcta que no esta
basado en opiniones. La opinión entra en eso cuando empiezo a conversar cuales de los funciones de los
modificadores son útiles y cuales no lo son. Yo ya me encontré con todos los usos posibles de estos
modificadores, sea por usarlos yo mismo o tener que considerar los efectos de su uso en código de tercer parte.
– Stefan Nolde el 17 feb. 17 a las 18:07

1 Bien por ti @StefanNolde felicidades :-) – Cristina Carrasco Angulo el 17 feb. 17 a las 18:09

https://es.stackoverflow.com/questions/49967/cual-es-la-diferencia-entre-static-y-final 7/7

Você também pode gostar