class Rekening {
    private final String pemilik;
    private double saldo;

    public Rekening(String pemilik, double saldoAwal) {
        this.pemilik = pemilik;
        this.saldo = saldoAwal;
        System.out.println("[cipta] Rekening " + pemilik + " dibuat");
    }

    public void setor(double jumlah) {
        saldo += jumlah;
        System.out.println("[pakai] " + pemilik + " setor Rp" + (int) jumlah);
    }

    public double saldo() {
        return saldo;
    }
}

public class TahapanSiklus {
    public static void main(String[] args) {
        // Tahap 1: penciptaan — alokasi memori, inisialisasi field, constructor.
        Rekening rekening = new Rekening("Budi", 500000);

        // Tahap 2: pemakaian — objek diakses lewat referensinya.
        rekening.setor(250000);
        System.out.println("[pakai] saldo sekarang: Rp" + (int) rekening.saldo());

        // Alias: dua variabel menunjuk objek yang sama.
        Rekening alias = rekening;
        alias.setor(50000);
        System.out.println("[pakai] saldo lewat rekening: Rp" + (int) rekening.saldo());

        // Tahap 3: referensi dilepas satu per satu.
        alias = null;
        System.out.println("[lepas] alias = null; objek masih dipegang rekening");
        rekening = null;
        System.out.println("[lepas] rekening = null; objek eligible untuk GC");
    }
}
