Contenido

Introducción a la programación orientada a objetos (POO)

La programación orientada a objetos (POO) es un paradigma de programación que se basa en el concepto de «objetos», los cuales pueden contener tanto datos en forma de atributos como código en forma de métodos. La POO se centra en la creación de objetos que interactúan entre sí para resolver problemas y modelar el mundo real de manera más natural y eficiente.

Clases y objetos en Java

En Java, una clase es como un plano o una plantilla que define cómo se verá y se comportará un objeto. Puedes pensar en una clase como un diseño para construir algo, como un plano para construir un coche. La clase describe qué propiedades (o características) y qué comportamientos (o acciones) tendrán los coches que se creen a partir de ella.

Por ejemplo, si tienes una clase llamada «Coche», esta podría tener propiedades como «marca», «modelo» y «color», que describen las características del coche. Además, la clase podría tener comportamientos como «arrancar», «detenerse» y «acelerar», que representan las acciones que un coche puede realizar.

Cuando creas un objeto a partir de una clase (también conocido como instancia de clase), estás utilizando esa plantilla para construir una versión específica del objeto. Es como si tomaras un plano para construir un coche y lo utilizaras para construir un coche real. Cada vez que creas un nuevo objeto a partir de esa clase, estás fabricando un nuevo coche que sigue la misma descripción, pero que puede tener valores diferentes para sus propiedades.

Las clases son fundamentales en la programación orientada a objetos en Java porque te permiten organizar tu código de una manera lógica y modular. Puedes agrupar propiedades y comportamientos relacionados en una sola clase, lo que hace que tu código sea más fácil de entender y de mantener.

Además, las clases en Java promueven la reutilización del código. Una vez que has creado una clase para representar un concepto en tu programa, puedes reutilizar esa clase en diferentes partes de tu código o incluso en diferentes programas. Es como tener un plano de un coche que puedes utilizar una y otra vez para construir diferentes coches según necesites.

En resumen, las clases en Java son como planos o plantillas que definen cómo se verán y se comportarán los objetos en tu programa. Son fundamentales para organizar y estructurar tu código de manera modular y reutilizable, lo que facilita el desarrollo y el mantenimiento de tus aplicaciones.

Ahora, veamos un ejemplo sencillo de una clase en Java que representa un coche:

				
					// Declaración de variables
public class Coche {

    // Variables de la clase
    String marca;
    String modelo;
    int año;
    
    // Constructor
    public Coche(String marca, String modelo, int año) {
        this.marca = marca;
        this.modelo = modelo;
        this.año = año;
    }
    
    // Método para obtener la información del coche
    public void obtenerInformacion() {
        System.out.println("Marca: " + marca);
        System.out.println("Modelo: " + modelo);
        System.out.println("Año: " + año);
    }
    
    // Método para encender el coche
    public void encender() {
        System.out.println("El coche está encendido.");
    }
}

				
			

En este ejemplo, la clase Coche tiene tres variables miembro (marca, modelo, año), un constructor que inicializa estas variables, y dos métodos (obtenerInformacion() y encender()).

Explicación paso a paso del código:

  1. Declaración de la clase: Se declara una clase llamada Coche utilizando la palabra clave public que indica que la clase es accesible desde cualquier otra clase. La clase comienza con una llave de apertura { y termina con una llave de cierre }.

  2. Variables de la clase: Dentro de la clase se declaran tres variables de instancia (también llamadas campos o propiedades) que representan las características de un coche: marca, modelo y año. Estas variables se declaran sin inicializarlas, lo que significa que están vacías al principio.

  3. Constructor: Se define un constructor público para la clase Coche. El constructor tiene el mismo nombre que la clase (Coche) y toma tres parámetros (marca, modelo y año). Cuando se crea un objeto Coche, este constructor se utiliza para inicializar sus variables de instancia con los valores proporcionados. El operador this se utiliza para distinguir entre los parámetros del constructor y las variables de instancia de la clase.

  4. Método obtenerInformacion(): Se define un método público llamado obtenerInformacion() que no devuelve ningún valor (void). Este método imprime la información del coche en la consola, incluyendo la marca, el modelo y el año del coche. Cada variable de instancia se concatena con una cadena de texto para formar el mensaje de salida.

  5. Método encender(): Se define otro método público llamado encender() que tampoco devuelve ningún valor (void). Este método imprime un mensaje indicando que el coche está encendido.

Ahora supongamos que queremos  crear un objeto de la clase Coche con la marca BMW, modelo E36 y del año 1995:

				
					public class Main {
    public static void main(String[] args) {
        // Crear un objeto coche con la marca "BMW", modelo "E36" y año 1995
        Coche miCoche = new Coche("BMW", "E36", 1995);
        
        // Llamar al método para obtener información del coche
        miCoche.obtenerInformacion();
        
        // Llamar al método para encender el coche
        miCoche.encender();
    }
}

				
			

En este ejemplo, primero creamos un objeto Coche llamado miCoche utilizando el constructor. Pasamos los valores «BMW«, «E36» y 1995 como argumentos al constructor para inicializar las variables de instancia marca, modelo y año.

Luego, llamamos al método obtenerInformacion() del objeto miCoche para imprimir la información del coche en la consola, que mostrará:

				
					Marca: BMW
Modelo: E36
Año: 1995

				
			

Finalmente, llamamos al método encender() del objeto miCoche para imprimir un mensaje indicando que el coche está encendido, que mostrará:

				
					El coche está encendido.

				
			

Este código demuestra cómo crear un objeto de la clase Coche con valores específicos para sus propiedades y cómo llamar a los métodos de ese objeto para realizar acciones y obtener información sobre el coche creado.

Tipos de clases en Java

Existen diferentes tipos de clases en Java, que pueden clasificarse según su funcionalidad:

  1. Clases de entidad: Representan objetos del mundo real y contienen propiedades y comportamientos relacionados con esos objetos. Ejemplos: Coche, Persona, Libro.

  2. Clases utilitarias: Contienen métodos estáticos para realizar operaciones útiles, como manipulación de cadenas, cálculos matemáticos, manipulación de fechas, etc. Ejemplos: Math, StringUtils, DateUtils.

  3. Clases de servicio: Proveen funcionalidades específicas o servicios para otras partes de la aplicación. Ejemplos: ServicioDeCorreo, ServicioDeBaseDeDatos, ServicioDeAutenticación.

  4. Clases de controladores: Controlan el flujo de la aplicación y coordinan las interacciones entre las clases de entidad y las vistas. Ejemplos: ControladorDeUsuario, ControladorDePedido.

 

Métodos y atributos

Los métodos en Java son funciones definidas dentro de una clase que realizan operaciones específicas. Pueden acceder y manipular los atributos de la clase y realizar diversas acciones. Los atributos son variables que almacenan datos asociados a los objetos de la clase. Juntos, los métodos y atributos definen el comportamiento y las características de los objetos.

  • Atributos (también conocidos como campos o variables de instancia):

Los atributos son variables que pertenecen a una clase y representan las características o propiedades de los objetos creados a partir de esa clase. Cada objeto tiene su propia copia de los atributos de la clase. Los atributos definen el estado de los objetos y pueden tener diferentes valores para cada instancia de la clase.

Por ejemplo, en la clase Coche que hemos estado utilizando:

				
					public class Coche {
    String marca;   // Atributo marca
    String modelo;  // Atributo modelo
    int año;        // Atributo año
}

				
			

En esta clase, marca, modelo y año son atributos que representan la marca, el modelo y el año del coche, respectivamente.

  • Métodos:

Los métodos son funciones que están asociadas a una clase y definen el comportamiento de los objetos creados a partir de esa clase. Los métodos pueden realizar operaciones, acceder y modificar los atributos de la clase, o simplemente proporcionar funcionalidad útil.

Por ejemplo, en la clase Coche, hemos definido dos métodos:

				
					public void obtenerInformacion() {
    System.out.println("Marca: " + marca);
    System.out.println("Modelo: " + modelo);
    System.out.println("Año: " + año);
}

public void encender() {
    System.out.println("El coche está encendido.");
}

				
			

El método obtenerInformacion() imprime la información del coche, incluyendo la marca, el modelo y el año, mientras que el método encender() imprime un mensaje indicando que el coche está encendido.

Tipos de métodos:

  1. Métodos de instancia: Son métodos que pertenecen a una instancia particular de una clase y operan en los atributos de esa instancia. Los métodos que hemos definido en la clase Coche son ejemplos de métodos de instancia.

  2. Métodos estáticos: Son métodos que pertenecen a la clase en sí misma en lugar de a instancias individuales de la clase. Se pueden llamar directamente desde la clase sin necesidad de crear un objeto de esa clase. Por ejemplo:

				
					public class Utilidades {
    public static int sumar(int a, int b) {
        return a + b;
    }
}

				
			

En este ejemplo, sumar() es un método estático de la clase Utilidades que toma dos números como parámetros y devuelve su suma.

  1. Métodos de acceso (getters) y modificadores (setters): Son métodos utilizados para acceder y modificar los valores de los atributos de una clase, respectivamente. Los getters devuelven el valor de un atributo y los setters establecen un nuevo valor para un atributo.
				
					public class Coche {
    private String marca;  // Atributo marca
    private String modelo; // Atributo modelo
    
    // Getter para la marca
    public String getMarca() {
        return marca;
    }
    
    // Setter para la marca
    public void setMarca(String nuevaMarca) {
        marca = nuevaMarca;
    }
}

				
			

En este ejemplo, getMarca() es un getter que devuelve el valor de la marca, y setMarca() es un setter que establece un nuevo valor para la marca.

Estos son algunos ejemplos de métodos y atributos en Java y los diferentes tipos que existen. Los métodos y atributos son componentes fundamentales de las clases en Java y se utilizan para definir el comportamiento y las propiedades de los objetos en un programa.

Encapsulamiento, herencia y polimorfismo

  • Encapsulamiento: Es el concepto de ocultar los detalles internos de un objeto y exponer solo lo necesario para su uso externo. En Java, se logra mediante la declaración de atributos como privados y el uso de métodos públicos (getters y setters) para acceder y modificar estos atributos.

  • Herencia: Permite que una clase herede atributos y métodos de otra clase, lo que promueve la reutilización del código y la creación de jerarquías de clases. En Java, se implementa mediante la palabra clave «extends».

  • Polimorfismo: Permite que un objeto se comporte de diferentes maneras dependiendo del contexto. En Java, el polimorfismo se logra mediante la sobrescritura de métodos (métodos con el mismo nombre pero diferentes implementaciones en las clases hijas) y mediante la implementación de interfaces. Esto facilita la creación de código flexible y extensible.