[RESOLVIDO] Instanciando arrays de uma classe

13 respostas
java
W

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.

13 Respostas

Rodrigo_Void

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

W

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

Jederson_Andre

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

}

W

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

rafoqueiroz

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.

W

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?

Mike

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

W

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?

Mike

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

W

Entendi, valeu Mike.

Jederson_Andre

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

raphaeloneves

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!

W

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

Criado 16 de outubro de 2017
Ultima resposta 17 de out. de 2017
Respostas 13
Participantes 6