Los atributos y métodos estáticos
también se llaman atributos de clase y métodos de clase.
Se declaran como static.
Supongamos una clase Coche sencilla que se utiliza en un programa de compra-venta de coches usados. De esta clase se han creado tres objetos de tipo Coche:
La clase contiene 6 atributos: marca, modelo, color, matrícula, precio y descuento. Supongamos que el descuento es una cantidad que se aplica a todos los coches sobre el precio de venta. Como este dato es el mismo para todos los coches y es un valor que se puede modificar en cualquier momento no debe formar parte de cada coche sino que es un dato que deben compartir todos. Esto se consigue declarándolo como atributo static.
Un Atributo static:
La clase contiene 6 atributos: marca, modelo, color, matrícula, precio y descuento. Supongamos que el descuento es una cantidad que se aplica a todos los coches sobre el precio de venta. Como este dato es el mismo para todos los coches y es un valor que se puede modificar en cualquier momento no debe formar parte de cada coche sino que es un dato que deben compartir todos. Esto se consigue declarándolo como atributo static.
Un Atributo static:
- No es específico de cada objeto. Solo hay una copia del mismo y su valor es compartido por todos los objetos de la clase.
- Podemos considerarlo como una variable global a la que tienen acceso todos los objetos de la clase.
- Existe y puede utilizarse aunque no existan objetos de la clase.
Para acceder a un atributo de
clase se escibe:
NombreClase.atributo
Un Método static:
- Tiene acceso solo a los atributos estáticos de la clase.
- No es necesario instanciar un objeto para poder utilizarlo.
Para acceder a un método de
clase se escribe:
NombreClase.método()
Ejemplo:
Vamos a escribir una clase
Persona que contendrá un atributo contadorPersonas que indique cuantos objetos
de la clase se han creado.
contadorPersonas debe ser un
atributo de clase ya que no es un valor que se deba guardar en cada objeto Persona
que se crea, por lo tanto se debe declarar static:
public class Persona {
private String nombre;
private int edad;
static int contadorPersonas;
.......
}
Un ejemplo de
uso desde fuera de la clase Persona podría ser mostrar su valor en la clase
principal:
System.out.println(Persona.contadorPersonas);
También podríamos
modificar su valor en la clase principal de esta forma:
Persona.contadorPersonas++;
Si contadorPersonas lo
declaramos como atributo private solo podremos acceder al atributo
desde fuera de la clase a través de métodos static. En ese caso podemos tener métodos
get y set para acceder a contadorPersonas que sean static además de un método
incrementarContador también static:
public class Persona {
private String nombre;
private int edad;
private static int contadorPersonas;
.......
public static int getContadorPersonas() {
return contadorPersonas;
}
public static void setContadorPersonas(int contadorPersonas) {
Persona.contadorPersonas = contadorPersonas;
}
public static void incrementarContador(){
contadorPersonas++;
}
. . . . .
}
En este caso, para
acceder desde fuera de la clase al contador de personas debemos usar:
Persona.metodoStatic
Por ejemplo:
System.out.println(Persona.getContadorPersonas());
La clase persona completa sería esta:
//Clase Persona
public class Persona {
private String nombre;
private int edad;
private static int contadorPersonas;
public Persona() {
}
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}
public void setNombre(String nom) {
nombre = nom;
}
public String getNombre() {
return nombre;
}
public void setEdad(int ed) {
edad = ed;
}
public int getEdad() {
return edad;
}
public static int getContadorPersonas() {
return contadorPersonas;
}
public static void setContadorPersonas(int contadorPersonas) {
Persona.contadorPersonas = contadorPersonas;
}
public static void incrementarContador() {
contadorPersonas++;
}
}
Ejemplo de uso de la clase Persona:
//Clase Principal
public class Estatico1 {
public static void main(String[] args) {
Persona p1 = new Persona("Tomás Navarra", 22);
Persona.incrementarContador();
Persona p3 = new Persona("Jonás Estacio", 23);
Persona.incrementarContador();
System.out.println("Se han creado: " + Persona.getContadorPersonas() + " personas");
}
}
Vemos en el ejemplo que cada vez que
se crea un nuevo objeto se incrementa el contador invocando al método
incrementarContador().
En lugar de invocar al método
incrementarContador() cada vez que se crea un objeto, es más correcto hacer el
incremento de la variable estática directamente en el constructor.
El código de la clase Persona y de la clase principal
quedaría ahora así:
//Clase Persona
public class Persona {
private String nombre;
private int edad;
private static int contadorPersonas;
public Persona() {
contadorPersonas++;
}
public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
contadorPersonas++;
}
public void setNombre(String nom) {
nombre = nom;
}
public String getNombre() {
return nombre;
}
public void setEdad(int ed) {
edad = ed;
}
public int getEdad() {
return edad;
}
public static int getContadorPersonas() {
return contadorPersonas;
}
public static void setContadorPersonas(int contadorPersonas) {
Persona.contadorPersonas = contadorPersonas;
}
}
//Clase Principal
public class Estatico1 {
public static void main(String[] args) {
Persona p1 = new Persona("Tomás Navarra", 22);
Persona p3 = new Persona("Jonás Estacio", 23);
System.out.println("Se han creado: " + Persona.getContadorPersonas() + " personas");
}
}
GRACIAS
ResponderEliminarmuy buen ejemplo. gracias
ResponderEliminarBuen ejemplo :D
ResponderEliminarmuy buen ejemplo me sirvio mucho.. :)
ResponderEliminarEste comentario ha sido eliminado por el autor.
ResponderEliminarExcelente :D
ResponderEliminarGracias ! :D
ResponderEliminarbuen ejemplo gracias
ResponderEliminarConfuso, confuso. hay que decodificarlo y entenderlo. Gracias.
ResponderEliminarbuen ejemplo
ResponderEliminarComo que no lo he digerido bien...
ResponderEliminarhttp://www.discoduroderoer.es/metodos-y-atributos-estaticos/
Eliminarno me ha quedado claro por que aveces se puede acceder a un metodo estatico desde otro metodo estatico como clase.metodo().metodo() alguien me lo puede explicar por favor se los agradeceria mucho
ResponderEliminarAmigo una pregunta: ¿Para que crear todos esos setter y getter si no se van a usar?
ResponderEliminarPara este ejemplo en concreto no haría falta crearlos ya que no se utilizan cuando se usa la clase.
EliminarQue significa si se hace la clase del tipo static
ResponderEliminarEs decir;
public static class ClaseEstatica{
// Código a realizar
// Me llamo la atención que la clase base no puede ser estática pero las interna si!!
}
como puedo contar los objetos pero sin pasar parametros al objeto..?
ResponderEliminarExcelente ejemplo. Me aclaró algunas dudas que tenía.
ResponderEliminarMuchas gracias, excelente servicio.
ResponderEliminar