Eu to estudando pela apostila da Caelum, e em um exercício de array, eu crio uma classe Empresa onde eu tenho como atributo um array empregados do tipo Funcionario, que é uma outra classe. E ai tem q criar um metodo adiciona onde passamos um funcionario como parametro, e temos q adicionar esse funcionario no nosso array empregados, porém na hora de instanciar o funcionario no array, to tendo um problema:
Veja a inicialização do atributo Funcionario na classe Empresa
public class Empresa {
private Funcionarios func[] = new Funcionarios[5];
/**
* metodo que recebe um objeto do tipo funcionario
* e add no vetor
* @param nomes
*/
public void addFuncionario(Funcionarios nomes){
for (int i = 0; i < 5; i++) {
func[1] = nomes;
}
}
Acredito que esse seja o problema. Quando tu não cria um construtor para classe, o java cria um construtor - sem parâmetros - para poder instanciar a classe. Como tu criastes um construtor para sua classe, ele não cria esse construtor padrão, daí quando tu tenta chama-lo, ele não existe. Como tu quer adicionar um Funcionario que o método recebe como parametro, tu não precisa instanciar a classe antes, então tu pode remover essa linha.
Um segunda solução, seria adicionar um construtor vazio( sem parâmetros ) na classe Funcionario.
Resolvi aqui adicionando o construtor sem parametro. só p esclarecer mais um pouco, eu achava que quando eu criei o construtor com parametro o java automaticamente descartava esse construtor padrão, então por isso eu tava instanciando funcionário. No caso a ide estava dando erro pq eu tava querendo instanciar um classe sem parametros, quando na vdd eu declarei um construtor com parametros é isso? e se eu quisesse instanciar o objeto empregados do tipo funcionario sem ter q criar o construtor default, como eu estava querendo fazer no codigo q eu copiei acima?
Sim, essa questão de construtor padrão eu to entendendo, mas só por título de curiosidade eu queria saber como ir instanciando os objetos “empregados” a cada iteração do for, entende? Seria dando um new no construtor com parametros?
Para iniciar os objetos “empregados” você faz: empregados[i] = new Funcionario();//Construtor padrão
Ou
Você também pode optar por inicializar o empregados[i] pelo objeto passado como parâmetro (do jeito que você fez), só que ai apaga a linha de cima: this.empregados[i] = new Funcionario();
As formas de inicialização dependem do que você quer fazer
Uma observação que talvez clareie essa sua dúvida.
Quando não existe construtor declarado numa classe, de fato o Java cria um implicitamente. No entanto, é muito importante salientar que todo e qualquer construtor “customizado” tem uma chamada implicita na primeira linha chamando o construtor padrão, que por sua vez DEVE ser criado programaticamente.
Exemplo:
public class Carro{} // será criado implicitamente o construtor padrão sem argumentos para a classe.
Mas se eu usar um construtor padronizado desta forma, por exemplo:
public class Carro{
int ano;
public Carro(int ano){
this.ano = ano;
}
}
Haverá erro ao instanciar a classe Carro() ou Carro(1989), pois TODO construtor customizado possui uma chamada implícita para o construtor padrão. Logo, a classe acima pode ser lida da seguinte forma.
public class Carro{
int ano;
public Carro(int ano){
super(); // implícito
this.ano = ano;
}
}
Desta forma, o erro é lançado. Digamos que vc queira que seu Carro seja instanciado somente pelo construtor com argumentos. Uma alternativa é usar o construtor padrão com o modificador private. Desta forma, somente a classe terá acesso e a chamada ao super() será atendida.
public class Carro{
int ano;
public Carro(int ano){
super();
this.ano = ano;
}
// atende a chamada do super(), mas somente a classe tem acesso.
//Logo, objetos não podem ser instanciados por este construtor.
private Carro(){}
}
Por este motivo seu problema foi resolvido ao acrescentar o construtor vazio!