Menu
CoddyTech

Variables de instancia vs. estáticas

Parte de la sección Programación Orientada a Objetos del Journey de Java de Coddy. Lección 15 de 87.

Hasta ahora, cada campo que hemos creado pertenece a un objeto específico. Cada BankAccount tiene su propio balance, y cada Product tiene su propio name. Estas son variables de instancia: existen por separado para cada instancia de una clase.

Pero ¿qué ocurre si necesitas datos compartidos entre todos los objetos? Ahí es donde entran las variables estáticas (también llamadas variables de clase). Una variable estática pertenece a la propia clase, no a ningún objeto en particular.

public class Student {
    private String name;           // Variable de instancia - única por estudiante
    private static int totalCount; // Variable estática - compartida por todos los estudiantes
    public Student(String name) {
        this.name = name;
        totalCount++;  // Incrementa el contador compartido
    }
    public static int getTotalCount() {
        return totalCount;
    }
}

Cuando creas varios estudiantes, cada uno tiene su propio name, pero todos comparten el mismo totalCount:

Student s1 = new Student("Alice");
Student s2 = new Student("Bob");
System.out.println(Student.getTotalCount());  // Salida: 2

Observa cómo accedemos a la variable estática mediante el nombre de la clase (Student.getTotalCount()) en lugar de hacerlo mediante un objeto. Esto enfatiza que los miembros estáticos pertenecen a la clase, no a las instancias.

Usa variables de instancia para los datos que varían entre objetos (como el nombre de un estudiante). Usa variables estáticas para los datos que deben compartirse (como contar cuántos objetos existen).

challenge icon

Desafío

Fácil

Construyamos un sistema de inventario de Book que registre tanto los detalles de cada libro como el número total de libros de toda tu colección mediante variables de instancia y estáticas.

Crearás dos archivos para organizar tu código:

  • Book.java: Crea una clase Book que registre la información de cada libro y, al mismo tiempo, mantenga el recuento de todos los libros creados:
    • Una variable de instancia title (String), única para cada libro
    • Una variable de instancia price (double), única para cada libro
    • Una variable estática totalBooks (int), compartida entre todos los objetos Book, que registra cuántos libros se han creado
    • Un constructor que reciba el título y el precio, e incremente el recuento total de libros
    • Un getter getTitle() para el título
    • Un getter getPrice() para el precio
    • Un método estático getTotalBooks() que devuelva el número total de libros creados
  • Main.java: Crea varios objetos Book y demuestra cómo el contador estático registra todas las instancias. Recibirás tres títulos de libros y tres precios como entradas. Después de crear los tres libros, imprime cuatro líneas:
    • El título y el precio de cada libro con el formato: [title]: $[price] (el precio debe tener 2 decimales)
    • El número total de libros mediante el método estático: Total books: [count]

Recibirás seis entradas en este orden: title1, price1, title2, price2, title3, price3.

Recuerda acceder al método estático mediante el nombre de la clase (Book.getTotalBooks()) en lugar de hacerlo mediante una instancia de objeto. Para dar formato a los precios, utiliza String.format("%.2f", price).

Pruébalo tú mismo

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Lee las entradas para tres libros
        String title1 = scanner.nextLine();
        double price1 = Double.parseDouble(scanner.nextLine());
        String title2 = scanner.nextLine();
        double price2 = Double.parseDouble(scanner.nextLine());
        String title3 = scanner.nextLine();
        double price3 = Double.parseDouble(scanner.nextLine());
        
        // TODO: Crea tres objetos Book usando las entradas de arriba
        
        // TODO: Imprime el título y el precio de cada libro en el formato: [title]: $[price]
        // Usa String.format("%.2f", price) para formatear el precio a 2 decimales
        
        // TODO: Imprime el número total de libros usando el método estático
        // Format: Total books: [count]
        // Recuerda acceder al método estático a través del nombre de la clase: Book.getTotalBooks()
    }
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Java online