Listado completo de tutoriales

64 - Atributos estáticos de una clase


En los primeros conceptos de POO (Programación Orientada a Objetos) dijimos que los atributos que se definen en una clase reservan espacio en forma independiente para cada instancia de la misma.

A diferencia de los anteriores los atributos estáticos tienen un comportamiento muy distinto a los atributos vistos hasta el momento. Un atributo estático reserva espacio para el mismo indistintamente que definamos un objeto de dicha clase. En caso de crear varios objetos de dicha clase todas las instancias acceden al mismo atributo estático.

Para declarar un atributo de tipo estático agregamos el modificador 'static' en su definición:

public class Matematica {
    public static float PI = 3.1416f;
}

public class Prueba {
    public static void main(String[] ar) {
        System.out.println(Matematica.PI);
    }
}

La clase Matematica define un atributo estático:

    public static float PI = 3.1416f;

Luego podemos acceder a dicho atributo directamente a través del nombre de la clase sin tener que crear un objeto de la clase 'Matematica':

        System.out.println(Matematica.PI);

Problema

Definir un atributo estático que almacene la cantidad de objetos creados de dicha clase.

Programa:

public class Persona {
    private String nombre;
    private int edad;
    public static int cantidad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
        cantidad++;
    }

    public void imprimir() {
        System.out.println(nombre + " " + edad);
    }
}

public class PruebaPersona {

    public static void main(String[] args) {
        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad);
        Persona per1 = new Persona("Juan", 30);
        per1.imprimir();
        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad);
        Persona per2 = new Persona("Ana", 20);
        per2.imprimir();
        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad);
        Persona per3 = new Persona("Luis", 10);
        per3.imprimir();
        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad);
    }

}

Un atributo estático de tipo entero se inicializa en cero cuando lo definimos (lo definimos de tipo public para poder acceder a su valor desde afuera de la clase):

    public static int cantidad;

Luego podemos consultarlo inclusive antes de crear un objeto de dicha clase:

        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad);

Cada vez que creamos un objeto de la clase Persona:

        Persona per1 = new Persona("Juan", 30);

Se incrementa en uno el atributo estático 'cantidad':

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
        cantidad++;
    }

No importa cuantos objeto de la clase Persona se creen luego existe un solo atributo cantidad:

        Persona per1 = new Persona("Juan", 30);
        Persona per2 = new Persona("Ana", 20);
        Persona per3 = new Persona("Luis", 10);

Creamos 3 objetos de la clase Persona y los tres comparten el mismo atributo 'cantidad'.

Un atributo estático se lo puede acceder tanto a través del nombre de la clase como a través del nombre de un objeto:

        Persona per1 = new Persona("Juan", 30);
        System.out.println("Valor del atributo estático cantidad:" + Persona.cantidad); // 1
        System.out.println("Valor del atributo estático cantidad:" + per1.cantidad);    // 1

Retornar