Programación Orientada a Objetos 4 - Clases y Objetos

El corazón de la Programación Orientada a Objetos son las clases y los objetos. En este capítulo, vamos a profundizar en la definición de las clases y en la creación de objetos en Java, y cómo estos conceptos se pueden usar para construir aplicaciones estructuradas y eficientes.

Definición de una Clase

Una clase es un modelo, una plantilla para crear objetos.

Define los atributos (características) y los métodos (comportamientos) que sus objetos tendrán. 


  public class NombreDeLaClase {
    // Atributos (Campos)
    TipoDato atributo1;
    TipoDato atributo2;

    // Constructor(es)
    public NombreDeLaClase(TipoDato atributo1, TipoDato atributo2) {
        this.atributo1 = atributo1;
        this.atributo2 = atributo2;
    }

    // Métodos
    public TipoRetorno nombreMetodo(parametros) {
        // Cuerpo del método
    }
  }
                

Atributos (campos)

Son las características o propiedades que tendrá cada objeto de esa clase. Por ejemplo, un auto puede tener atributos como marca, modelo y color. Los atributos pueden tener diferentes niveles de acceso (público, privado, protegido) que determinan desde dónde pueden ser accedidos y modificados.

Constructor

Es un método especial que se llama cuando se crea un objeto de esa clase. Su trabajo es inicializar los atributos del objeto. El nombre del constructor siempre es el mismo que el de la clase, y no tiene tipo de dato de retorno.

Puede haber más de un constructor en una clase, cada uno con diferentes argumentos, lo que se conoce como “sobrecarga de constructores”.

Un objeto es una instancia de una clase, que se crea mediante la invocación al constructor. 


  NombreDeLaClase objeto1 = new NombreDeLaClase(valorParaAtributo1, valorParaAtributo2);
                

Este proceso se llama “instanciación” y el objeto creado tiene su propio conjunto de atributos y métodos definidos en la clase.

Una vez que definimos una clase, podemos crear tantos objetos como necesitemos de ella.

Destructor

En algunos lenguajes se usan destructores, se invocan cuando se deja de usar el objeto y dentro de ellos se libera la memoria.

En el caso de Java no es necesario ya que la JVM tiene el Garbage Collector, que se encarga de forma automática de limpiar la memoria eliminando los objetos que dejan de usarse.

Métodos

Los métodos son funciones definidas dentro de una clase. Describen las acciones que un objeto de la clase puede realizar. Pueden realizar operaciones o retornar información sobre el objeto. Por ejemplo, un auto puede arrancar, frenar, o acelerar.

Ejemplo 1

Vamos a crear la clase ‘Libro’ para mostrar cómo se definen las clases y los objetos en Java.

Cada libro tendrá atributos como título, autor y número de páginas, y métodos para leer y mostrar información del libro.


  public class Libro {
      // Atributos
      private String titulo;
      private String autor;
      private int numeroDePaginas;
  
      // Constructor
      public Libro(String titulo, String autor, int numeroDePaginas) {
          this.titulo = titulo;
          this.autor = autor;
          this.numeroDePaginas = numeroDePaginas;
      }
  
      // Método para leer el libro
      public void leer() {
          System.out.println("Estás leyendo " + titulo + " de " + autor);
      }
  
      // Método para mostrar información del libro
      public void mostrarInfo() {
          System.out.println("Título: " + titulo + ", Autor: " + autor + ", Páginas: " + numeroDePaginas);
      }
  
      // Getters y Setters
      public String getTitulo() {
          return titulo;
      }
  
      public void setTitulo(String titulo) {
          this.titulo = titulo;
      }
  
      public String getAutor() {
          return autor;
      }
  
      public void setAutor(String autor) {
          this.autor = autor;
      }
  
      public int getNumeroDePaginas() {
          return numeroDePaginas;
      }
  
      public void setNumeroDePaginas(int numeroDePaginas) {
          this.numeroDePaginas = numeroDePaginas;
      }
  }
  
  // Creando un objeto de la clase Libro
  Libro miLibro = new Libro("Cien Años de Soledad", "Gabriel García Márquez", 471);
  miLibro.leer();
  miLibro.mostrarInfo();
                

Libro es una clase con atributos privados (titulo, autor y numeroDePaginas) y métodos públicos para interactuar con esos atributos.

El método leer simula la acción de leer el libro, mientras que mostrarInfo proporciona una descripción general del libro.

Los métodos getTitulo y setTitulo son ejemplos de “getters y setters” que permiten acceder y modificar los valores de los atributos privados de una manera controlada y segura. No se puede acceder a los atributos (porque son privados), así que se usan estos métodos.

Ejemplo 2

En este caso vamos a crear una clase Fraccion, en la que encapsulamos la funcionalidad de una fracción.


  public class Fraccion {
      // atributos
      private int numerador;
      private int denominador;
  
      // metodos
      public void producto(Fraccion x, Fraccion y) {
          numerador = x.numerador * y.numerador;
          denominador = x.denominador * y.denominador;
      }
  
      public double aReal() {
          return (numerador / denominador);
      }
  
      public boolean igual(Fraccion x) {
          return (numerador * x.denominador == denominador * x.numerador);
      }
  }
                

Vemos el caso del producto, esta multiplicando dos Fracciones pero no retorna nada, lo está asignando a un tercer objeto, el objeto actual, también llamado this, una referencia a la propia instancia.


  // z, v y w deben ser de tipo Fraccion
  z.producto(v, w);
                

En algunos lenguajes como C# existe el concepto de Propiedad (Property), que pueden ser similares a los getters y setters pero tambien pueden referirse a atributos que no existen (básicamente ejecutan acciones).


  class Student
  {
      private string _name;  // atributo  
      public string Name     // property
      {
          get => _name;
          set => _name = value;
      }
  }
                

Conclusiones

Las clases y los objetos son fundamentales y forman la base de la programación orientada a objetos.

Entender cómo se definen y utilizan es el primer paso. A medida que avances, te encontrarás diseñando tus propias clases y creando objetos complejos que interactúan entre sí para resolver problemas reales de manera elegante y eficiente.