[quote=Eiro]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?[/quote]
Vamos lá:
1 - Empresa já tem o método adiciona !
2 - A referencia é um Funcionario como podemos ver !
3 - Quando é chamado o método adiciona, ele adiciona um funcionario no array de Funcionario[] empregado com a posição i que inicia com 0 e quando ele passa pelo
this.empregado[i] = f temos um incremento i++ que tornará a posição 0 em 1 para que possa ser adicionar mais um funcionario na posição 1 e assim consecutivamente
até que todos os funcionario sejam adicionados em suas respectivas posições até o limite definido por você (no meu caso foram 100 posições).
Deu para entender ?!
O código já está fazendo isso, tanto que se você quiser buscar um funcionario pela posição ele aparecerá sem problemas.
Estou postando o codigo com sobrescrita de método, para que você possa entender.
E com isso você poderá usar os 2 tipos com parametros ou com objeto inteiro.
class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregado = new Funcionario[100];
// Tente entender essa chamada
void adiciona(Funcionario f) {
this.adiciona(f.nome, f.dep, f.salario);
}
// Sobrescrita do método
void adiciona(String nome, String dep, double salario) {
this.empregado[i] = new Funcionario(nome, dep, salario);
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();
e.adiciona("AAAA", "TI", 7000);
e.adiciona("BBBB", "ADM", 5000);
e.adiciona("CCCC", "MKT", 700);
e.adiciona("DDDD", "PRO", 5555);
e.recupera();
}
}
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.
Crie uma classe TestaEmpresa que possuirá um método main. Dentro dele crie algumas instâncias de
Funcionario e passe para a empresa pelo método adiciona. Repare que antes você vai precisar criar a
array, pois inicialmente o atributo empregados da classe Empresa não referencia lugar nenhum (null):
Empresa empresa = new Empresa();
empresa.empregados = new Funcionario[10];
// …
Ou você pode construir a array dentro da própria declaração da classe Empresa, fazendo com que toda vez
que uma Empresa é instanciada, a array de Funcionario que ela necessita também é criada.
Crie alguns funcionários e passe como argumento para o adiciona da empresa:
[quote=Eiro]hmmm!! pronto desse jeito que eu queria, nem sabia que podia desse jeito, mas pq nao fica duplicado?
e nessa resolução foge do que a questao ta pedindo?[/quote]
Como assim duplicado ?
Essa solução foge sim um pouco do que está pedindo.
Postando outra solução sem definir a quantidade de array na classe empresa. Seguindo o enunciado.
class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregados;
void adiciona(Funcionario f){
this.empregados[i] = f;
this.i++;
}
void recupera(){
System.out.println("Funcionarios cadastrados\n");
for (Funcionario fun : empregados) {
if(fun != null)
System.out.println("Nome: " + fun.nome +" Depto: " + fun.dep + " Salário: US$" + fun.salario);
}
}
}
public class TestePrograma {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];
e.empregados[0] = new Funcionario("AAA", "TI", 8000);
e.empregados[1] = new Funcionario("BBB", "ADM", 6000);
e.empregados[2] = new Funcionario("CCC", "MKT", 3500);
e.empregados[3] = new Funcionario("DDD", "TI", 4500);
e.empregados[4] = new Funcionario("FFF", "DBA", 8500);
for (int i = 0; i < e.empregados.length; i++) {
e.adiciona(e.empregados[i]);
}
e.recupera();
}
Bom ele não duplica por que quando você chama o método:
void adiciona(Funcionario f) {
// Nesse ponto ele chama o método com parametros passando nome, dep e salario
this.adiciona(f.nome, f.dep, f.salario);
}
Em qualquer uma das situações. E como eu estou sobrescrevendo o método logo eu posso executar tanto um quanto o outro que não terá problemas.
Você vai começar a entender melhor quando for ver sobre Sobrescrita de métodos.
Entendeu ?!
Ainda nessa questão, tem uma opcional que não ta dando certo:
(Opcional) Crie um método para verificar se um determinado Funcionario se encontra ou não como
funcionário desta empresa:
boolean contem(Funcionario f) {
// …
}
Você vai precisar fazer um for na sua array e verificar se a referência passada como argumento se encontra
dentro da array. Evite ao máximo usar números hard-coded, isto é, use o .length.
meu código(o funcionario não mudou nada)
[code]class Empresa {
String nome;
int cnpj;
int i = 0;
Funcionario[] empregados;
boolean contem(Funcionario f){
for (int i = 0; i < this.empregados.length; i++) {
if (f == empregados[i]){
System.out.println("Funcionario já trabalha nesta empresa");
return true;
}
}
System.out.println("O Funcionário não trabalha conosco");
return false;
}
void adiciona(Funcionario f){
if (i > 10){
System.out.println("Cheio");
}
else{
this.empregados[i] = f;
this.i++;
}
}
void mostra(){
System.out.println("Funcionarios cadastrados\n");
for (int i = 0; i < this.empregados.length; i++) {
if (empregados[i] != null){
System.out.println("Funcionário na posição: " + i);
System.out.println("Nome: " + empregados[i].nome +" Depto: " + empregados[i].dep + " Salário: RS$" + empregados[i].salario);
}
else{
break;
}
}
}
} [/code]
[code]public class Programa {
public static void main (String[] args){
Empresa e = new Empresa();
e.empregados = new Funcionario[10];
e.empregados[0] = new Funcionario(“AAA”, “TI”, 8000);
e.empregados[1] = new Funcionario(“BBB”, “ADM”, 6000);
e.empregados[2] = new Funcionario(“CCC”, “MKT”, 3500);
e.empregados[3] = new Funcionario(“DDD”, “TI”, 4500);
e.empregados[4] = new Funcionario(“EEE”, “DBA”, 8500);
for (int i = 0; i < e.empregados.length; i++) {
e.adiciona(e.empregados[i]);
}
e.empregados[5] = new Funcionario("FFF", "DEV", 2500);
e.contem(e.empregados[1]);
e.contem(e.empregados[5]);
e.contem(e.empregados[7]);
}
} [/code]
Quando eu dou “Play” ela imprime assim:
Funcionario já trabalha nesta empresa
Funcionario já trabalha nesta empresa
Funcionario já trabalha nesta empresa
[quote=AndreLuisOnLine][code]public void contem(Funcionario f){
for (int i = 0; i < empregados.length; i++) {
if(empregados[i]!=null)
if(empregados[i].nome.equals( f.nome)){
System.out.println(“empregado existe”);
break;
}else{
System.out.println(“empregado não existe”);
break;
}
}
}[/code]
Você não menciona, mas estou subentendendo que exista um atributo String nome em Funcionario.[/quote]
Nesse caso vai funcionar se somente o nome for o mesmo caso o nome seja o mesmo e o salario e dept sejam diferentes irá retornar que o funcionario trabalha pois a comparação é somente do nome. Se você tiver certeza absoluta que outro funcionario não terá o mesmo nome isso daria certo, no entanto, em uma empresa creio que seria
difícil esse cenário.
Conselho para que você tenha plena certeza de que todo seu objeto é igual ao outro sobrescreva o método .equals() na classe Funcionario com isso dará certo com certeza.
Caso não queira ter tanto trabalho de procurar o eclipse faz isso para você, mas creio que o melhor é entender.
Com se tratam do mesmo tema melhor nos referenciarmos por esse ok!
Para que não haja confusão, no titulo desse tópico deixe dessa forma ‘’ [RESOLVIDO] Referencias em Array ‘’ e assim poderemos dar continuidade, do tema no outro ok.