Menu

Miembros estáticos en Java: campos y métodos static

Qué hace la palabra clave static en Java, cómo los campos y métodos static pertenecen a la clase en lugar de a los objetos, y cuándo recurrir a los bloques static y a las constantes.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Pertenecer a la clase, no al objeto

La mayoría de los campos y métodos que has escrito hasta ahora pertenecen a objetos: cada vez que llamas a new, cada instancia obtiene su propia copia de los campos, y los métodos operan sobre el estado de ese objeto concreto. La palabra clave static da la vuelta a esto. Un miembro static pertenece a la clase en sí: hay una única copia, compartida por todas las instancias, y existe independientemente de si llegas a crear o no un objeto.

Esa única distinción explica los campos static, los métodos static, las constantes e incluso por qué main siempre es static.

Un campo static compartido

Un campo no estático le da a cada objeto su propio espacio. Un campo static le da a la clase un espacio que todos comparten. El ejemplo clásico es un contador que registra cuántos objetos se han creado:

Fíjate en que lees el contador como User.count, a través del nombre de la clase, porque el valor no pertenece a ningún User concreto. Cada name, en cambio, vive dentro de su propio objeto. Cambia count a través de cualquier instancia y todas las instancias verán el nuevo valor, porque solo existe uno.

Métodos static

Un método static también pertenece a la clase, así que lo llamas sobre la clase sin un objeto:

Este es exactamente el patrón que hay detrás de la biblioteca estándar: Math.max, Integer.parseInt, Arrays.sort y List.of son todos static: comportamiento utilitario que no necesita un objeto sobre el que operar. Recurre a un método static cuando el trabajo depende solo de sus argumentos, no de ningún estado propio de un objeto.

El gran tropiezo: static no puede ver instance

Un método static se ejecuta sin ningún objeto, así que no hay this. Eso significa que no puede acceder a campos de instancia ni llamar a métodos de instancia directamente: no hay un objeto concreto del que leerlos. Este es el error más común de los principiantes con static:

class Account {
    int balance = 100;          // campo de instancia

    static int show() {
        return balance;         // ERROR DE COMPILACIÓN: el campo no estático 'balance'
    }                           // no puede referenciarse desde un contexto estático
}

La solución es o bien convertir el método en un método de instancia (quitar static, para que tenga un this), o pasar el objeto explícitamente:

La dirección inversa no da problemas: un método de instancia puede leer libremente campos static y llamar a métodos static, porque los datos compartidos a nivel de clase siempre existen.

Constantes con static final

Combina static con final y obtienes una constante: un único valor compartido que nunca puede cambiar. Por convención se nombran en UPPER_SNAKE_CASE:

static final es la forma idiomática de expresar "un valor fijo que pertenece al tipo": cosas como Integer.MAX_VALUE o Math.PI en la biblioteca estándar. Hacerlo static significa que no desperdicias una copia por objeto; hacerlo final significa que nadie puede reasignarlo.

Bloques inicializadores static

Un campo static sencillo puede inicializarse en línea. Cuando la configuración necesita lógica real —construir una tabla de búsqueda, leer configuración— usa un bloque static. Se ejecuta una vez, cuando la clase se carga por primera vez, antes de que exista cualquier objeto:

El bloque se dispara una sola vez sin importar cuántas veces uses la clase, lo que lo convierte en el lugar adecuado para la configuración única que abarca toda la clase.

Cuándo usar static

Una regla práctica rápida:

  • Usa un campo static solo para datos que estén realmente compartidos por todas las instancias: un contador, una caché, una constante. Si dos objetos pudieran razonablemente tener valores distintos, debería ser un campo de instancia.
  • Usa un método static cuando el resultado depende solo de los argumentos, no del estado de ningún objeto (funciones de utilidad puras).
  • Por defecto, usa miembros de instancia. Abusar de static convierte silenciosamente tu programa en un montón de estado global, difícil de probar y de razonar. static es la excepción, no el punto de partida.

Siguiente: Enums

Una constante static final está bien para un único valor fijo, pero cuando tienes un conjunto pequeño y fijo de valores relacionados —direcciones, días de la semana, estados de un pedido— Java tiene un tipo diseñado para ese propósito que es más seguro y expresivo que constantes dispersas. Ese es el enum, y es la siguiente página.

Preguntas frecuentes

¿Qué significa static en Java?

static significa que un campo o método pertenece a la clase en sí, no a un objeto individual. Existe exactamente una copia de un campo static compartida por todas las instancias, y un método static se llama sobre la clase (Math.max(...)) sin necesidad de un objeto. Los miembros no estáticos (de instancia), en cambio, obtienen una copia nueva por cada objeto.

¿Cuál es la diferencia entre variables static y de instancia en Java?

Una variable de instancia tiene un valor por objeto: dos objetos pueden tener valores distintos. Una variable static tiene un único valor compartido entre todos los objetos de la clase, así que cambiarla a través de un objeto (o mediante el nombre de la clase) es visible para todos los demás. Usa campos de instancia para el estado propio de cada objeto y campos static para datos que sean realmente globales a la clase, como un contador o una constante.

¿Por qué el método main es static en Java?

La JVM necesita llamar a main antes de que exista cualquier objeto de tu clase. Como un método static pertenece a la clase y no a una instancia, el entorno de ejecución puede invocar Main.main(args) directamente sin construir antes un Main. Por eso la firma es siempre public static void main(String[] args).

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR