Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Java erro "constructor 'X' in class 'X' cannot be applied to given types" ao compilar

Ao compilar o código abaixo recebo o seguinte erro:

ContaCorrente.java:1: error: constructor Conta in class Conta cannot be applied to given types;

class ContaCorrente extends Conta { ^

required: Cliente,int,double,double

found: no arguments

reason: actual and formal argument lists differ in length

ContaPoupanca.java:1: error: constructor Conta in class Conta cannot be applied to given types;

class ContaPoupanca extends Conta { ^

required: Cliente,int,double,double

found: no arguments

reason: actual and formal argument lists differ in length

2 errors

Porém, notei que quando crio o construtor padrão da classe Conta o código compila normalmente. Gostaria de entender do que se trata esse erro e porque ele está ocorrendo.

class Conta {
    private Cliente titular;
    private int numero;
    protected double saldo;
    private double limite;
    //...

    public Conta(Cliente titular,int numero, double limite, double saldoInicial){
        this.titular = titular;
        this.numero = numero;
        this.limite = limite;
        this.saldo = saldoInicial;
    }

    //Quando descomento o construtor abaixo o código compila normalmente.
    /*public Conta(){

      }*/

    //...
}

class ContaCorrente extends Conta {

    public void atualiza (double taxa) {
        this.saldo += this.saldo * taxa * 2;

    }

}

class ContaPoupanca extends Conta {

    public void atualiza (double taxa){
        this.saldo += this.saldo * taxa *3;
    }

    public void deposita (double valor) {
        this.saldo += valor - 0.10;
    }

}

class Cliente {
    private String nome;
    private String rg;
    private String cpf;
    private String dataNascimemto;

    public Cliente (String nome, String rg, String cpf, String dataNascimemto) {
        this.nome = nome;
        this.rg = rg;
        this.cpf = cpf;
        this.dataNascimemto = dataNascimemto;

    }
    //...
}
7 respostas

Oi Thalita, dá uma olhada na mensagem de erro que ele está mostrando:

ContaCorrente.java:1: error: constructor Conta in class Conta cannot be applied to given types;
class ContaCorrente extends Conta { ^
required: Cliente,int,double,double
found: no arguments

Basicamente o que ele está dizendo é:

Você está tentando chamar o construtor sem nenhum parâmetro, mas ele precisa receber 4 parâmetros.

Quando você descomenta o construtor padrão ele passa a funcionar, pois você chama ele em vez de chamar o construtor que recebe o parâmetro.

A solução para o seu programa funcionar seria passar os parâmetros para o construtor onde você está chamando new Conta() por exemplo:

Conta conta = new Conta(cliente, 1, 10.0, 10.0)

Obrigada pela atenção Philipe! Esqueci de mencionar a minha classe Main e que possuo um get na minha classe Conta que imprime os dados da Conta. No caso, com o construtor padrão ela compila e imprime os dados normalmente.

Ainda não consegui entender este erro, pois não estou tentando instanciar nenhuma das subclasses da minha conta.

class TesteConta {
    public static void main (String [] args) {

        Cliente c1 = new Cliente("joao", "123456","12345678912", "01/12/2016");

        Conta c = new Conta (c1,5812244,100,0);
        c.getDadosConta();
        //...
    }
}

O problema agora é com o tipo dos parâmetros que você está passando, repara que em seu construtor você recebe:

Cliente titular,int numero, double limite, double saldoInicial

mas está passando:

new Conta (c1,5812244,100,0);

repara que os últimos 2 parâmetro são double, double são números decimais, então você precisa passar um número decimal para o construtor:

new Conta (c1,5812244,100.0,0.0);

Fiz a alteração sugerida, porém o erro persiste.

class TesteConta {
    public static void main (String [] args) {
        Cliente c1 = new Cliente("joao", "123456","12345678912", "01/12/2016");

        Conta c = new Conta (c1,5812244,100.1,0.1);
        c.deposita(1000);

        c.getDadosConta();

    }
}

Talvez assim seja melhor para me ajudar. Pode verificar através do código abaixo que só irá compilar se comentar a linha :

//Conta cc = new ContaCorrente (c2,5812444,200.1,0.2);

class Cliente {
    private String nome;
    private String rg;
    private String cpf;
    private String dataNascimemto;

    public Cliente (String nome, String rg, String cpf, String dataNascimemto) {
        this.nome = nome;
        this.rg = rg;
        this.cpf = cpf;
        this.dataNascimemto = dataNascimemto;

    }

    public String getNomeCliente (){
        return this.nome;
    }    

    //...
}

class Conta {
    private Cliente titular;
    private int numero;
    protected double saldo;
    private double limite;
    //...

    public Conta(Cliente titular,int numero, double limite, double saldoInicial){
        this.titular = titular;
        this.numero = numero;
        this.limite = limite;
        this.saldo = saldoInicial;
    }

    public Conta(){

    }    

    public void getDadosConta(){
        System.out.println ("Cliente: "+ this.titular.getNomeCliente() +
                            "\nNumero da Conta: " + this.numero  +
                            "\nSaldo Atual: R$" + this.saldo +
                             "\nLimite: R$" + this.limite);

    }      

    //...
}

class ContaCorrente extends Conta {

    public void atualiza (double taxa) {
        this.saldo += this.saldo * taxa * 2;

    }

}

class ContaPoupanca extends Conta {

    public void atualiza (double taxa){
        this.saldo += this.saldo * taxa *3;
    }

    public void deposita (double valor) {
        this.saldo += valor - 0.10;
    }

}

class TesteConta {
    public static void main (String [] args) {

        Cliente c1 = new Cliente("joao", "123456","12345678912", "01/12/2016");

        Conta c = new Conta (c1,5812244,100.1,0.1);

        Cliente c2 = new Cliente ("jose", "123455","12345678912", "02/12/2016");

        //Conta cc = new ContaCorrente (c2,5812444,200.1,0.2);        

        c.getDadosConta();
        //...
    }
}
solução!

Obtive a resposta através do Eclipse. Pelo que entendi é necessário também criar construtores nas subclasses e chamar as variáveis da classe mãe através do super.

    public ContaCorrente (Cliente titular,int numero, double limite, double saldoInicial){
        super (titular, numero, limite,saldoInicial);

    }

    public ContaPoupanca (Cliente titular,int numero, double limite, double saldoInicial){
        super (titular, numero, limite,saldoInicial);

    }

Estava com a mesma dúvida, havia um construtor na classe e nas classes que herdavam nela nenhum, para mim a solução foi fazer como citado acima. Um contrutor para cada classe, chamando o construtor da classe mae.

Muito Obrigado pela ajuda.