Ejercicio Básico POO Java. Clase Cuenta


Escribe una clase Cuenta para representar una cuenta bancaria. Los datos de la cuenta son: nombre del cliente (String), número de cuenta (String), tipo de interés (double) y saldo (double).
La clase contendrá los siguientes métodos:
Constructor por defecto
Constructor con todos los parámetros
Constructor copia.
Métodos setters/getters para asignar y obtener los datos de la cuenta.
Métodos ingreso y reintegro. Un ingreso consiste en aumentar el saldo en la cantidad que se indique. Esa cantidad no puede ser negativa. Un reintegro consiste en disminuir el saldo en una cantidad pero antes se debe comprobar que hay saldo suficiente. La cantidad no puede ser negativa. Los métodos ingreso y reintegro devuelven true si la operación se ha podido realizar o false en caso contrario.
Método transferencia que permita pasar dinero de una cuenta a otra siempre que en la cuenta de origen haya dinero suficiente para poder hacerla. Ejemplo de uso del método transferencia:
cuentaOrigen.transferencia(cuentaDestino, importe);
que indica que queremos hacer una transferencia desde cuentaOrigen a cuentaDestino del importe indicado.
Prueba el funcionamiento de la clase Cuenta con este main:
public static void main(String[] args) {
       
Scanner sc = new Scanner(System.in);
String nombre, numero;
double tipo, importe;

//se crea objeto cuenta1 sin parámetros
//se ejecuta el constructor por defecto
Cuenta cuenta1 = new Cuenta();

System.out.print("Nombre : ");
nombre = sc.nextLine();
System.out.print("Número de cuenta : ");
numero = sc.nextLine();
System.out.print("Tipo de interes : ");
tipo = sc.nextDouble();
System.out.print("Saldo: ");
importe = sc.nextDouble();

cuenta1.setNombre(nombre);
cuenta1.setNumeroCuenta(numero);
cuenta1.setTipoInteres(tipo);
cuenta1.setSaldo(importe);

//se crea el objeto cuenta2 con los valores leidos por teclado
//se ejecuta el constructor con parámetros
Cuenta cuenta2 = new Cuenta("Juan Ferrández Rubio", "12345678901234567890", 1.75, 300);

//se crea cuenta3 como copia de cuenta1
//se ejecuta el constructor copia
Cuenta cuenta3 = new Cuenta(cuenta1);

//mostrar los datos de cuenta1
System.out.println("Datos de la cuenta 1");
System.out.println("Nombre del titular: " + cuenta1.getNombre());
System.out.println("Número de cuenta: " + cuenta1.getNumeroCuenta());
System.out.println("Tipo de interés: " + cuenta1.getTipoInteres());
System.out.println("Saldo: " + cuenta1.getSaldo());
System.out.println();
       
//se realiza un ingreso en cuenta1
cuenta1.ingreso(4000);
       
//mostrar el saldo de cuenta1 después del ingreso
System.out.println("Saldo: " + cuenta1.getSaldo());
       
//mostrar los datos de cuenta2
System.out.println("Datos de la cuenta 2");
System.out.println("Nombre del titular: " + cuenta2.getNombre());
System.out.println("Número de cuenta: " + cuenta2.getNumeroCuenta());
System.out.println("Tipo de interés: " + cuenta2.getTipoInteres());
System.out.println("Saldo: " + cuenta2.getSaldo());
System.out.println();
       
//mostrar los datos de cuenta3
System.out.println("Datos de la cuenta 3");
System.out.println("Nombre del titular: " + cuenta3.getNombre());
System.out.println("Número de cuenta: " + cuenta3.getNumeroCuenta());
System.out.println("Tipo de interés: " + cuenta3.getTipoInteres());
System.out.println("Saldo: " + cuenta3.getSaldo());
System.out.println();
       
//realizar una transferencia de 10€ desde cuenta3 a cuenta2
cuenta3.transferencia(cuenta2, 10);
       
//mostrar el saldo de cuenta2
System.out.println("Saldo de la cuenta 2");
System.out.println("Saldo: " + cuenta2.getSaldo());
System.out.println();
       
//mostrar el saldo de cuenta3
System.out.println("Saldo de la cuenta 3");
System.out.println("Saldo: " + cuenta3.getSaldo());
System.out.println();
}

Solución:
//Clase Cuenta
public class Cuenta {

    private String nombre;
    private String numeroCuenta;
    private double tipoInteres;
    private double saldo;

    //Constructor por defecto
    public Cuenta() {
    }

    //Constructor con parámetros
    public Cuenta(String nombre, String numeroCuenta, double tipoInteres, double saldo) {
        this.nombre = nombre;
        this.numeroCuenta = numeroCuenta;
        this.tipoInteres = tipoInteres;
        this.saldo = saldo;
    }

    //Constructor copia
    public Cuenta(final Cuenta c) {
        nombre = c.nombre;
        numeroCuenta = c.numeroCuenta;
        tipoInteres = c.tipoInteres;
        saldo = c.saldo;
    }

    //getters y setters
    public void setNombre(String s) {
        nombre = s;
    }

    public void setNumeroCuenta(String s) {
        numeroCuenta = s;
    }

    public void setTipoInteres(double n) {
        tipoInteres = n;
    }

    public void setSaldo(double n) {
        saldo = n;
    }

    public String getNombre() {
        return nombre;
    }

    public String getNumeroCuenta() {
        return numeroCuenta;
    }

    public double getTipoInteres() {
        return tipoInteres;
    }

    public double getSaldo() {
        return saldo;
    }

    //método ingreso
    public boolean ingreso(double n) {
        boolean ingresoCorrecto = true;
        if (n < 0) {
            ingresoCorrecto = false;
        } else {
            saldo = saldo + n;
        }
        return ingresoCorrecto;
    }

    //método reintegro
    public boolean reintegro(double n) {
        boolean reintegroCorrecto = true;
        if (n < 0) {
            reintegroCorrecto = false;
        } else if (saldo >= n) {
            saldo -= n;
        } else {
            reintegroCorrecto = false;
        }
        return reintegroCorrecto;
    }

    //método transferencia
    public boolean transferencia(Cuenta c, double n) {
        boolean correcto = true;
        if (n < 0) {
            correcto = false;
        } else if (saldo >= n) {
            reintegro(n);
            c.ingreso(n);
        } else {
            correcto = false;
        }
        return correcto;
    }
}

16 comentarios:

  1. Hola. En la línea:
    public Cuenta(final Cuenta c)
    ¿En necesario incluir la palabra reservada "final"?¿Qué función cumple?
    Un saludo y gracias.

    ResponderEliminar
    Respuestas
    1. No es necesario declarar como final el parámetro del constructor copia pero haciendolo así se protege al objeto que vamos a copiar de cualquier modificación que por error se pudiera realizar,

      Eliminar
  2. tengo una duda siempre es necesario usar set y get , no me queda claro para que funciona , y si no lo colocamos que pasa ??

    ResponderEliminar
    Respuestas
    1. los getters y setters son necesarios si los atributos son privados, puesto que no podrás acceder a ellos desde ninguna otra clase. Si los atributos son públicos, puedes acceder directamente a ellos, pero no es es el caso.

      Eliminar
    2. los getters y setters son necesarios si los atributos son privados, puesto que no podrás acceder a ellos desde ninguna otra clase. Si los atributos son públicos, puedes acceder directamente a ellos, pero no es es el caso.

      Eliminar
  3. Buenas tardes cuando intento compilar me salen 3 errores ( non static variable this cannot be referenced from a static contex )
    en donde dice Cuenta cuenta1 = next Cuenta();
    los mismo en Cuenta cuenta 2 ...etc
    y en Cuenta cuenta3... etc
    quisiera saber como corregir ese error, gracias.

    ResponderEliminar
    Respuestas
    1. Hola Yazmin Grisell Bandala Martinez, lo que sucede es que no es es que estas creando un objeto de la clase Cuenta y la forma en que tienes Cuenta cuenta1 = next Cuenta(); es incorrecto, la palabra para crear el objeto es new, se corrige de la siguiente forma Cuenta cuenta1 = new Cuenta(); Espero y te sirva.

      Eliminar
  4. Hola me puedes ayudar tengo un error en "Cuenta cuenta3 = new Cuenta(cuenta1);" gracias por la ayuda.

    ResponderEliminar
    Respuestas
    1. ya lo resolví lo que sucedío es que no había definido en la clase Cuenta.java el constructor copia, pero me queda una duda, el parametro c que recibe el método copia son los parametros de la la cuenta2??. gracias por la ayuda, nuevamente!

      Eliminar
    2. Toma efectivamente todos los ATRIBUTOS de la cuenta que le das como parámetro

      Eliminar
    3. Hola :)
      Tengo una duda, porque en el método ingreso o reintegro, pasas como parámetro "n", public boolean ingreso(double n).

      Eliminar
  5. Tendras algunos ejemplos de java fx, soy nuevo en este tema y me interesaría ver algunos ejemplos prácticos

    ResponderEliminar
  6. Lo Hice de esta manera, me gustaria leer sus comentarios

    public static void main(String[] args) {
    // TODO Auto-generated method stub
    // No declaro cuenta 3, no la vi necesaria para el objetivo del desarrollo de la practica
    //declaro cuenta 1
    cuenta cuenta1 = new cuenta();

    String nombre = JOptionPane.showInputDialog("Nombre del Cliente: ");
    String numero = JOptionPane.showInputDialog("Numero de Cuenta: ");
    double interes = Double.parseDouble(JOptionPane.showInputDialog("Tipo de Interes: "));
    double saldo = Double.parseDouble(JOptionPane.showInputDialog("Saldo: "));

    cuenta1.setNombre(nombre);
    cuenta1.setNumero(numero);
    cuenta1.setInteres(interes);
    cuenta1.setSaldo(saldo);

    //declaro cuenta 2
    cuenta cuenta2 = new cuenta();
    String nombre2 = JOptionPane.showInputDialog("Nombre del Cliente: ");
    String numero2 = JOptionPane.showInputDialog("Numero de Cuenta: ");
    double interes2 = Double.parseDouble(JOptionPane.showInputDialog("Tipo de Interes: "));
    double saldo2 = Double.parseDouble(JOptionPane.showInputDialog("Saldo: "));

    cuenta2.setNombre(nombre2);
    cuenta2.setNumero(numero2);
    cuenta2.setInteres(interes2);
    cuenta2.setSaldo(saldo2);

    //Muestro datos de lo ingresado
    System.out.println("datos cuenta");
    System.out.println("nombre: "+ cuenta1.getNombre());
    System.out.println("cuenta: "+cuenta1.getNumero());
    System.out.println("interes: "+cuenta1.getInteres());
    System.out.println("Saldo: "+cuenta1.getSaldo());
    System.out.println(" ");
    System.out.println("datos cuenta");
    System.out.println("nombre: "+ cuenta2.getNombre());
    System.out.println("cuenta: "+cuenta2.getNumero());
    System.out.println("interes: "+cuenta2.getInteres());
    System.out.println("Saldo: "+cuenta2.getSaldo());
    System.out.println(" ");
    //ingreso a la cuenta 1
    cuenta1.setSaldo(cuenta1.getSaldo() + Double.parseDouble(JOptionPane.showInputDialog("cuanto desea ingresar a la cuenta 1?")));
    System.out.println("Nuevo saldo de cuenta 1 es: "+ cuenta1.getSaldo());
    System.out.println(" ");
    //transferencia de la cuenta 2 a la cuenta 1
    System.out.println("tranferencia saldo de cuenta 2 a cuenta 1");
    double aux=Double.parseDouble(JOptionPane.showInputDialog("Cuanto desea transferir?"));
    if ((cuenta2.getSaldo()- aux)<=0) {
    System.out.println("No se puede hacer la trasferencia, no hay saldo suficiente en la cuenta de "+cuenta2.getNombre());
    }else {
    cuenta1.setSaldo(cuenta1.getSaldo() + aux);
    cuenta2.setSaldo(cuenta2.getSaldo()- aux);
    System.out.println("El nuevo saldo de "+cuenta1.getNombre()+" es: "+cuenta1.getSaldo());
    System.out.println("El nuevo saldo de "+cuenta2.getNombre()+" es: "+cuenta2.getSaldo());
    }

    ResponderEliminar
    Respuestas
    1. Yo me ahorraría código haciendo por ejemplo esto:
      cuenta1.setNombre(JOptionPane.showInputDialog("Nombre del cliente:"));
      cuenta1.setInteres(Double.parseDouble(JOptionPane.showInputDialog("Tipo de interes: ")));

      Eliminar
  7. Buenas, estoy teniendo un error con el codigo

    ResponderEliminar