Saltar a contenido

Semana 5 - Métodos Generales de una Clase en Java

Introducción

En Java, una clase es la base de la programación orientada a objetos (POO), y los métodos son las acciones o comportamientos que los objetos creados a partir de esa clase pueden realizar. Entre los elementos clave de una clase están los constructores, la sobrecarga de métodos y constructores, y el uso del operador this. Este documento explica estos conceptos en detalle, con ejemplos prácticos, como el manejo de datos de estudiantes en un sistema educativo.


1. Constructores

¿Qué es un constructor?

Un constructor es un método especial dentro de una clase que se utiliza para inicializar objetos. Se ejecuta automáticamente cuando se crea una instancia de la clase con el operador new. Los constructores tienen las siguientes características:

  • Tienen el mismo nombre que la clase.
  • No tienen tipo de retorno, ni siquiera void.
  • Pueden ser públicos, privados, o tener otros modificadores de acceso.
  • Si no se define un constructor, Java proporciona un constructor por defecto sin parámetros que inicializa los atributos con valores predeterminados.

Ejemplo: Constructor en un sistema educativo

Imagina que estás desarrollando un sistema para una universidad en Colombia, donde necesitas gestionar información de estudiantes, como su nombre, número de identificación (por ejemplo, cédula o DNI), y promedio académico.

public class Estudiante {
    // Atributos
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    // Constructor
    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    // Método para mostrar información
    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Número de Identificación: " + numeroIdentificacion);
        System.out.println("Promedio Académico: " + promedioAcademico);
    }
}

En este ejemplo: - El constructor Estudiante inicializa los atributos nombre, numeroIdentificacion y promedioAcademico. - Se usa el operador this para diferenciar los parámetros del constructor de los atributos de la clase. - El método mostrarInformacion permite mostrar los datos del estudiante.

Uso del constructor

public class Main {
    public static void main(String[] args) {
        // Crear un objeto Estudiante
        Estudiante estudiante1 = new Estudiante("María López", "12345678", 8.5);
        estudiante1.mostrarInformacion();
    }
}

Salida:

Nombre: María López
Número de Identificación: 12345678
Promedio Académico: 8.5

Constructor por defecto

Si no defines un constructor, Java crea uno automáticamente. Por ejemplo:

public Estudiante() {
    // Atributos con valores por defecto
    nombre = "";
    numeroIdentificacion = "";
    promedioAcademico = 0.0;
}


2. Sobrecarga de Métodos y Constructores

¿Qué es la sobrecarga?

La sobrecarga (overloading) permite definir múltiples métodos o constructores con el mismo nombre, pero con diferentes parámetros (en número, tipo o ambos). Esto es útil para ofrecer flexibilidad al usuario de la clase, permitiendo diferentes formas de inicializar un objeto o invocar un método.

Reglas de la sobrecarga

  • Los métodos o constructores deben tener el mismo nombre.
  • Deben diferir en la cantidad o el tipo de parámetros.
  • El tipo de retorno no afecta la sobrecarga (en métodos, no aplica a constructores).
  • Java determina qué método o constructor ejecutar según los argumentos proporcionados.

Ejemplo: Sobrecarga de constructores

En el contexto de un sistema educativo, podrías necesitar inicializar un objeto Estudiante de diferentes maneras: con todos los datos, solo con nombre e identificación, o con valores por defecto.

public class Estudiante {
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    // Constructor completo
    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    // Constructor con nombre e identificación
    public Estudiante(String nombre, String numeroIdentificacion) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = 0.0; // Valor por defecto
    }

    // Constructor por defecto
    public Estudiante() {
        this.nombre = "Sin nombre";
        this.numeroIdentificacion = "Sin identificación";
        this.promedioAcademico = 0.0;
    }

    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Número de Identificación: " + numeroIdentificacion);
        System.out.println("Promedio Académico: " + promedioAcademico);
    }
}

Uso de los constructores sobrecargados

public class Main {
    public static void main(String[] args) {
        // Usar constructor completo
        Estudiante estudiante1 = new Estudiante("Juan Pérez", "98765432", 9.0);
        estudiante1.mostrarInformacion();

        // Usar constructor con nombre e identificación
        Estudiante estudiante2 = new Estudiante("Ana Gómez", "45678912");
        estudiante2.mostrarInformacion();

        // Usar constructor por defecto
        Estudiante estudiante3 = new Estudiante();
        estudiante3.mostrarInformacion();
    }
}

Salida:

Nombre: Juan Pérez
Número de Identificación: 98765432
Promedio Académico: 9.0

Nombre: Ana Gómez
Número de Identificación: 45678912
Promedio Académico: 0.0

Nombre: Sin nombre
Número de Identificación: Sin identificación
Promedio Académico: 0.0

Sobrecarga de métodos

Además de constructores, puedes sobrecargar métodos. Por ejemplo, un método para calcular el estado académico del estudiante según su promedio o según una escala personalizada.

public class Estudiante {
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    // Método sobrecargado: Estado académico estándar (escala de 0 a 10)
    public String calcularEstadoAcademico() {
        if (promedioAcademico >= 6.0) {
            return "Aprobado";
        } else {
            return "Reprobado";
        }
    }

    // Método sobrecargado: Estado académico con escala personalizada
    public String calcularEstadoAcademico(double notaMinimaAprobacion) {
        if (promedioAcademico >= notaMinimaAprobacion) {
            return "Aprobado con nota mínima de " + notaMinimaAprobacion;
        } else {
            return "Reprobado con nota mínima de " + notaMinimaAprobacion;
        }
    }

    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Número de Identificación: " + numeroIdentificacion);
        System.out.println("Promedio Académico: " + promedioAcademico);
    }
}

Uso de los métodos sobrecargados

public class Main {
    public static void main(String[] args) {
        Estudiante estudiante = new Estudiante("Carlos Ramírez", "12345678", 7.5);
        estudiante.mostrarInformacion();

        // Usar método sin parámetros
        System.out.println("Estado: " + estudiante.calcularEstadoAcademico());

        // Usar método con escala personalizada
        System.out.println("Estado (nota mínima 8.0): " + estudiante.calcularEstadoAcademico(8.0));
    }
}

Salida:

Nombre: Carlos Ramírez
Número de Identificación: 12345678
Promedio Académico: 7.5
Estado: Aprobado
Estado (nota mínima 8.0): Reprobado con nota mínima de 8.0


3. Uso del Operador this

¿Qué es el operador this?

El operador this es una referencia al objeto actual de la clase. Se utiliza para:

  • Diferenciar atributos de parámetros: Cuando los nombres de los parámetros del constructor o método coinciden con los nombres de los atributos de la clase.
  • Llamar a otros constructores dentro de la misma clase (constructor chaining).
  • Pasar el objeto actual como argumento a otro método.

Ejemplo: Uso de this para diferenciar atributos y parámetros

En el constructor de la clase Estudiante, usamos this para evitar ambigüedad entre los parámetros y los atributos.

public class Estudiante {
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre; // this.nombre se refiere al atributo, nombre al parámetro
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    public void mostrarInformacion() {
        System.out.println("Nombre: " + this.nombre); // Uso opcional de this
        System.out.println("Número de Identificación: " + this.numeroIdentificacion);
        System.out.println("Promedio Académico: " + this.promedioAcademico);
    }
}

Ejemplo: Uso de this para constructor chaining

El constructor chaining permite reutilizar constructores dentro de la misma clase, reduciendo código duplicado.

public class Estudiante {
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    // Constructor por defecto
    public Estudiante() {
        this("Sin nombre", "Sin identificación", 0.0); // Llama al constructor completo
    }

    // Constructor con nombre e identificación
    public Estudiante(String nombre, String numeroIdentificacion) {
        this(nombre, numeroIdentificacion, 0.0); // Llama al constructor completo
    }

    // Constructor completo
    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Número de Identificación: " + numeroIdentificacion);
        System.out.println("Promedio Académico: " + promedioAcademico);
    }
}

Uso del constructor chaining

public class Main {
    public static void main(String[] args) {
        Estudiante estudiante1 = new Estudiante(); // Usa constructor por defecto
        estudiante1.mostrarInformacion();

        Estudiante estudiante2 = new Estudiante("Sofía Martínez", "11223344"); // Usa constructor con nombre e identificación
        estudiante2.mostrarInformacion();
    }
}

Salida:

Nombre: Sin nombre
Número de Identificación: Sin identificación
Promedio Académico: 0.0

Nombre: Sofía Martínez
Número de Identificación: 11223344
Promedio Académico: 0.0

Ejemplo: Uso de this para pasar el objeto actual

Supongamos que el sistema educativo necesita registrar a un estudiante en un curso, pasando el objeto Estudiante a otro método.

public class Curso {
    public void registrarEstudiante(Estudiante estudiante) {
        System.out.println("Estudiante " + estudiante.getNombre() + " registrado en el curso.");
    }
}

public class Estudiante {
    private String nombre;
    private String numeroIdentificacion;
    private double promedioAcademico;

    public Estudiante(String nombre, String numeroIdentificacion, double promedioAcademico) {
        this.nombre = nombre;
        this.numeroIdentificacion = numeroIdentificacion;
        this.promedioAcademico = promedioAcademico;
    }

    public String getNombre() {
        return nombre;
    }

    public void inscribirseEnCurso(Curso curso) {
        curso.registrarEstudiante(this); // Pasa el objeto actual
    }

    public void mostrarInformacion() {
        System.out.println("Nombre: " + nombre);
        System.out.println("Número de Identificación: " + numeroIdentificacion);
        System.out.println("Promedio Académico: " + promedioAcademico);
    }
}

Uso del método con this

public class Main {
    public static void main(String[] args) {
        Estudiante estudiante = new Estudiante("Lucía Fernández", "55667788", 8.7);
        Curso curso = new Curso();
        estudiante.inscribirseEnCurso(curso);
    }
}

Salida:

Estudiante Lucía Fernández registrado en el curso.