Problema em Static - Iniciante

16 respostas
toni.esteves

Pessoal sou novo no forum, procurei algo a respeito mas não encontrei (desculpe se não procurei direito). O problema eh o seguinte, tava tentando resolver um exercicio da apostila da Caelum - fj11, que diz assim :

Adicione um atributo na classe Funcionario de tipo int que se chama identificador. Esse identifi-
cador deve ter um valor único para cada instância do tipo Funcionario. O primeiro Funcionario instanciado
tem identificador 1, o segundo 2, e assim por diante. Você deve utilizar os recursos aprendidos aqui para
resolver esse problema.
Crie um getter para o identificador. Devemos ter um setter?

minha clase Funcionario tah assim :
public class Funcionario {

	private static int Identificador;

	private String nome;
	private Integer idade;
	private Double peso;

	// Construtor
	Funcionario() {

		Funcionario.Identificador = Funcionario.Identificador + 1;
	}

	// Construtor.
	Funcionario(String nome) {
		this.nome = nome;
	}

	public int getIdentificador() {

		return Funcionario.Identificador;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Integer getIdade() {
		return idade;
	}

	public void setIdade(Integer idade) {
		this.idade = idade;
	}

	public Double getPeso() {
		return peso;
	}

	public void setPeso(Double peso) {
		this.peso = peso;
	}

}

Soh que não tow conseguindo a saida desejada, keria q vcs me ajudassem por favor..vlww

16 Respostas

T

O que está dando de errado?

toni.esteves
na minha classe principal tenhu:
public class Principal {

	public static void main(String[] args) {

		
		Funcionario funcionario = new Funcionario("Toni");
		System.out.println(funcionario.getNome());
		System.out.println(funcionario.getIdentificador());
		
		Funcionario funcionario2 = new Funcionario("Teste");
		System.out.println(funcionario2.getNome());
		System.out.println(funcionario2.getIdentificador());

		
	}

}

i saida que ele me dah eh a seguinte :

Toni
0
Teste
0

O idela seria que ele incrementasse e imprimisse pra o objeto funcionario o nome Toni : 1 e pra o o bjeto funcionario2 o nome Teste : 2...

o que vc axa ?

T

No construtor da Classe Funcionario:

// Construtor.  
    Funcionario(String nome) {  
        this.nome = nome;  
    }

Adicione essa linha

Funcionario.Identificador = Funcionario.Identificador + 1;

ficando assim :

// Construtor. Funcionario(String nome) { Funcionario.Identificador = Funcionario.Identificador + 1; this.nome = nome; }

Faça o teste ai agora:

public class main { public static void main(String[] args){ Funcionario funcionario1 = new Funcionario("Fun1"); Funcionario funcionario2 = new Funcionario("fun2"); Funcionario funcionario3 = new Funcionario("fun2"); System.out.println(funcionario1.getIdentificador()); } }

A

Olá, uma dica:

Por convensao os atributos devem começar com letra minúscula… Se for constante deverá tudo em maiusculo.

Abraço,

toni.esteves

aeeew vlw Two_, mas me deh um breve explicação por favor. Isso significa que um construtor estava sobrepondo o outro, ou o q ?

toni.esteves

vlw a dica tbm andre !! :wink:

T

Toni, um construtor é executado quando vc instancia um Object ou seja, quando se faz:

new Funcionario();

Um construtor pode ser vazio ou receber parâmetros como você fez:

Funcionario(String nome) { Funcionario.Identificador = Funcionario.Identificador + 1; this.nome = nome; }

Toda classe possui 1 ou vários construtores e é definido qual construtor vai ser executado pelos parametros que ele recebe
por exemplo crie um novo construtor na classe Funcionario
assim:

Funcionario(String nome,String mensagem) { Funcionario.Identificador = Funcionario.Identificador + 1; this.nome = nome; System.out.println(mensagem); }

e teste assim!

Funcionario funcionario = new Funcionario("Funcionario Joao","BOM DIA!");
feltraco

Sobrescrevendo nao @toni
Voce simplesmente nao tratava o atributo identificador em lugar nenhum do seu codigo.

E o exercicio te pedia para incrementar automaticamente, por isso adicionar ele no constructor.

[]`s

aajjbb

Como você tem 2 construtores. quando você instanciar um funcionario, já passando o nome; o construtor e incrementa o variavel estatica Identificador nao será incrementada; entao ou você tem apenas um construtor que ja receba o nome; e tambem incremente a variavel; para obter a saida do valor;

System.out.println(f1.Identidicador);

e o valor será o numero total de funcionarios ja estanciados. e nao um identificador para cada instancia;

toni.esteves

mas feltraco , eu naum estava tratando o construtor dessa forma ??:

Funcionario() {

Funcionario.Identificador = Funcionario.Identificador + 1;
}

T

toni,
está fazendo certinho

pmlm

Tens que ter duas variaveis para identificador. Uma estática, tal como tens para saberes qual será o próximo número de identificador a gerar para um novo funcionário. E outra da classe, com o identificador do funcionário actual.

public class Funcionario {  
  
     private static int identificadorContador = 0;  
   
     private String nome;  
     private Integer idade;  
     private Double peso;  
     private int identificador;
   
     // Construtor  
     Funcionario() {  
           
          this.identificador = Funcionario.identificadorContador++;  

     }  
(...)
feltraco

Sim @toni.esteves , vc fazia.
Porem esta fazendo no Constructor (), e na aplicacao vc utiliza o Constructor passando o nome como parametro, onde nao havia esta incrementacao.

Para incrementar independete de qual constructor vc usar, vc teria que ou duplicar a linha de codigo nos dois contructor e nos demais que podem vir a ter, ou criar uma funcao que sera chamada dentro do constructor.

[]`s

drigo.angelo
Quando faço mais de um construtor, geralmente eu coloco um para chamar o outro, por exemplo:
// Construtor  
     Funcionario() {  
         //Construtor padrão, inicia os campos com valor default..
         Funcionario.Identificador = Funcionario.Identificador + 1;  
     }  
  
     // Construtor.  
     Funcionario(String nome) {  
         this(); //Chama o construtor padrão
         this.nome = nome;  //Faz as alterações que eu quero
     }
gRoOve
drigo.angelo:
Quando faço mais de um construtor, geralmente eu coloco um para chamar o outro, por exemplo:
// Construtor  
     Funcionario() {  
         //Construtor padrão, inicia os campos com valor default..
         Funcionario.Identificador = Funcionario.Identificador + 1;  
     }  
  
     // Construtor.  
     Funcionario(String nome) {  
         this(); //Chama o construtor padrão
         this.nome = nome;  //Faz as alterações que eu quero
     }
Qual a finalidade de fazer um construtor chamar outro? Legibilidade do código? Organização? No lugar desta linha:
this(); //Chama o construtor padrão
poderia fazer assim?
Funcionario();
toni.esteves

feltraco, vlww meu brother, dei uma estudada ontem ainda, auxiliada pela tua explicação. Consegui entender td…vlww a todos :wink:

Criado 8 de fevereiro de 2011
Ultima resposta 9 de fev. de 2011
Respostas 16
Participantes 8