Atributos e Métodos Estáticos

Atributos e métodos que pertencem à classe e não precisam de instâncias para serem usados/acionados. Precedidos da cláusula static.

Classe Registro

Veja exemplo da classe Registro que define um atributo e um método estáticos. Métodos estáticos só podem se referir a atributos estáticos.


In [1]:
public class Registro {
   static int contador = 0;
   
   static int proximoContador() {
      contador++;
      return contador;
   }
}


Out[1]:
com.twosigma.beaker.javash.bkr025200b4.Registro

Usando um atributo estático

Precedido apenas pelo nome da classe. Dispensa a criação de instância (objeto).


In [2]:
Registro.contador = 5;
System.out.println("Contador: " + Registro.contador);


Contador: 5
Out[2]:
null

Usando um Método Estático

Também precedido do nome da classe. Tal como o atributo, dispensa a criação de instância.


In [3]:
System.out.println("Contador: " + Registro.proximoContador());


Contador: 6
Out[3]:
null

Atributos e Métodos Estáticos em Instâncias

É possível o acesso a atributos e métodos estáticos a partir dos ponteiros para as instâncias, mas eles continuam se comportando como estáticos, ou seja, pertencente à classe e não a objetos específicos.


In [4]:
Registro r1 = new Registro(),
         r2 = new Registro();
r1.contador = 5;
r2.contador = 7;

System.out.println("Contador r1: " + r1.contador);
System.out.println("Contador r2: " + r2.contador);
System.out.println("Contador r1: " + r1.proximoContador());
System.out.println("Contador r2: " + r2.proximoContador());


Contador r1: 7
Contador r2: 7
Contador r1: 8
Contador r2: 9
Out[4]:
null

Misturando Estáticos com Instância

Uma classe pode misturar atributos e métodos estáticos e de instância.


In [5]:
public class Chat {
   /* Parte Estática
    ****************/
   
   static int contador = 0;
   
   static int proximoContador() {
      contador++;
      return contador;
   }
   
   /* Parte Instância
    *****************/
   
   String nome;
   
   Chat(String nome) {
      this.nome = nome;
   }
   
   void mensagem(String msg) {
      System.out.println(nome + "[" + proximoContador() + "]: " + msg);
   }
}


Out[5]:
com.twosigma.beaker.javash.bkr025200b4.Chat

Usando Estáticos e de Instância

Nesse caso, o mesmo atributo estático (pertencentte à classe) é compartilhado por todos os objetos. Porém os atributos de instância podem ser diferentes para cada objeto.


In [6]:
Chat doriana = new Chat("Doriana"),
     quincas = new Chat("Quincas"),
     melissa = new Chat("Melissa");

doriana.mensagem("Quem aqui gosta de dinossauros?");
quincas.mensagem("Eu gosto!");
melissa.mensagem("Dinossauros? Por que dinossauros?");
doriana.mensagem("Deixa de ser chata Melissa, você gosta ou não gosta?");
melissa.mensagem("Ainda não entendi por que dinossauros.");


Doriana[1]: Quem aqui gosta de dinossauros?
Quincas[2]: Eu gosto!
Melissa[3]: Dinossauros? Por que dinossauros?
Doriana[4]: Deixa de ser chata Melissa, você gosta ou não gosta?
Melissa[5]: Ainda não entendi por que dinossauros.
Out[6]:
null

Tarefa

Nova classe Grafico

Retomando a classe Grafico feita anteriormente (copiada abaixo), modifique classe para que só haja um caractere que seja compartilhado por todos os objetos, em vez cada instância ter seu caractere.


In [7]:
public class Grafico {
   boolean preenchido;
   char caractere;
   
   Grafico(boolean preenchido, char caractere) {
      this.preenchido = preenchido;
      this.caractere = caractere;
   }

   void plota(int valor) {
      for (int v = 1; v < valor; v++)
         System.out.print((preenchido) ? caractere : ' ');
      System.out.println(caractere);
   }
}


Out[7]:
com.twosigma.beaker.javash.bkr025200b4.Grafico

In [ ]:


In [8]:
Grafico g1 = new Grafico(true, '#');
Grafico g2 = new Grafico(false, '*');

g1.plota(10);
g1.plota(12);
g1.plota(8);
System.out.println();
g2.plota(4);
g2.plota(5);
g2.plota(7);


##########
############
########

   *
    *
      *
Out[8]:
null

Aplicação para a Nova Classe Grafico

Escreva um código para testar a sua classe.


In [ ]: