[RESOLVIDO] Dúvida conceitual em Java Básico

2 respostas
O

Boa noite a todos;

São dúvidas mais conceituais que técnicas, mas vamos lá. Tenho as 3 classes básicas abaixo:

Funcionario:
class Funcionario {

	//Atributos e alguns métodos simples;

}
Empresa:
class Empresa {
	String nome;
	String CNPJ;
	//Métodos
}
TestaEmpresa:
class TestaEmpresa {
	public static void main(String[] args) {

	Empresa empresa = new Empresa();
	empresa.f1 = new Funcionario();
	empresa.f1.salario = 100;
	
	}
}

Ao tentar compilar o TestaEmpresa.java e recebo os seguintes erros:

TestaEmpresa.java:6: error: cannot find symbol
   empresa.f1 = new Funcionario();
          ^
  symbol:   variable f1
  location: variable empresa of type Empresa

TestaEmpresa.java:7: error: cannot find symbol
   empresa.f1.salario = 100;
          ^
  symbol:   variable f1
  location: variable empresa of type Empresa
2 errors

Neste ponto, interpretando as mensagens, imagino que seja porque em minha classe empresa não tenha declarado um atributo Funcionário (não posso instanciar um funcionário dentro de Empresa se não existe este atributo na classe empresa). Então volto e adiciono:

Funcionario f1;

em "Empresa.java" e o código compila.

Deste exemplo simples vem as dúvidas:

1 - Não poderia declarar, por exemplo, "Funcionario Func;" nesta mesma classe Empresa no lugar de "Funcionario f1"? Fiz isso e obtive um monte de erros novos. Nesta classe ele tem, necessariamente, que ter o mesmo nome de variável que declaro na classe TestaEmpresa? É porque estou criando uma instância, é isso?

2 - É correto pensar que, quando estou escrevendo o código da classe Empresa eu tenho que saber exatamente quantos funcionários eu terei na instância desta classe (ou seja, na empresa)?

3 - Entendo que quando crio a classe TestaEmpresa, o que estou fazendo é criando uma instância da classe Empresa, sendo assim, não posso adicionar um "Funcionário f2" a mais por exemplo (pois não existe f2 lá em Empresa). É certo pensar desta forma?

Não sei se ficou claro, caso não, posso tentar explicar melhor. Sei que as dúvidas são bem básicas, estou tentando fazer vários e vários exercícios simples como este para ver se a lógica da coisa sedimenta, mas tem sido bem difícil criar o "modelo mental" de POO.

Como sempre, agradeço os insights e bora estudar!
TG

2 Respostas

A
Opus_magno:
Boa noite a todos;

São dúvidas mais conceituais que técnicas, mas vamos lá. Tenho as 3 classes básicas abaixo:

Funcionario:
class Funcionario {

	//Atributos e alguns métodos simples;

}
Empresa:
class Empresa {
	String nome;
	String CNPJ;
	//Métodos
}
TestaEmpresa:
class TestaEmpresa {
	public static void main(String[] args) {

	Empresa empresa = new Empresa();
	empresa.f1 = new Funcionario();
	empresa.f1.salario = 100;
	
	}
}

Ao tentar compilar o TestaEmpresa.java e recebo os seguintes erros:

TestaEmpresa.java:6: error: cannot find symbol
   empresa.f1 = new Funcionario();
          ^
  symbol:   variable f1
  location: variable empresa of type Empresa

TestaEmpresa.java:7: error: cannot find symbol
   empresa.f1.salario = 100;
          ^
  symbol:   variable f1
  location: variable empresa of type Empresa
2 errors

Neste ponto, interpretando as mensagens, imagino que seja porque em minha classe empresa não tenha declarado um atributo Funcionário (não posso instanciar um funcionário dentro de Empresa se não existe este atributo na classe empresa). Então volto e adiciono:

Funcionario f1;

em "Empresa.java" e o código compila.

Deste exemplo simples vem as dúvidas:

1 - Não poderia declarar, por exemplo, "Funcionario Func;" nesta mesma classe Empresa no lugar de "Funcionario f1"? Fiz isso e obtive um monte de erros novos. Nesta classe ele tem, necessariamente, que ter o mesmo nome de variável que declaro na classe TestaEmpresa? É porque estou criando uma instância, é isso?

2 - É correto pensar que, quando estou escrevendo o código da classe Empresa eu tenho que saber exatamente quantos funcionários eu terei na instância desta classe (ou seja, na empresa)?

3 - Entendo que quando crio a classe TestaEmpresa, o que estou fazendo é criando uma instância da classe Empresa, sendo assim, não posso adicionar um "Funcionário f2" a mais por exemplo (pois não existe f2 lá em Empresa). É certo pensar desta forma?

Não sei se ficou claro, caso não, posso tentar explicar melhor. Sei que as dúvidas são bem básicas, estou tentando fazer vários e vários exercícios simples como este para ver se a lógica da coisa sedimenta, mas tem sido bem difícil criar o "modelo mental" de POO.

Como sempre, agradeço os insights e bora estudar!
TG

Pergunta 1 = O erro acontece porque na sua classe empresa, não tem nenhum atributo do tipo funcionário, e na classe testaEmpresa, traduzindo do java para o português, você está falando na classe testaEmpresa:
Cria um objeto do tipo empresa, agora pega o atributo f1 de empresa e cria um objeto do tipo funcionário, depois pega esse objeto e seta o atributo salário em 100.

Mas ai eu te pergunto, a classe empresa tem um atributo do tipo funcionário? não, por isso ocorre os erros, pois você está tentando acessar algo que não existe.

Essa técnica de colocar um objeto dentro de outro chama-se agregação, de uma pesquisada sobre isso.
Outra dica que posso deixar é se atentar aos erros pois nele fala as linhas que estão dando erro, além da descrição ser decifrável.

Pergunta 2 = Teoricamente sim, pois não tem sentido uma empresa ter apenas um funcionário. No java, quando você cria um objeto os atributos são inicializados, e todos os atributos que não são primitivos são inicializados com null, então pra cada empresa você tem um atributo funcionário, mas você poderia criar uma Array de funcionários, assim a empresa poderia ter vários funcionários, tudo depende da sua necessidade.

Pergunta 3 = Respondida na 1

Espero ter ajudado.

Artur Martini

O

Olá Artur,

Com certeza ajudou sim, obrigado.
Apesar de não estar tendo dificuldades com a lógica da programação em si, estes conceitos de objetos, instâncias, etc… tem dado algum trabalho, confesso.

Vou procurar sobre agregação.

Ótimo final de semana! Resolvido.
TG

Criado 20 de fevereiro de 2014
Ultima resposta 21 de fev. de 2014
Respostas 2
Participantes 2