Comprensión de los miembros de instancia y de clase (Los Tutoriales Java™ > El lenguaje Java > Clases y objetos)
Ruta: El lenguaje Java
Lección: Clases y objetos
Section: More on Classes
Comprensión de los miembros de instancia y de clase
Página inicial > El lenguaje Java > Clases y objetos
Comprensión de los miembros de instancia y de clase
En esta sección trataremos el uso de la palabra clave static para crear campos y métodos que pertenecen a la clase, en lugar de a una instanca de la clase.

Variables de clase

Cuando se crean una cierta cantidad de objetos a partir de los planos de la misma clase, cada uno tiene su propia copia de las variables de instancia. En el caso de la clase Bycicle, las variables de instancia son cadence, gear, y speed. Cada objeto Bycicle tiene sus propios valores para estas variables, almacenados en lugares distintos de la memoria.

En ocasiones querrás tener variables que sean comunes a todos los objetos. Esto se consigue con el modificador static. Los campos cuya declaración contiene el modificador static se llaman campos estáticos o variables de clase. Están asociados a la clase, en vez de al objeto. Cada instancia de la clase comparte una variable de clase, que se encuentra en un lugar fijo en la memoria. Un objeto puede cambiar el valor de una variable de clase, pero las variables de clase también se pueden manipular sin crear una instancia de la clase.

Por ejemplo, supongamos que quieres crear un conjunto de objetos Bycicle y asignar a cada uno un número de serie, comenzando con 1 para el primer objeto. Este número de identificación (ID) es único para cada objeto y, por lo tanto, es una variable de instancia. Un campo como estos no está relacionado con un objeto individual, sino con la clase. Para esto necesitas una variable de clase, numberOfBycicles, de este modo:

public class Bicycle{
	
    private int cadence;
    private int gear;
    private int speed;
	
    // añade una variable de instacia para el ID del objeto
    private int id;
    
    // añade una variable de clase para la cantidad de objetos Bicycle que se hayan instanciado
    private static int numberOfBicycles = 0;
	......
}
Las variables de clase se referencian por el mismo nombre de la clase, así
    Bicycle.numberOfBicycles
Este aclara que son variables de clase.

Atención También puedes referenciar campos estáticos con una referencia de objeto, así
    myBike.numberOfBicycles
esto no es recomendable porque no queda claro que se trata de una variable de clase.

Puedes usar el constuctor Bycicle para fijar la variable de instancia id e incrementar la variable de clase numberOfBycicles:

public class Bicycle{
	
    private int cadence;
    private int gear;
    private int speed;
    private int id;
    private static int numberOfBicycles = 0;
	
    public Bicycle(int startCadence, int startSpeed, int startGear){
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;

        // incrementa el número de Bicycles y asigna un número ID
        id = ++numberOfBicycles;
    }

    // método nuevo para devolver el ID de la variable de instancia
    public int getID() {
        return id;
    }
	.....
}

Métodos de clase

El lenguaje de programación Java proporciona métodos estáticos igual que variables estáticas. Los métodos estáticos, que contienen el modificador static en su declaración, se deben invicar con el nombre de la clase, sin necesidad de crear una instancia de la clase, del siguiente modo
NombreDeClase.nombreDeMetodo(args)

Atención También puedes refernciar métodos estáticos con una referencia de objeto, así
    nombreDeInstancia.nombreDeMetodo(args)
pero esto no se recomienda porque no queda claro que se trata de métodos de clase.

Un uso común para métodos estáticos es el de acceder a campos estáticos. Por ejemplo, podríamos añadir un método estático a la clase Bycicle para acceder al campo estático numberOfBycicles:

public static int getNumberOfBicycles() {
    return numberOfBicycles;
}
No se permiten todas las combinaciones de variables de instancia y de clase:

Constantes

El modificador static, en combinación con el modificador final, también se utiliza para definir constantes. El modificador final indica que el calor de este campo no se puede cambiar.

Por ejemplo, la siguiente declaración de variable define una constante llamada PI, cuyo valor es una aproximación de pi (la relación entre la circunferencia de un círculo con su diámetro):

static final double PI = 3.141592653589793;
Las constantes que se definen de esta manera no se pueden reasignar, y producirá un error durante la compilación si tu programa lo intenta. Por convención, los nombres de valores constantes se escriben en mayúsculas. Si el nombre se compone de más de una palabra, éstas se separan con un guión bajo (_).

Atención Si un tipo primitivo o una cadena de texto (string) se definen como constante, y el valor se conoce en el momento de la compilación, el compilador reemplaza el nombre de la constante con su valor en todo el código. Esto se llama una constante en tiempo de compilación (compile-time constante). Si el valor de la constante cambia en el mundo exterior (por ejemplo, si se legisla que pi realmente debería ser 3.975), tendrás que volver a compilar todas las clases que usen esta constance para que tengan el nuevo valor.

La clase Bycicle

Después de todas las modificaciones hechas en esta sección, la clase Bycicle ha quedado así:
public class Bicycle{
	
    private int cadence;
    private int gear;
    private int speed;
	
    private int id;
    
    private static int numberOfBicycles = 0;

	
    public Bicycle(int startCadence, int startSpeed, int startGear){
        gear = startGear;
        cadence = startCadence;
        speed = startSpeed;

        id = ++numberOfBicycles;
    }

    public int getID() {
        return id;
    }

    public static int getNumberOfBicycles() {
        return numberOfBicycles;
    }

    public int getCadence(){
        return cadence;
    }
	
    public void setCadence(int newValue){
        cadence = newValue;
    }
	
    public int getGear(){
    return gear;
    }
	
    public void setGear(int newValue){
        gear = newValue;
    }
	
    public int getSpeed(){
        return speed;
    }
	
    public void applyBrake(int decrement){
        speed -= decrement;
    }
	
    public void speedUp(int increment){
        speed += increment;
    }
	
}
Página anterior: Control del acceso a los miembros de una clasePágina siguiente: Inicialización de campos

  ATENCIÓN: La traducción de esta documentación es un esfuerzo personal y voluntario. NO es un documento oficial del propietario de la tecnología Java, Oracle, ni está patrocinado por esta empresa.

Los documentos originales y actualizados (en inglés) están disponibles en: http://docs.oracle.com/javase/tutorial/. La versión disponible en este sitio es la publicada en Marzo de 2008 (más información en: "What's new and What's Old? The History of the Tutorial").

Dirige cualquier comentario, petición, felicitación, etc. a tutorialesjava@codexion.com.

Si quieres ayudar a mantener en funcionamiento esta web, colaborar con la traducción de estos documentos o necesitas que se traduzca algún capítulo en concreto puedes invitarme a un café: