Programación Orientada a Objetos en Java: Ejercicios Resueltos con Cuentas Bancarias
¿Estás comenzando tu viaje en la Programación Orientada a Objetos (POO) con Java? ¡Has llegado al lugar indicado! Las clases y los objetos son los pilares fundamentales de este paradigma, y entenderlos bien es el primer gran paso para convertirte en un desarrollador experto.
La programación orientada a objetos (POO) es un paradigma de programación que utiliza “objetos” para modelar datos y métodos asociados. Es un modelo de programación que utiliza objetos, ligados mediante mensajes, para la solución de problemas. Es decir, organizar los programas a imagen y semejanza de la organización de los objetos en el mundo real. Java es un lenguaje de programación que soporta POO de manera robusta.
Conceptos Fundamentales de la Programación Orientada a Objetos
Clases y Objetos
Antes de sumergirnos en el código, aclaremos los conceptos básicos. Piensa en una clase como un plano o un molde para crear algo. Por ejemplo, el plano de una casa define sus características (número de habitaciones, color de las paredes, etc.) y sus funcionalidades (abrir puertas, encender luces). Un objeto, por otro lado, es la construcción real basada en ese plano. Siguiendo el ejemplo, cada casa construida a partir del mismo plano es un objeto único. Puede tener diferentes colores de pared o muebles distintos, pero todas comparten la misma estructura base definida en la clase.
- Clase: Es la plantilla, el molde.
- Objeto: Es una instancia de una clase.
Los objetos están contenidos dentro de las clases, por eso se dice que un objeto es la instancia de una clase. La diferencia entre clase y objetos se puede ver al comparar un molde para hacer cookies con las cookies. Cada cookie (objeto) es una instancia de la clase de cookie (molde).
Para crear una clase solo utilizamos la palabra reservada class y el nombre de la clase. Ejemplo:
class figuras{//......}Para crear objetos de una clase y poder trabajar con ellos tiene que existir una clase con un método main, puesto que éste es el punto de entrada y de salida de un programa. El método public static void main(String[] args) es el punto de entrada de cualquier programa Java.
Un objeto de una clase sólo puede invocar a métodos de su clase. Para acceder a un miembro de un objeto (atributo o método) utilizamos la siguiente sintaxis:
nombre_objeto.nombre_miembro;
De esta manera podemos manejar el objeto que creamos y si es que hubiere más de un objeto se nombra diferente a cada uno.
El método main, tiene que ser estático y generalmente es público, devuelve cualquier resultado y tiene un parámetro args que es una matriz de una dimensión de cadena de caracteres.
Atributos y Métodos
Un programa orientado a objetos se compone solamente de objetos, cada uno de ellos es una entidad que tiene unas propiedades particulares (los atributos) y las formas de operar de ellos (los métodos).
Los objetos poseen un conjunto de propiedades o atributos y un conjunto de métodos mediante los cuales muestran su comportamiento. Además, los objetos muestran un conjunto de interrelaciones entre ellos mediante mensajes a los que responden mediante métodos.
En la POO, cada una de las características que posee un objeto se denomina atributo. Por ejemplo, esta página Web es un objeto, tiene colores de fondo, anchura y altura, etc. Son los atributos (características) y las rutinas que ejecuta el usuario (cerrar, abrir, recorrer, etc.) son los métodos. Cuando se ejecuta un programa orientado a objetos, los objetos están recibiendo, interpretando y respondiendo mensajes de otros objetos y por lo tanto ejecutando métodos asociados con el objeto. Los atributos definidos en la clase permiten almacenar información para dicho objeto.
Los métodos se escriben en una clase de objetos y determinan cómo tiene que actuar el objeto cuando recibe el mensaje vinculado con ese método. A su vez, un método puede también enviar mensajes a otros objetos solicitando una acción o información.
Para definir este comportamiento, es necesario añadir métodos a la clase. Los métodos son rutinas del código definidas dentro del cuerpo de la clase, que se ejecutan en respuesta a alguna acción desde dentro de un objeto de esa clase. El conjunto de mensajes a los que el objeto puede responder es directamente proporcional al conjunto de métodos que implementan su clase.
Podemos decir que los nombres de los métodos de una clase forman al conjunto de mensajes a los que un objeto de esa clase puede responder.
Encapsulamiento
Normalmente los atributos, la estructura más interna de un objeto, se ocultan a los usuarios del objeto, manteniendo como única conexión con el exterior a los mensajes. Esto quiere decir que los atributos de un objeto solamente podrán ser manipulados por los métodos del propio objeto. Este conjunto de métodos recibe el nombre de Interfaz (medio de comunicación con un objeto).
Al utilizar private los atributos quedan protegidos de los usuarios, solo se podrá acceder a ellos mediante los métodos que implementen dentro de la misma clase. Al estar los métodos 'encerrados' dentro de la clase y a la necesidad de llamarlos a través de un objeto, es por lo que se dice que están encapsulados dentro del objeto.
Constructores
Es un método especial de una clase que es llamado automáticamente siempre que se crea un objeto de esa clase. Su función es iniciar el objeto. Un constructor tiene el mismo nombre de la clase a la que pertenece y no retorna un valor. Los constructores, salvo casos excepcionales, deben declararse siempre como públicos para que puedan ser invocados desde cualquier parte. La siguiente línea invoca al constructor sin parámetros:
CCuenta cuenta01=new CCuenta(); //invoca al constructor CCuenta
El operador new crea un nuevo objeto, en este caso de la clase CCuenta y a continuación se invoca al constructor de su clase para realizar las operaciones programadas en la clase. Cuando realizamos la creación de instancias llamamos a un método especial (procedimiento) llamado constructor que permite inicializar todas las variables.
Métodos Sobrecargados
Cuando en una clase un mismo método se define varias veces con distinto número de parámetros, o bien con el mismo número de parámetros pero diferenciándose una definición de otra en que al menos un parámetro sea de tipo diferente, se dice que está sobrecargado. Cuando una clase sobrecarga a un método una o más veces ¿Cómo sabe Java cuál tiene que ejecutar cuando se invoque? Esto lo hace comparando el número y los tipos de los argumentos especificados en la llamada, con los parámetros especificados en las distintas definiciones del método.
Herencia y Polimorfismo
La abstracción es el proceso por el que identificamos las características más importantes de un objeto, sin especificar ningún valor concreto. Todas las clases del sistema Java son descendientes (directos o indirectos) de la clase Object. Una forma de implementar el polimorfismo es haciendo uso de las Interfaces.
Cuando el objeto 'europeo' llame al método 'impMaximosIngresos()' lo hará en función de la clase a la que pertenezca el objeto, de tal forma que si el objeto que enviamos pertenece a la clase Español. En el ejemplo anterior, el método 'tratarObjetos' recibe un parámetro de la clase Europeo. Sin embargo, el objeto que enviamos a dicha variable está instanciado como un objeto de la clase Español (por ejemplo).
Paquetes
En el lenguaje Java, todas las clases se encuentran dentro de un paquete. Las clases que creó Sun se almacenan en bibliotecas de clase llamadas "paquetes". Los paquetes son grupos relacionados de clases e interfaces y proporcionan un mecanismo para manejar un gran número de clases e interfaces y evitar conflictos de nombres. De esta manera, otros programadores pueden determinar fácilmente cuáles son tu grupo de clases, cómo utilizarlas, y cómo relacionarlos entre sí y con otras clases y paquetes.
La primera línea del código anterior crea un paquete llamado graphics. CLASSPATH es una lista de directorios que indica a Java donde se encuentran las clases e interfaces compilados. Los nombres de los paquetes pueden contener subpaquetes (paquetes dentro de paquetes) (separados por punto). Cada componente del nombre del paquete representa un directorio en el sistema de archivos.
- java.lang: Contiene las clases básicas del lenguaje.
- java.awt: Clases relacionadas con el diseño de aplicaciones gráficas utilizando la interface gráfica 'awt'.
- java.swing: Clases para implementar interfaces gráficas más completas que las de awt.
Ejercicios Resueltos: Clases y Objetos en Java con Cuentas Bancarias
En este artículo, no solo te explicaremos la teoría de forma sencilla, sino que te retaremos con ejercicios diseñados para que aprendas haciendo. ¡Prepárate para llevar tu código al siguiente nivel!
El verdadero aprendizaje ocurre cuando te enfrentas a un problema por tu cuenta. Antes de ver la solución de cada ejercicio, lee detenidamente el enunciado y piensa cómo lo resolverías. Abre tu editor de código, experimenta y no temas equivocarte. ¡Cada error es una oportunidad de aprender!
Problema: Clase CCuenta Bancaria
Pensando en la clase de objetos CCuenta, elegimos los atributos de interés que van a definir esta clase de objetos:
- nombre: nombre del cliente del banco al que pertenece la cuenta.
- cuenta: número de la cuenta.
- saldo: saldo actual de la cuenta.
- tipoDeInteres: Tipo de interés en tanto por ciento.
Todos los atributos son definidos en la clase por variables:
class CCuenta{ private String nombre; private String cuenta; private double saldo; private double tipoDeInteres; //...........}Al utilizar private los atributos quedan protegidos de los usuarios, solo se podrá acceder a ellos mediante los métodos que implementen dentro de la misma clase.
El comportamiento define las acciones que el objeto pueda tener, en nuestro ejemplo las acciones podrían ser:
- Asignar el nombre del Cliente del banco a una cuenta.
- Obtener el nombre del cliente de una cuenta.
- Asignar el número de cuenta.
- Obtener el número de cuenta.
- Realizar un ingreso.
- Realizar un retiro.
- Asignar el tipo de interés.
- Obtener el tipo de interés.
- Obtener el saldo, es decir el estado de cuenta.
Para definir este comportamiento, es necesario añadir métodos a la clase. los métodos son rutinas del código definidas dentro del cuerpo de la clase, que se ejecutan en respuesta a alguna acción desde dentro de un objeto de esa clase. El conjunto de mensajes a los que el objeto puede responder es directamente proporcional al conjunto de métodos que implementan su clase.
Ejemplo de método para asignar el nombre:
public void asignarNombre (String nom){ if (nom.length() == 0){ System.out.println ("Error: cadena vacia"); return; } nombre = nom;}Observamos que el método es declarado como public, lo cual nos indica que este método es accesible desde cualquier otra clase o subclase que necesite utilizarlo. void nos indica que nos va a regresar cualquier valor que genere el método, después tenemos al identificador de método, es decir su nombre y por último entre paréntesis tenemos a los parámetros que va a manejar el método, si hubiere más de un parámetro los separamos por comas. Dentro de las llaves tenemos la acción o conjunto de acciones que va a realizar el método.
Un método para obtener el saldo:
public double estado(){ return saldo;}Este método simplemente devolverá el saldo de la cuenta del banco.
Cuando en un programa vamos a utilizar las mismas variables para diferentes métodos, podemos declararlas como Variables Globales. Existen tres clases de métodos:
- Aquellos que reciben la información y almacenan los datos en las variables globales a los cuales llamaremos Setters.
- Aquellos que nos regresan la información almacenada en las variables globales, los cuales llamaremos Getters.
- Por último, aquellos que realizan alguna operación con los valores utilizados en la clase.
Setters
Del inglés Set, que significa establecer, nos sirve para asignar un valor inicial a un atributo, pero de forma explícita. Además, el Setter nunca retorna nada (Siempre es void), y solo nos permite dar acceso público a ciertos atributos que deseemos el usuario pueda modificar.
Getters
Del inglés Get, que significa obtener, pues nos sirve para obtener (recuperar o acceder) el valor ya asignado a un atributo y utilizarlo para cierto método.
En la vida real la información con la que va a trabajar un método puede llegar de manera externa a él, en ese caso se declara de manera diferente y el valor llega de otra función como por ejemplo: En la figura anterior como podemos observar algunos valores llegan desde el método principal, es decir main, objarea.areacuadrado(lado), el valor que contiene lado es mandado al método areacuadrado que está dentro de la misma clase, pero no dentro del mismo main. En el método areacuadrado la variable lado interactúa con la fórmula y aporta un resultado, el cual se imprime como área.
68. Programación en Java || POO || Encapsulamiento y métodos accesores (Getters y Setters)
Ejemplo Práctico: Gestión de Cuentas Bancarias con Múltiples Clases
Veamos un programa de ejemplo, el mismo programa pero dividida en diferentes clases:
Clase Principal (CCuenta)
La primer clase, que es la principal, es la de CCuenta, en donde está el main, la creación del objeto, los llamados a función y envío de la misma. Modificamos main para que reciba la información que introduzca el usuario.
El main puede añadirse en el mismo archivo fuente en el que está almacenada la clase CCuenta, ya sea al final o antes de la clase. Se puede también crear de manera separada en otro archivo dentro de la misma carpeta o directorio, dándole otro nombre, pero creando un objeto a partir de la clase que queremos manejar como por ejemplo:
CCuenta cuenta01=new CCuenta( ); //Cuenta nueva
Subclase Ahorro
En otra subclase llamada Ahorro, dentro del mismo proyecto, están algunos métodos, con las variables globales. Observa que hay una variable diferente, el saldo, ya que es una variable que se va a compartir con diferentes clases y a interactuar con las mismas.
Subclase Retiro
En otra clase llamada Retiro, se aplica sobre el saldo, el retiro. Observa que se importa el saldo del paquete ccuenta, de la subclase Ahorro. Por ejemplo, en la clase Retiro creamos dos métodos. Modificamos main para activar conectar con la clase Retiro y sus respectivos métodos.
Subclase Saldo
Para consultar el Saldo necesitamos un método que regrese el saldo, de otra subclase llamada Saldo.
Ejecuta la aplicación y observa que funciona de la misma manera que si estuviese todo en la misma clase, es decir, los métodos y las variables se comunican entre sí, enviando y recibiendo información entre los métodos y las variables que para eso son globales.
Ampliando la Funcionalidad: Un Cajero Automático
Realiza las modificaciones que creas pertinentes para que el usuario pueda hacer varias transacciones en el cajero automático pero, todos los cambios se verán reflejados a partir del saldo Inicial, además de que al finalizar la totalidad de las transacciones, el programa deberá mostrar el resumen de cada una de ellas.
Añade los métodos necesarios así como diferentes clases de acuerdo al Cajero Automático. Vamos a realizar algunos cambios en este segundo programa, añadir un menú de operaciones en el main:
En la clase Ahorro al final, agrego un método que me ayude en el pago de la tarjeta de crédito, el cual funcionará en el case 2 de mi menú.
En la subclase llamada Servicios, agrega los métodos necesarios para que el usuario pueda seleccionar el servicio a pagar:
- Telmex
- CFE
- Agua
- Predial
- Sky
Mismos, que las cantidades a descontar, se deben de restar del saldo.
Por último, con la subclase Crédito el usuario podrá pagar su tarjeta de crédito, utilizando para ello su saldo de su cuenta bancaria.
Otros Ejercicios de POO en Java
Estos ejercicios te proporcionarán una base sólida para trabajar con programación orientada a objetos en Java. Practicar estos conceptos es esencial para desarrollar tus habilidades de programación y te permitirá abordar problemas más complejos en el futuro.
- Crea una clase Persona con atributos nombre, edad y dni.
- Crea una clase CuentaBancaria con atributos numeroCuenta, saldo y titular. Incluye métodos para depositar() y retirar() dinero. El titular es un objeto tipo Persona. Controlar que el saldo de la cuenta no debe ser menor que 0. Crear un método llamado transaccion que ingrese como parámetros cantidad y tipoTransaccion; tipoTransaccion es “retiro” o “deposito”. Si es un retiro, la cantidad se resta del saldo, y si es deposito la cantidad se incrementa al saldo. El método transacción debe imprimir el tipo de transación y el nuevo saldo.
- Crea una clase Figura con un método calcularArea.
- Crea una clase Empleado con atributos nombre y salario, y un método calcularSalario. Una empresa quiere guardar los datos de los nombre y nóminas de cada empleado, junto con los años de antigüedad en la empresa, su fecha de nacimiento (se hace uso de la clase Calendar), su nombre, dirección y teléfono.
- Crea una interfaz Dibujable con un método dibujar.
- Crea una clase Coche que tenga los atributos marca, modelo y año. Diseña una clase CCoche que represente coches, incluya los atributos marca, modelo y color. Además los métodos que simulen enviando mensajes, las acciones de arrancar motor, cambiar de velocidad, acelerar, frenar y parar el motor. Se quiere guardar información sobre la flota de coches de una empresa. En el caso de los km debes asegurarte que el valor es positivo mayor que 0. Crea un método que modifique (sumando al valor que tenga el dato enviado) el valor de los km recorridos. Siempre tiene que ser un valor positivo.
- Diseña una clase Rectangulo con los atributos ancho y alto.
- Crea una clase Circulo con un atributo radio.
- Define una clase Estudiante con los atributos nombre y calificacion (un número).
- Crea una clase Libro con los atributos titulo, autor y numeroDePaginas.
- Crea una clase Producto con los atributos nombre y precio.
- Define una clase Pelicula con los atributos titulo, director y genero.
- Crea una clase Reloj con los atributos horas y minutos.
- Diseña una clase Mascota con los atributos nombre y tipo (ej. «Perro», «Gato»).
- Queremos realizar un programa que juegue a las cartas, por lo que necesitamos guardar la información de cada una de las cartas que tengan los jugadores. Número: un entero (1..
- Las bombillas van a poder estar encendidas o apagadas. En el caso de la posición esta debe ser mayor que 0.
Preguntas Frecuentes
- ¿Qué es la palabra clave this? La palabra clave this se utiliza dentro de un método o constructor de una instancia para referirse al objeto actual.
- ¿Para qué sirve el main dentro de las clases de los ejercicios? El método public static void main(String[] args) es el punto de entrada de cualquier programa Java.
- ¿Se pueden definir varias clases en un único archivo físico? Sí, pero solo una de ellas puede ser public y el archivo debe llamarse igual que esa clase pública.
