[RESOLVIDO] Instanciando arrays de uma classe

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:

public class Funcionario {

private String nome;
private String departamento;
private double salario;
private Data data;
private String rg;
private boolean empregado;

public class Empresa {

private String nome;
private String cnpj;
private String area;
private Funcionario[] empregados = new Funcionario[5];

public void adiciona(Funcionario funcionario) {
	for(int i=0;i<this.empregados.length;i++) {
		this.empregados[i] = new Funcionario();
		this.empregados[i] = funcionario;
	}
}

no metodo adiciona na 3 linha a IDE diz q o construtor Funcionario está indefinido, mas Funcionario não serio o tipo do array.

Se ele está se queixando do construtor de Funcionario verifique na sua classe Funcionario se este construtor existe.

eu até tenho um construtor na classe Funcionário, mas o escopo é diferente, eu passo um parametro no construtor

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;
    }
}

}

esse método q vc usou no seu exemplo é uma função do java?

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.

2 curtidas

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?

Quando você cria uma classe e não cria nenhum construtor, o java cria um construtor padrão (sem parâmetros).

Se você criar um construtor, o java não criará outro para você.

Toda vez que você faz um new Funcionario(); você chama o construtor padrão (que não recebe parâmetros).

Você pode ter quantos construtores quiser na sua classe.

A IDE apontou um erro pq você estava chamando o construtor padrão, sem ter definido um na sua classe

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

Entendi, valeu Mike.

Não não… metodo da classe Empresa();

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!

eu já li algumas coisas sobre herança, mas n cheguei nesse capítulo da apostila ainda, mas valeu pelas informações.