8
respostas

Dúvida com vários construtores e o método static

Boa noite a todos. O meu construtor funcionou com método static, tudo correto, mas eu fiquei com uma dúvida. Criei dois construtores na classe Funcionario. O padrão, e outro que só recebe o nome (conforme o exercício de construtores). Na hora de passar a variável estática, tive que repetir o código nos dois construtores dessa forma:

    public Funcionario(){
        this.identificador = proximoFuncionario++;
    }

    public Funcionario(String nome){
        this.nome = nome;
        this.identificador = proximoFuncionario++;
    }

Quando tentei fazer colocando no construtor default o this(identificador) para não repetir o código, o compilador acusou um erro:

    public Funcionario(){
        this.identificador = proximoFuncionario++;
    }

    public Funcionario(String nome){
        this.nome = nome;
        this.identificador = proximoFuncionario++;
    }

Funcionario.java:13: error: cannot reference identificador before supertype constructor has been called this(identificador); ^

Existe outra forma de chamar o atributo estático no construtor "menor" sem ter que repetir o código?

8 respostas

Cara fiquei meio confuso... vc colocou dois codigos identicos... Acho q o problema é com o atributo estatico da classe... Seria isso aqui mano?

Acho q o problema é que as variaveis estaticas sao criadas qdo a JVM da um load na class

Tenta assim oh nesse contexto q vc colocou...


public class Funcionario {

    private static int identificador = 10;
    private String nome;

    public Funcionario() {
        this(identificador);
    }

    public Funcionario(String nome) {
        nome = nome;
    }
}

Isso aqui, repara, ta recebendo uma variavel estatica de classe no construtor, oo objeto nem existe ainda e ta recebendo uma variavel de instancia, ate msm pq o objeto nem foi criado ainda.

public Funcionario(){
this.nome = nome;
}

N sei se consegui me expressar bem...

Repeti o código eita, mas o que eu tentei fazer e deu erro foi mais ou menos o que vc sugeriu. Segue:

    public Funcionario(){
        this(identificador);
    }

    public Funcionario(String nome){
        this.nome = nome;
        this.identificador = proximoFuncionario++;
    }

Samuel não entendi direito o seu problema amigo, o seu problema é quando você passa uma variavel static no seu construtor? A variavel identificador é estatica? você queria chamar uma variavel estatica no construtor? Lembra que quando uma variavel e estatica você não chama ela pelo objeto instanciado e sim pela própria Entidade "classe".

public Funcionario() {
    Funcionario.identificador = proximoFuncionario++;
}

Sua duvida seria algo relacionado com isso?

Agora entendi, respondendo sua pergunta... é so vc colocar identificador++ no construtor n precisa de atribuir um proximoFuncionario.

Exemplo

public class Funcionario {
    String nome;
    static int identificadorComNome;
    static int identificadorSemNome;


    public Funcionario(){

        identificadorSemNome++;
    }

    public Funcionario(String nome){
        this.nome = nome;
        identificadorComNome++;
    }


    public static void main(String[] args){

        Funcionario testeSemNome1 = new Funcionario();
        Funcionario testeSemNome2 = new Funcionario();
        Funcionario testeSemNome3 = new Funcionario();

        Funcionario testeComNome1 = new Funcionario("renan");
        Funcionario testeComNome2 = new Funcionario("asdrubal");
        Funcionario testeComNome3 = new Funcionario("tiao");


        System.out.println(Funcionario.identificadorComNome);
        System.out.println(Funcionario.identificadorSemNome);


    }

Saida

3

3

Oi Renan, não deu certo a sua implementação. Bom, deixa eu me explicar melhor: Na aula de construtores é passado que podemos invocar um construtor dentro do outro da seguinte forma:

public Conta(int numero, double limite) {
    this(numero, limite, 0);
}

public Conta(int numero, double limite, double saldoInicial) {
    this.numero = numero;
    this.limite = limite;
    this.saldo = saldoInicial;
}

O que eu tentei fazer foi invocar o método estático do construtor que eu declarei dentro do construtor padrão da classe, sem precisar digitar o código duas vezes, igual no exemplo acima, mas creio que por ser estático, preciso repetir o código ao invés de usar o this.

kkkkk q confusao man, mas blz é isso mesmo.

A variavel estática ela é uma só pra todo mundo, mas a sua ideia funciona cara, o construtor padrao(na vdd n eh padrao mais pq colocamos 2 parametros nele neee XD) com o this, joga os valores nas variaveis estaticas da classe

public class Funcionario {
    static int numero;
    static double saldo;
    static double limite;

    public Funcionario(int numero, double limite){
        this(numero, limite,0);
    }
    public Funcionario(int numero, double saldo, double limite){
        this.numero = numero;
        this.saldo = saldo;
        this.limite = limite;
    }



    public static void main(String[] args){

        Funcionario novo = new Funcionario(2,299);

        System.out.println(novo.numero);
        System.out.println(novo.saldo);
        System.out.println(novo.limite);

//Saida
//2
//299.0
//0.0
    }

Bem Samuel, não seria isto que você está tentando fazer?

public class FuncionarioTeste {

    //Atributo da classe FuncionarioTeste que será compartilhado por todos os objetos instanciados desta classe.
    private static int numFuncionarios = 0;

    //Atributo do objeto.Acessado apenas pela instancia que o contém.
    private String nome;

    //Método que retorna o número de funcionários instanciados.

    public static int getNumFuncionarios(){
        return FuncionarioTeste.numFuncionarios;
    }

    //Construtor padrão. Sem a obrigatoriedade de indicar atributos.    
    FuncionarioTeste(){
        this("");


    }
    //Construtor com o obigatoriedade de indicar o atributo nome
    FuncionarioTeste(String nome){
        this.nome = nome;
        FuncionarioTeste.numFuncionarios++ ;


    }

    public String getNome(){
        return this.nome;
    }
}

public class testaFuncionarioTeste {

    public static void main(String[] args) {

        FuncionarioTeste func1 = new FuncionarioTeste();
        System.out.println(Funcionario.getNumFuncionarios());
        System.out.println("Nome Funcionário: "+func1.getNome());
        FuncionarioTeste func2 = new FuncionarioTeste("João");
        System.out.println(Funcionario.getNumFuncionarios());
        System.out.println("Nome Funcionário: "+func2.getNome());

    }

}

Boa noite, Samuel. Você poderia fazer dessa forma.

public Funcionario() {
    this.identificador = proximoFuncionario++;
}

public Funcionario(String nome){
    this();
    this.nome = nome
}

Assim, quando for criar um funcionário usando o construtor com parâmetros, você força seu construtor a chamar o construtor sem parâmetro this(), dessa forma você evita duplicar código. Bom estudos. :)