Programación Orientada a Objetos (POO)

Clases y objetos

En Java, las clases son plantillas para crear objetos. Los objetos son instancias específicas de una clase que pueden contener datos y métodos relacionados. Aquí hay un ejemplo básico de cómo se definen clases y se crean objetos en Java.

Código del Programa

				
					// Definición de la clase Persona
class Persona {
    // Atributos
    String nombre;
    int edad;

    // Método constructor
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    // Método
    public void saludar() {
        System.out.println("Hola, soy " + nombre + " y tengo " + edad + " años.");
    }
}

public class ClasesYObjetos {
    public static void main(String[] args) {
        // Creación de objetos
        Persona persona1 = new Persona("Juan", 30);
        Persona persona2 = new Persona("María", 25);

        // Acceso a atributos y métodos de los objetos
        System.out.println("Nombre de persona1: " + persona1.nombre);
        System.out.println("Edad de persona2: " + persona2.edad);

        persona1.saludar();
        persona2.saludar();
    }
}

				
			

Explicación del Código

  1. Definición de la Clase Persona:

    • Se define una clase Persona con dos atributos (nombre y edad) y un constructor que inicializa estos atributos.
  2. Creación de Objetos:

    • Se crean dos objetos persona1 y persona2 utilizando el constructor de la clase Persona.
  3. Acceso a Atributos y Métodos:

    • Se accede a los atributos y métodos de los objetos utilizando el operador ..
    • Se imprime el nombre y la edad de cada persona, y luego se llama al método saludar() para cada objeto.

Métodos y sobrecarga de métodos

En Java, los métodos son bloques de código que realizan una tarea específica. La sobrecarga de métodos es la capacidad de tener varios métodos con el mismo nombre en una clase, pero con diferentes parámetros.

Código del Programa

				
					class Operaciones {

    // Método sumar para dos números enteros
    public int sumar(int a, int b) {
        return a + b;
    }

    // Método sumar para tres números enteros
    public int sumar(int a, int b, int c) {
        return a + b + c;
    }

    // Método sumar para dos números decimales
    public double sumar(double a, double b) {
        return a + b;
    }

    // Método sumar para un número entero y un número decimal
    public double sumar(int a, double b) {
        return a + b;
    }
}

public class MetodosYSobrecarga {
    public static void main(String[] args) {
        Operaciones operaciones = new Operaciones();

        // Ejemplos de llamadas a los métodos
        System.out.println("Suma de 5 y 3: " + operaciones.sumar(5, 3));
        System.out.println("Suma de 5, 3 y 2: " + operaciones.sumar(5, 3, 2));
        System.out.println("Suma de 2.5 y 3.5: " + operaciones.sumar(2.5, 3.5));
        System.out.println("Suma de 5 y 2.5: " + operaciones.sumar(5, 2.5));
    }
}

				
			

Explicación del Código

  1. Definición de la Clase Operaciones:

    • Se define una clase Operaciones que contiene varios métodos llamados sumar.
  2. Sobrecarga de Métodos:

    • Se definen varios métodos sumar con el mismo nombre pero diferentes tipos o números de parámetros.
    • Java determina qué método llamar según la cantidad y tipos de argumentos que se pasan.
  3. Llamadas a los Métodos:

    • Se realizan diferentes llamadas a los métodos sumar con diferentes argumentos.

Constructores

En Java, un constructor es un tipo especial de método que se utiliza para inicializar objetos. Se llama automáticamente cuando se crea un objeto de una clase. Aquí tienes un ejemplo de cómo se utilizan los constructores en Java.

Código del Programa

				
					class Persona {
    String nombre;
    int edad;

    // Constructor por defecto
    public Persona() {
        nombre = "Sin nombre";
        edad = 0;
    }

    // Constructor con parámetros
    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    // Método para mostrar información de la persona
    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Edad: " + edad);
    }
}

public class Constructores {
    public static void main(String[] args) {
        // Creación de objetos utilizando diferentes constructores
        Persona persona1 = new Persona();
        Persona persona2 = new Persona("Juan", 30);

        // Mostrar información de las personas
        System.out.println("Persona 1:");
        persona1.mostrarInformacion();

        System.out.println("\nPersona 2:");
        persona2.mostrarInformacion();
    }
}

				
			

Explicación del Código

  1. Definición de la Clase Persona:

    • Se define una clase Persona con dos atributos (nombre y edad).
  2. Constructores:

    • Se define un constructor por defecto que inicializa los atributos con valores predeterminados.
    • Se define un constructor con parámetros que permite inicializar los atributos con valores específicos al crear el objeto.
  3. Uso de Constructores:

    • Se crean objetos persona1 y persona2 utilizando diferentes constructores.
    • Cuando se crea un objeto, se llama automáticamente al constructor correspondiente.

Herencia

La herencia es un concepto fundamental en la programación orientada a objetos que permite a una clase heredar atributos y métodos de otra clase. En Java, se implementa utilizando la palabra clave extends. Veamos un ejemplo:

Código del Programa

				
					// Clase base o superclase
class Animal {
    String nombre;

    public Animal(String nombre) {
        this.nombre = nombre;
    }

    public void comer() {
        System.out.println(nombre + " está comiendo.");
    }
}

// Clase derivada o subclase
class Perro extends Animal {
    public Perro(String nombre) {
        super(nombre); // Llama al constructor de la superclase
    }

    public void ladrar() {
        System.out.println(nombre + " está ladrando.");
    }
}

public class Herencia {
    public static void main(String[] args) {
        Perro miPerro = new Perro("Bobby");
        miPerro.comer(); // Método heredado de la clase Animal
        miPerro.ladrar(); // Método propio de la clase Perro
    }
}

				
			

Explicación del Código

  1. Definición de la Clase Animal:

    • Animal es la superclase que tiene un atributo nombre y un método comer.
  2. Definición de la Clase Perro:

    • Perro es una subclase de Animal que hereda el atributo nombre y el método comer.
    • Además, tiene su propio método ladrar.
  3. Constructor de la Subclase:

    • El constructor de la subclase Perro llama al constructor de la superclase Animal usando super(nombre).
  4. Creación de Objetos:

    • Se crea un objeto miPerro de la clase Perro.
    • El objeto puede acceder tanto a los métodos heredados de la superclase como a sus propios métodos.

Polimorfismo

El polimorfismo es otro concepto importante en la programación orientada a objetos que permite a los objetos de diferentes clases responder al mismo mensaje de manera diferente. Esto se logra mediante el uso de métodos con el mismo nombre pero con comportamientos diferentes en las clases hijas.

Código del Programa

				
					// Clase base o superclase
class Animal {
    public void hacerSonido() {
        System.out.println("El animal hace un sonido.");
    }
}

// Clase derivada o subclase
class Perro extends Animal {
    @Override
    public void hacerSonido() {
        System.out.println("El perro ladra.");
    }
}

// Otra subclase
class Gato extends Animal {
    @Override
    public void hacerSonido() {
        System.out.println("El gato maulla.");
    }
}

public class Polimorfismo {
    public static void main(String[] args) {
        Animal miAnimal;

        miAnimal = new Perro();
        miAnimal.hacerSonido(); // Salida: El perro ladra

        miAnimal = new Gato();
        miAnimal.hacerSonido(); // Salida: El gato maulla
    }
}

				
			

Explicación del Código

  1. Definición de Clases:

    • Se define una clase base Animal con un método hacerSonido().
    • Se definen dos subclases Perro y Gato que sobrescriben el método hacerSonido() con comportamientos específicos.
  2. Polimorfismo:

    • Se crea una referencia de tipo Animal que puede apuntar a objetos de cualquier subclase.
    • Se llama al método hacerSonido() a través de la referencia miAnimal, y el comportamiento específico de cada subclase es ejecutado.
  3. Anulación de Métodos (Override):

    • Las subclases anulan el método hacerSonido() de la superclase para proporcionar su propia implementación.

Abstracción y clases abstractas

La abstracción es el proceso de ocultar los detalles de implementación y mostrar solo la funcionalidad relevante de un objeto. En Java, se puede lograr la abstracción utilizando clases abstractas e interfaces. Una clase abstracta es una clase que no se puede instanciar y que puede contener métodos abstractos y concretos.

Código del Programa

				
					// Clase abstracta
abstract class Animal {
    String nombre;

    public Animal(String nombre) {
        this.nombre = nombre;
    }

    // Método abstracto (sin implementación)
    public abstract void hacerSonido();

    // Método concreto
    public void dormir() {
        System.out.println(nombre + " está durmiendo.");
    }
}

// Subclase que extiende la clase abstracta
class Perro extends Animal {
    public Perro(String nombre) {
        super(nombre);
    }

    // Implementación del método abstracto
    @Override
    public void hacerSonido() {
        System.out.println("El perro ladra.");
    }
}

public class AbstraccionYClasesAbstractas {
    public static void main(String[] args) {
        // No se puede crear una instancia de Animal (clase abstracta)
        // Animal miAnimal = new Animal("Animal");

        // Se puede crear una instancia de Perro (subclase de Animal)
        Perro miPerro = new Perro("Bobby");
        miPerro.hacerSonido(); // Salida: El perro ladra
        miPerro.dormir();      // Salida: Bobby está durmiendo
    }
}

				
			

Explicación del Código

  1. Clase Abstracta:

    • Se define una clase abstracta Animal que contiene un atributo nombre, un constructor y un método abstracto hacerSonido().
    • La clase también tiene un método concreto dormir() con implementación.
  2. Método Abstracto:

    • El método hacerSonido() en la clase Animal es un método abstracto, que significa que no tiene implementación en la clase abstracta.
  3. Clase Derivada:

    • Se define una subclase Perro que extiende la clase abstracta Animal.
    • Se implementa el método abstracto hacerSonido() en la subclase.
  4. Uso de la Clase Abstracta:

    • No se puede crear una instancia de una clase abstracta, pero se puede crear una instancia de la subclase.