Uma coleção de resumos, para ajudar os que precisam daquele empurrão.
Tal como as instâncias de uma classe as classes em si podem ter variáveis e métodos, estes servem para definir dados e comportamento que seja igual para todas as instâncias independentemente do seu estado interno
Para distinguir um variável ou método de classe dos de instância usa-se a
keyword static
public class MyClass{
private static String foo = "Foo"; // Variável de classe
public static String getFoo(){ // Método de classe
return foo;
}
private String bar; // Variável de instância
public MyClass(){ // Construtor
this.bar = "Bar";
}
public String getBar(){ // Método de instância
return this.bar;
}
}
Pontos importantes a notar deste exemplo:
null
no caso dos objectos). Visto
não existe um “constructor de classe”.this
visto que não pertencem a nenhuma instância. Aliás a referencia this
não
pode ser usada dentro de um contexto static
, visto que não existe nenhuma
instância para referenciar.public static void main(String[] args){
MyClass mc = MyClass();
String bar = mc.getBar();
String foo = MyClass.getFoo();
}
Variáveis de classe podem ser vistos como variáveis globais do programa, são criadas quando o programa é iniciado e existem durante todo o tempo de vida do programa.
public class MyClass{
private static int count = 0;
public static int getC(){
return count;
}
public MyClass(){
count++;
}
}
public static void main(String[] args){
int a = -1;
a = MyClass.getC(); // a == 0
MyClass mc = new MyClass();
a = MyClass.getC(); // a == 1
}
Como podemos ver por este exemplo, como o constructor altera o valor da
variável static
esta modificação é visível independente do contexto.
Por vezes queremos garantir que existe apenas uma instância da nossa classe isto pode ser conseguido com métodos de classe.
public class Highlander{
private static Highlander instance = null;
private static Highlander get(){
if(instance == null) instance = new Highlander();
return instance;
}
private Highlander(){
}
}
O que isto implica é que não podem ser criadas instâncias novas porque o
construtor é private
e para obter uma instância temos de usar o método
static
get()
, que irá retornar sempre a mesma instância.
As interfaces também podem ter métodos static funcionando como qualquer qualquer outro método de classe.
public interface MyInterface{
public static foo(){
System.out.println("Bar");
}
}
public class Main{
public static void main(String[] args){
MyInterface.foo();
}
}