Puede haber momentos en que sea útil tener valores compartidos en todas las instancias de una clase en particular. Los campos estáticos y las constantes estáticas permiten este tipo de uso compartido al pertenecer a clase y no a los objetos reales.
Normalmente, los campos y métodos definidos en una clase solo se pueden usar cuando se ha creado un objeto de ese tipo de clase. Por ejemplo, considere una clase de artículo simple que realiza un seguimiento de los productos en una tienda:
Artículo de clase pública
cadena privada itemName;
Artículo público (String itemName)
this.itemName = itemName;
public String getItemName ()
devolver itemName;
Para poder utilizar el método getItemName (), primero debemos crear un objeto Item, en este caso, catFood:
clase estática de ejemplo público
public static void main (String [] args)
Item catFood = nuevo Item ("Whiskas");
System.out.println (catFood.getItemName ());
Sin embargo, si el modificador estático se incluye en una declaración de campo o método, no se requiere ninguna instancia de la clase para usar el campo o método; están asociados con la clase y no con un objeto individual. Si vuelve a mirar el ejemplo anterior, verá que el modificador estático ya se está utilizando en la declaración del método principal:
público estático void main (String [] args)
El método principal es un método estático que no requiere que exista un objeto antes de poder ser llamado. Como main () es el punto de partida para cualquier aplicación Java, de hecho no hay objetos que existan para llamarlo. Podría, si deseara tener un programa que se llama a sí mismo continuamente, hacer esto:
clase estática de ejemplo público
public static void main (String [] args)
Cadena [] s = "aleatorio", "cadena";
StaticExample.main (s);
No es muy útil, pero observe cómo se puede llamar al método main () sin una instancia de una clase StaticExample.
Los campos estáticos también se conocen como campos de clase. Son simplemente campos que tienen el modificador estático en sus declaraciones. Por ejemplo, volvamos a la clase Item y agreguemos un campo estático:
Artículo de clase pública
// campo estático uniqueId
private static int uniqueId = 1;
private int itemId;
cadena privada itemName;
Artículo público (String itemName)
this.itemName = itemName;
itemId = uniqueId;
uniqueId ++;
Los campos itemId y itemName son campos no estáticos normales. Cuando se crea una instancia de una clase Item, estos campos tendrán valores que se mantienen dentro de ese objeto. Si se crea otro objeto Item, también tendrá los campos itemId y itemName para almacenar valores.
Sin embargo, el campo estático uniqueId contiene un valor que será el mismo en todos los objetos Item. Si hay 100 objetos Item, habrá 100 instancias de los campos itemId y itemName, pero solo un campo estático uniqueId.
En el ejemplo anterior, uniqueId se usa para dar a cada objeto Item un número único. Esto es fácil de hacer si cada objeto Item que se crea toma el valor actual en el campo estático uniqueId y luego lo incrementa en uno. El uso de un campo estático significa que cada objeto no necesita saber sobre los otros objetos para obtener una identificación única. Esto podría ser útil si desea saber el orden en que se crearon los objetos Item.
Las constantes estáticas son exactamente como los campos estáticos, excepto que sus valores no se pueden cambiar. En la declaración de campo, el final y estático Se utilizan ambos modificadores. Por ejemplo, quizás la clase Item debería imponer una restricción en la longitud del itemName. Podríamos crear una constante estática maxItemNameLength:
Artículo de clase pública
Id privado int estático = 1;
public static final int maxItemNameLength = 20;
private int itemId;
cadena privada itemName;
Artículo público (String itemName)
if (itemName.length ()> maxItemNameLength)
this.itemName = itemName.substring (0,20);
más
this.itemName = itemName;
itemId = id;
id ++;
Al igual que con los campos estáticos, las constantes estáticas están asociadas con la clase en lugar de un objeto individual:
clase estática de ejemplo público
public static void main (String [] args)
Item catFood = nuevo Item ("Whiskas");
System.out.println (catFood.getItemName ());
System.out.println (Item.maxItemNameLength);
Hay dos cosas importantes a tener en cuenta sobre la constante estática maxItemNameLength:
Las constantes estáticas se pueden ver en toda la API de Java. Por ejemplo, la clase de contenedor entero tiene dos que almacenan los valores máximo y mínimo que puede tener un tipo de datos int:
System.out.println ("El valor máximo para int es:" + Integer.MAX_VALUE);
System.out.println ("El valor mínimo para int es:" + Integer.MIN_VALUE);
Salida:
El valor máximo para int es: 2147483647
El valor mínimo para int es: -2147483648