En esta sección trataremos el uso de la palabra clavestaticpara 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 claseBycicle, las variables de instancia soncadence,gear, yspeed. Cada objetoBycicletiene 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 modificadorstaticse 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
Bycicley 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:Las variables de clase se referencian por el mismo nombre de la clase, así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; ...... }Este aclara que son variables de clase.Bicycle.numberOfBicycles
Atención También puedes referenciar campos estáticos con una referencia de objeto, asíesto no es recomendable porque no queda claro que se trata de una variable de clase.myBike.numberOfBicyclesPuedes usar el constuctor
Byciclepara fijar la variable de instanciaide incrementar la variable de clasenumberOfBycicles: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 modificadorstaticen su declaración, se deben invicar con el nombre de la clase, sin necesidad de crear una instancia de la clase, del siguiente modoNombreDeClase.nombreDeMetodo(args)
Atención También puedes refernciar métodos estáticos con una referencia de objeto, asípero esto no se recomienda porque no queda claro que se trata de métodos de clase.nombreDeInstancia.nombreDeMetodo(args)
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
Byciclepara acceder al campo estáticonumberOfBycicles:No se permiten todas las combinaciones de variables de instancia y de clase:public static int getNumberOfBicycles() { return numberOfBicycles; }
- Los métodos de instancia pueden acceder a variables y métodos de instancia directamente.
- Los métodos de instancia pueden acceder a variables y clases de instancia directamente.
- Los métodos de clase pueden acceder a variables y métodos de clase directamente.
- Los métodos de clase no pueden acceder a variables o métodos de instancia directamente. Deben usar una referencia de objeto. Además, los métodos de clase no puedden usar la palabra clave
thispuesto que no hay ninguna instancia a la quethisse pueda referir.Constantes
El modificadorstatic, en combinación con el modificadorfinal, también se utiliza para definir constantes. El modificadorfinalindica 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):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 (_).static final double PI = 3.141592653589793;
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
Después de todas las modificaciones hechas en esta sección, la claseBycicleBycicleha 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; } }
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é: