[RESOLVIDO] Referencias em Array

Gente, estou quebrando a cabeça nesse exercicio, help plz

  1. Volte ao nosso sistema de Funcionario e crie uma classe Empresa dentro do mesmo arquivo .java. A
    Empresa tem um nome, cnpj e uma referência a uma array de Funcionario, além de outros atributos que
    você julgar necessário.
class Empresa {
// outros atributos
Funcionario[] empregados;
String cnpj;
}
  1. A Empresa deve ter um método adiciona, que recebe uma referência a Funcionario como argumento, e
    guarda esse funcionário. Algo como:
void adiciona(Funcionario f) {
// algo tipo:
// this.empregados[ ??? ] = f;
// mas que posição colocar?
}

Você deve inserir o Funcionario em uma posição da array que esteja livre. Existem várias maneiras para
você fazer isso: guardar um contador para indicar qual a próxima posição vazia ou procurar por uma posição
vazia toda vez. O que seria mais interessante?
É importante reparar que o método adiciona não recebe nome, rg, salário, etc. Essa seria uma maneira nem
um pouco estruturada, muito menos orientada a objetos de se trabalhar. Você antes cria um Funcionario e
já passa a referência dele, que dentro do objeto possui rg, salário, etc.

Postarei meu codigo abaixo(uma idéia, pq ele ta errado)

[code]
public class Funcionario {
String nome;
String dep;
double salario;
Empresa empregado;

public Funcionario(String name, String dept, double sal)
{
	this.nome = name;
	this.dep = dept;
	this.salario = sal;		
}

}[/code]

[code]
public class Empresa {
String nome;
int cnpj;
Funcionario[] empregado;
int i = 0;

void adiciona(Funcionario f){
	this.empregado[i] = f;
	i++;
}

}[/code]

[code]public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f;

	e.adiciona("Leandro","TI",2000);
}

}[/code]

Seu método adiciona está pedindo como parâmetro um objeto do tipo funcionário e ao chama-lo no main você está passando parâmetros diferentes (2 String e 1 Inteiro).
Imagino que seu método adiciona esteja correto, nele você está guardando sempre a ultima posição livre na variavel i.
Para funcionar você deve primeiro instanciar seu array de Funcionario (Se quiser pode fazer isso no construtor) e passar o parâmetro correto no método main.

Instanciar assim?

Funcionario[] f = new Funcionario[];

eu coloquei e deu erro

Variable must provide either dimension expressions or an array initializer

Quando você vai instanciar um array você deve determinar o tamanho do mesmo.

Ex.: Funcionario f = new Funcionario[10];

Neste meu array eu poderei ter até 10 instancias de funcionários.

a linha e.adiciona continua com erro

Cole novamente o codigo completo para eu verificar como ficou apos suas alterações.
Você realizou as alterações dos parâmetros passados pro método adiciona dentro do Main que eu tinha comentado ?
Bom, coloque o código novamente aqui que ficará mais facil identificar os problemas.

Abraço

[code]public class Funcionario {
String nome;
String dep;
double salario;
Empresa empregado;

public Funcionario(String name, String dept, double sal)
{
	this.nome = name;
	this.dep = dept;
	this.salario = sal;		
}

}[/code]

[code]public class Empresa {
String nome;
int cnpj;
Funcionario[] empregado;
int i = 0;

void adiciona(Funcionario f){
	this.empregado[i] = f;
	i++;
}

}[/code]

[code]public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f = new Funcionario[10];
e.empregado = f;

	e.adiciona("Leandro","TI",2000);
}

}
[/code]

[code]class Funcionario {
String nome;
String dep;
double salario;
Empresa empregado;

public Funcionario(String name, String dept, double sal)  
{  
    this.nome = name;  
    this.dep = dept;  
    this.salario = sal;       
}  

}

class Empresa {
String nome;
int cnpj;
int i = 1;
Funcionario[] empregado;

void adiciona(Funcionario f){
empregado = new Funcionario[i];
// Alterando a posição do array de 1 para 0.
this.empregado[i-1] = f;
System.out.println(“Empregado " + empregado[i-1].nome+” add com sucesso!");
this.i++;
}
}
public class TestePrograma {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f = new Funcionario[3];
f[0] = new Funcionario(“Leandro”,“TI”,2000);
f[1] = new Funcionario(“Le”,“TI”,500);
f[2] = new Funcionario(“Leon”,“ADM”,20);

    for (Funcionario funcionario : f) {
    	e.adiciona(funcionario);  
	}
}  

}[/code]

Acho que é isso (meio bizarro), essa maneira funciona para executar o método adiciona mas se você quiser recuperar algum funcionario depois creio que não conseguirá o melhor seria definir um tamanho default para o seu array de Funcionarios aí dessa forma você consegue recuperar mas creio que usar List fica muito mais elegante.
Se quiser de uma olhada docs.oracle.com/javase/6/docs/api/java/util/List.html

Flus.

Dessa forma abaixo você conseguira recuperar o funcionario sem problemas.


class Funcionario {  
	String nome;  
	String dep;  
	double salario;  
	Empresa empregado;  

	public Funcionario(String name, String dept, double sal) {  
		this.nome = name;  
		this.dep = dept;  
		this.salario = sal;       
	}
}

class Empresa {  
	String nome;  
	int cnpj;  
	int i = 0;  
	Funcionario[] empregado = new Funcionario[100];  

	void adiciona(Funcionario f) {
		this.empregado[i] = f;
		this.i++;
	}
	void recupera(){
		System.out.println("Funcionarios cadastrados\n");
		for (Funcionario fun : empregado) {
			if(fun != null)
				System.out.println(fun.nome);
		}
	}
}  
public class TestePrograma {
	public static void main (String[] args){  
		Empresa e = new Empresa();  
		Funcionario[] f = new Funcionario[100];  
		f[0] = new Funcionario("Leandro","TI",2000);
		f[1] = new Funcionario("AAAA","DEV",500);
		f[2] = new Funcionario("BBBB","ADM",20);
		f[3] = new Funcionario("CCCC","NEC",210);

		for (Funcionario funcionario : f) {
			e.adiciona(funcionario);  
		}

		e.recupera();
	}  
}

Deu erro aqui

Exception in thread “main” java.lang.NullPointerException
at Empresa.adiciona(Empresa.java:9)
at Programa.main(Programa.java:11)

Tem certeza ?

posta seu código aí.

Sim.

[code]public class Empresa {
String nome;
int cnpj;
Funcionario[] empregado;
int i = 1;

void adiciona(Funcionario f){
	this.empregado[i] = f;
	System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
	this.i++;
}

}

public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f = new Funcionario[10];
f[0] = new Funcionario(“Leandro”, “TI”, 4000);
f[1] = new Funcionario(“Leandro2”, “DBA”, 5000);
f[2] = new Funcionario(“Leandro3”, “Suporte”, 1000);

	for (Funcionario funcionario : f) {  
        e.adiciona(funcionario);    
    }  
}

}[/code]

eu dei uma procurada o que era esse erro, diz que é pq o array não foi inicializado, mas eu num to inicializando não?!

[quote=Eiro]Sim.

[code]public class Empresa {
String nome;
int cnpj;
Funcionario[] empregado;
int i = 1;

void adiciona(Funcionario f){
	this.empregado[i] = f;
	System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
	this.i++;
}

}

public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f = new Funcionario[10];
f[0] = new Funcionario(“Leandro”, “TI”, 4000);
f[1] = new Funcionario(“Leandro2”, “DBA”, 5000);
f[2] = new Funcionario(“Leandro3”, “Suporte”, 1000);

	for (Funcionario funcionario : f) {  
        e.adiciona(funcionario);    
    }  
}

}[/code]
[/quote]

Eu não to entendendo muito bem não… se já tá colocando os atributos na array pq ta dando esse for se já está adicionado?!

[quote=Eiro]Sim.

[code]public class Empresa {
String nome;
int cnpj;
Funcionario[] empregado;
int i = 1;

void adiciona(Funcionario f){
	this.empregado[i] = f;
	System.out.println("Empregado " + empregado[i].nome+" add com sucesso!"); 
	this.i++;
}

}

public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
Funcionario[] f = new Funcionario[10];
f[0] = new Funcionario(“Leandro”, “TI”, 4000);
f[1] = new Funcionario(“Leandro2”, “DBA”, 5000);
f[2] = new Funcionario(“Leandro3”, “Suporte”, 1000);

	for (Funcionario funcionario : f) {  
        e.adiciona(funcionario);    
    }  
}

}[/code]
[/quote]

Você não está inicializando ele.

Dica: Você deve inicializar todos os arrays para que as posições possam ser utilizadas.
Presta a atenção no seu codigo e se preferir, compara com o que eu passei e verá que está faltando algo !

Flus.

Ah sim, faltou uma coisa no metodo Adiciona… heheh =P

Então, ainda tenho algumas duvidas, além da dúvida anterior, se não tem como eu fazer com que se adicione uma linha no array sem eu especificar ela…

Por exemplo: vc fez f[1] = new… f[2] = new… f[3] = new…

ao inves deu fazer isso acima, não da pra eu fazer um simples mestodo tipo;

e.adiciona(“atributos”);

e vai implementando como uma pilha?

eu add oq tava faltando e deu esse erro agora

Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 1
at Empresa.adiciona(Empresa.java:10)
at Programa.main(Programa.java:11)

Vamos lá:

Olhe para seu método adiciona(Funcionario f){…}

void adiciona(Funcionario f){...}

Esse método espera que você passe como parametro um objeto do tipo Funcionario correto ?

então por esse motivo você deve informar um funcionario.

Agora se você quer passar outros parametros você pode sobrescrever o método fazendo:

void adiciona(String name, String dept, double sal){
// Aqui você implementa seu codigo de acordo que imaginar.
}

Você pode fazer da maneira que quiser mas lembre que a implementação dentro do adiciona() mudará um pouco.
Understood ?

Se precisar de + dicas é só falar. Flus.

humm… entendi… agora tipo, como tem no enunciado da questão

2) A Empresa deve ter um método adiciona, que recebe uma referência a Funcionario como argumento, e
guarda esse funcionário. Algo como:

void adiciona(Funcionario f) {
// algo tipo:
// this.empregados[ ??? ] = f;
// mas que posição colocar?
}

não dá pra fazer desse jeito então?