estou iniciando java e estou tendo dificuldade com o seguinte programa:
package conta;
public class contaSimples
{
String nome;
int conta;
double saldo, salario, limite;
boolean limOk;
public contaSimples(String nome , int conta , double saldo ,double salario , double limite)
{
this.nome = nome;
this.conta = conta;
this.saldo = saldo;
this.salario = salario;
this.limite = limite;
if ( this.salario > this.limite)
{
this.limOk = false;
} else {
this.limOk = true;
}
}
public void saldo()
{
System.out.println("O saldo do cliente "+this.nome+"é:\nR$ "+this.saldo);
}
public void deposito(double valor)
{
this.saldo += valor;
}
public boolean retira(double valor)
{
if ( this.saldo - valor < 0)
{
return false;
} else
{
return true;
}
}
}
package conta;
import conta.*;
public class contaEspecial extends contaSimples
{
public contaEspecial(String nome , int conta , double saldo ,double salario , double limite)
{
//...
}
}
o Netbeans fica acusando erro no construtor da contaEspecial
[quote]/home/lucas/Desktop/Conta/src/conta/contaEspecial.java:9: cannot find symbol
symbol : constructor contaSimples()
location: class conta.contaSimples[/quote]
Quando você cria uma classe sem construtor, o java cria automaticamente prá você um construtor sem parâmetros. Mas quando você implementa ao menos um construtor, o construtor “automático” (sem parâmetros) não é criado.
Quando você herda uma classe, e instancia a classe filha, na verdade você está instanciando também a classe-pai (a menos que ela seja abstrata). Ou seja, no construtor da classe-filha, se você não declarar explicitamente o construtor da classe-pai, o java automaticamente chama o construtor sem parâmetros.
Daí vem o seu erro de não existir o construtor contaSimples(). Como você declarou um construtor, o construtor sem parâmetros automático não foi criado. E como você não chamou o construtor declarado, deu pau.
SOLUÇÃO:
O construtor da super-classe deve ser o primeiro comando no construtor da classe filha.
coloque:
public contaEspecial(String nome , int conta , double saldo ,double salario , double limite)
{
super (nome, conta, saldo, double, salario, limite);
}
package conta;
import conta.*;
public class contaEspecial extends contaSimples
{
public contaEspecial(String nome , int conta , double saldo ,double salario , double limite)
{
super(nome,conta,saldo,salario,limite);
}
}
A regra é a seguinte:
Quando você instancia um objeto new ObjetctQualquer() no seu metodo main, o construtor deste objeto é chamado e da uma chamada a expressao super() seja ela implicita (sem declaracao propria) que no caso é sem parametro, que chama o construtor sem parametro da superclasse que consecutivamente chama a sua superclasse ate chegar na classe Object que é a superclasse de todas as classes. No seu caso tem que chamar explicitamente a expressao super(parametros) com parametros porque a sua superclasse possui um construtor com argumentos.