How to access methods of an array of objects?

1

I'm doing a college job in which I have to develop a banking system, so I have 3 account types (1 class for each type), so I want to use an array of generic objects. The problem is to access the methods of the objects contained in the array, in which eclipse is asking for casting.

Main class:

import java.util.Scanner;
public class programa {

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        Object[] arrayContas = new Object[50];
        Object elementoConta;


        System.out.println("1. Gerente. \n");
        System.out.println("2. Cliente. \n");
        System.out.println("3. Sair. \n");
        int opcao = input.nextInt();

        switch(opcao)
        {
            case 1:
            {
                System.out.println("1. Criar nova conta. \n");
                System.out.println("2. Vizualizar informações. \n");
                opcao = input.nextInt();

                switch(opcao)
                {
                case 1:
                    menuGerente.criarConta(arrayContas);
                    break;
                case 2:
                {
                    System.out.println("Digite o número da conta desejada: ");
                    int numeroDaConta = input.nextInt();
                    elementoConta = arrayContas[numeroDaConta];
                    elementoConta.print();
                }

                }

            }
        }

        input.close();
    }
}

Manager class:

import java.util.Scanner;

public class menuGerente {

    public static Object criarConta(Object[] contas)
    {
        Scanner input = new Scanner(System.in);

        int numeroConta = 0;
        String correntista;


        while(contas[numeroConta] != null)
        {
            numeroConta++;
        }


        System.out.println("Digite:\n 1 para conta simples.\n 2 para conta especial.\n 3 para conta poupança.\n");
        int opcao = input.nextInt();

        switch(opcao)
        {

            case 1:
            {
                System.out.printf("Digite o nome do correntsta: ");
                correntista = input.nextLine();
                System.out.println();

                conta novaConta = new conta(correntista, numeroConta);

                contas[numeroConta] = novaConta;
                break;
            }

            case 2:
            {
                System.out.printf("Digite o nome do correntsta: ");
                correntista = input.nextLine();
                System.out.println();

                System.out.printf("Digite o limite da conta: ");
                int limite = input.nextInt();
                System.out.println();

                contaEspecial novaConta = new contaEspecial(numeroConta, correntista, limite);

                contas[numeroConta] = novaConta;
                break;
            }

            case 3:
            {
                System.out.printf("Digite o nome do correntsta: ");
                correntista = input.nextLine();
                System.out.println();

                System.out.printf("Digite o rendimento da conta: ");
                double rendimento = input.nextDouble();
                System.out.println();

                contaEspecial novaConta = new contaEspecial(numeroConta, correntista, rendimento);

                contas[numeroConta] = novaConta;
                break;
            }   
        }
        input.close();
        return contas;
    }
}

Account Type 1:

public class conta {

    private int numeroConta;
    private String senha = "0000";
    private String nomeCorrentista;
    protected double saldo  = 0.0;
    protected String tipo = "Simples";


    //Construtor---------------------------------------------   
    public conta(String nomeCorrentista, int numeroConta)
    {
        this.numeroConta = numeroConta;
        this.nomeCorrentista = nomeCorrentista;
    }

    //Getters---------------------------------------------------
    int getConta()
    {
        return numeroConta;
    }

    String getCorrentista()
    {
        return nomeCorrentista;
    }

    double getSaldo()
    {
        return saldo;
    }

    //Métodos sacar, depositar e alterarSenha------------------------
    void sacar(double saque)
    {       
        if(Math.abs(saldo - saque) < 0)
        {
            saldo = saldo - saque;
            System.out.println("Saque realizado com sucesso!");
        }

        else
        {
            System.out.println("Saldo Insulficiente!");
        }
    }

    void depositar(double valor)
    {
        saldo = saldo + valor;
        System.out.println("Depósito realizado com sucesso!");

    }

    void alteraSenha(String senhaAntiga, String senhaNova)
    {
        if(senhaAntiga.equals(senha))
        {
            senha = senhaNova;
            System.out.println("Senha alterada com Sucesso!");
        }
        else
        {
            System.out.println("Senha antiga incorreta!");
        }
    }

    //Print--------------------------------------------------------
    void print()
    {
        System.out.printf("O nome do correntista é %s. \n", getCorrentista());
        System.out.printf("O numero da conta é %d. \n", getConta());
        System.out.printf("A conta é do tipo %s. \n", tipo);
        System.out.printf("O saldo é de R$ %.2f. \n", getSaldo());
    }

}

Type 2 Account:

public class contaEspecial extends conta{

    double limite;

    public contaEspecial(int numeroConta, String nomeCorrentista, double limite)
    {
        super(nomeCorrentista, numeroConta);
        tipo = "Especial";
        this.limite = limite;
    }

    void sacar(double saque)
    {       
        if(Math.abs(saldo - saque) < limite)
        {
            saldo = saldo - saque;
            System.out.println("Saque realizado com sucesso!");
        }

        else
        {
            System.out.println("Saldo Insulficiente!");
        }
    }

    void print()
    {
        System.out.printf("O nome do correntista é %s. \n", getCorrentista());
        System.out.printf("O numero da conta é %d. \n", getConta());
        System.out.printf("A conta é do tipo %s. \n", tipo);
        System.out.printf("O saldo é de R$ %.2f. \n", getSaldo());
        System.out.printf("O limite é de %.2f. \n", limite);
    }

}

There are more things, but it's already too big kkkk.

    
asked by anonymous 28.10.2018 / 00:11

1 answer

1

The compiler will not allow you to access an Account method through an object of type Object, since Object does not contain the Account methods. To make the compiler understand that there is an object of type Account in this array of Object, you need to do casting, like this:

((Conta) arrayContas[0]).getSaldo();

But that was kind of ugly, was not it? Instead, you can simply declare your account array as Conta[] arrayContas = new Conta[50]; . As contaEspecial extends Account, you can save both Account and Special account to this Account array, so your compiler will already know that the objects in that array have the Account methods, so you can access them simply by using:

arrayContas[0].getSaldo();
    
28.10.2018 / 00:35