← CC2008

Clases y Objetos

Semestre 02, 2026

POO

Idea central

El mundo se percibe como una colección de objetos que interactúan para resolver problemas.

Bombilla

Atributos: consumo, estado (encendido/apagado).
Métodos: encender(), apagar().

Televisor

Atributos: tamaño, resolución, color.
Métodos: encender(), apagar(), cambiarCanal(), ajustarVolumen().

Representación

  • Los atributos se representan como variables a las que se les define un tipo de datos y un valor.
  • El comportamiento se representa como métodos a los que les definimos su tipo de retorno y parámetros.

Partes de un método


public double calcularArea(double base, double altura) {
    return base * altura;
}
Modificador: public
Tipo de retorno: double
Nombre: calcularArea
Parámetros: base, altura
Cuerpo: instrucciones (línea 2)

Clases

Definición

Una clase es una plantilla o modelo que define las características y comportamientos comunes de un conjunto de objetos.

Atributos: el estado.
Métodos: el comportamiento.

Encapsulamiento

  • Encapsular es proteger el estado interno del objeto.
  • Agrupa datos y operaciones dentro de la clase.
  • Oculta la implementación interna y expone una interfaz pública clara.
Seguridad
Flexibilidad

Caja Negra

Una clase encapsulada se usa como una caja negra: interactúas con su interfaz pública sin conocer ni depender de su implementación interna.

Modificadores de visibilidad

public: accesible desde cualquier parte.
private: solo accesible dentro de la clase.
protected: más adelante, cuando veamos herencia.

Los atributos suelen declararse privados, y se accede a ellos mediante métodos públicos: getters y setters.

Getters y setters

Idea

Como los atributos son privados, exponemos métodos públicos para leerlos y modificarlos de forma controlada.

Getter: devuelve el valor del atributo.
Setter: asigna un nuevo valor, y puede validar.

CuentaBancaria: encapsular el saldo


public class CuentaBancaria {
    private double saldo;

    // getter
    public double getSaldo() {
        return saldo;
    }

    // setter
    public void setSaldo(double cantidad) {
        saldo = cantidad;
    }
}
private double saldo;

El atributo saldo es privado: nadie puede leerlo ni modificarlo directamente desde fuera de la clase.

CuentaBancaria: encapsular el saldo


public class CuentaBancaria {
    private double saldo;

    // getter
    public double getSaldo() {
        return saldo;
    }

    // setter
    public void setSaldo(double cantidad) {
        saldo = cantidad;
    }
}
public double getSaldo() {
return saldo;

El getter expone el valor de forma controlada: permite leer el saldo sin dar acceso directo al atributo.

CuentaBancaria: encapsular el saldo


public class CuentaBancaria {
    private double saldo;

    // getter
    public double getSaldo() {
        return saldo;
    }

    // setter
    public void setSaldo(double cantidad) {
        saldo = cantidad;
    }
}
public void setSaldo(double cantidad) {
saldo = cantidad;

El setter permite modificar el saldo de forma controlada. Aquí podríamos validar (por ejemplo, rechazar valores negativos).

La clase Perro


class Perro {
    // atributos
    private String nombre;
    // getter
    public String getNombre() {
        return nombre;
    }
    // setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    // metodos
    public void ladrar() {
        System.out.println("¡Guau!");
    }
}
class Perro {

La clase Perro es la plantilla para crear objetos. Recorreremos sus partes: atributo, getter, setter y método.

La clase Perro


class Perro {
    // atributos
    private String nombre;
    // getter
    public String getNombre() {
        return nombre;
    }
    // setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    // metodos
    public void ladrar() {
        System.out.println("¡Guau!");
    }
}
private String nombre;

El atributo nombre guarda el estado del objeto. Es privado (encapsulado) y de tipo String.

La clase Perro


class Perro {
    // atributos
    private String nombre;
    // getter
    public String getNombre() {
        return nombre;
    }
    // setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    // metodos
    public void ladrar() {
        System.out.println("¡Guau!");
    }
}
public String getNombre() {
return nombre;

El getter devuelve el valor del atributo: permite leer el nombre desde fuera de la clase.

La clase Perro


class Perro {
    // atributos
    private String nombre;
    // getter
    public String getNombre() {
        return nombre;
    }
    // setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    // metodos
    public void ladrar() {
        System.out.println("¡Guau!");
    }
}
public void setNombre(String nombre) {
this.nombre = nombre;

El setter asigna un nuevo valor al atributo. this.nombre es el atributo; nombre es el parámetro que recibe.

La clase Perro


class Perro {
    // atributos
    private String nombre;
    // getter
    public String getNombre() {
        return nombre;
    }
    // setter
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }
    // metodos
    public void ladrar() {
        System.out.println("¡Guau!");
    }
}
public void ladrar() {
System.out.println("¡Guau!");

El método ladrar() es el comportamiento del objeto: imprime un ladrido. void significa que no devuelve nada.

Objetos

  • Un objeto es una entidad que se genera en base a una clase. Es una instancia concreta de una clase.
  • Es la unidad básica en la programación orientada a objetos.

Instanciar

Definición

Instanciar una clase es el proceso de crear un nuevo objeto en base a ella. Se utiliza la palabra reservada new.

Usar la clase Perro


Perro miPerro = new Perro();
miPerro.setNombre("Scooby Doo");
miPerro.ladrar();
Perro miPerro = new Perro();

Creamos un objeto Perro con new. miPerro es la referencia al objeto; aún no tiene nombre.

Usar la clase Perro


Perro miPerro = new Perro();
miPerro.setNombre("Scooby Doo");
miPerro.ladrar();
miPerro.setNombre("Scooby Doo");

Usamos el setter para asignarle el nombre al perro después de crearlo.

Usar la clase Perro


Perro miPerro = new Perro();
miPerro.setNombre("Scooby Doo");
miPerro.ladrar();
miPerro.ladrar();

Invocamos el método ladrar() sobre el objeto: imprime "¡Guau!" en consola.

Clase vs. Objeto

Clase: estructura común

CuentaBancaria
- saldo: double
Objeto: instancia concreta

cuentaJuan  -> saldo = Q500.00
cuentaMaria -> saldo = Q1500.00

Un plano, mil casas

La clase es el plano: define cómo son las casas.
Los objetos son las casas: muchas, construidas a partir del mismo plano.

Con un solo plano (la clase) se construyen mil casas (los objetos), cada una con sus propios valores.

Muchos atributos, muchos setters


class Perro {
    private String nombre;
    private String raza;
    private int edad;

    public String getNombre() { return nombre; }
    public void setNombre(String nombre) { this.nombre = nombre; }

    public String getRaza() { return raza; }
    public void setRaza(String raza) { this.raza = raza; }

    public int getEdad() { return edad; }
    public void setEdad(int edad) { this.edad = edad; }
}
El problema

Cada atributo necesita su getter y su setter. Tres atributos ya son seis métodos; con más atributos, más código repetitivo.

No todo cambia

nombre: se asigna al inicio.
raza: no cambia nunca.
edad: sí cambia con el tiempo.

Si la raza no cambia, un setRaza() sobra: deja la puerta abierta a modificar algo que debería ser fijo.

La idea de un setUp


public void setUp(String nombre, String raza, int edad) {
    this.nombre = nombre;
    this.raza = raza;
    this.edad = edad;
}
Pero…

Un solo método asigna todo de una vez. Pero setUp es público: se puede llamar en cualquier momento y volver a cambiar los valores. La puerta sigue abierta.

El constructor


class Perro {
    private String nombre;
    private String raza;
    private int edad;

    // constructor
    public Perro(String nombre, String raza, int edad) {
        this.nombre = nombre;
        this.raza = raza;
        this.edad = edad;
    }
}
La solución

El constructor se ejecuta automáticamente al crear el objeto y asigna todo de una vez. Lleva el mismo nombre que la clase y no tiene tipo de retorno. Sin setters, los valores quedan fijos: el objeto nace válido.

Crear el perro en una línea


Perro miPerro = new Perro("Scooby Doo", "Gran Danés", 5);

Un solo paso: new ejecuta el constructor y el perro queda listo, con todos sus atributos y sin necesidad de setters.

Características del constructor

Mismo nombre que la clase.
No tienen tipo de retorno.
Se llaman automáticamente.
Se pueden sobrecargar.

Constructor o setters

La clave

Si un atributo se define al crear el objeto y no va a cambiar después, el constructor basta: no necesitas un setter.

Con setter: el valor puede cambiar en cualquier momento.
Solo con constructor: el valor se fija al crear y queda estable.

UML

  • UML = Unified Modeling Language.
  • Es un estándar.
  • Herramienta para representar gráficamente clases, objetos y relaciones.
  • Creado en los años 90 por Grady Booch, Ivar Jacobson y James Rumbaugh como unificación de varios métodos de modelado.

Utilidad de UML

  • Ayuda a entender la estructura y el comportamiento de un sistema sin leer código.
  • Facilita identificar clases, atributos, métodos y relaciones antes de escribir código.
  • Al diseñar el sistema visualmente, es más fácil detectar problemas de arquitectura.

Diagrama de clase básico


+----------------------------+
| CuentaBancaria             |
+----------------------------+
| - saldo: double            |
| - numero: int              |
+----------------------------+
| + depositar(monto): void   |
| + retirar(monto): void     |
+----------------------------+
  • Compartimento 1: nombre de la clase.
  • Compartimento 2: atributos (- = privado).
  • Compartimento 3: métodos (+ = público).