Estudando static

...Entendendo static...                                          

É um modificador que pode ser utilizado para métodos e váriaveis. Quando algum recurso é marcado com esse modificador pertence a uma classe e nao suas instâncias.Entao, podemos acessar métodos ou variáveis estáticas, sem mesmo criar uma cópia da classe. Usando o modificador static, garante que haverá sempre uma única referência, para métodos ou variáveis.Declarando algo como Static, todas as instancias da classe irá compartilhar a mesma cópia da variável ou método. E outra coisa, é que podemos acessar diretamente, sem a necessidade de instânciar uma classe, como nao acontece em não static.

Dentro de métodos estáticos, podemos acessar somente outros métodos e variáveis estáticos. 

Um exemplo para minha compreensão:

class Exemplo   
{   
  
    // Variavel static   
    public static int contador = 0;   
  
    // Variavel nao-static   
    public int outroContador = 0;   
  
    public  Exemplo() {}   
  
    // Precisa ser static porque "contador" é static   
    public static void incrementaContador()   
    {   
        contador++;   
  
        System.out.println("contador agora é "+ contador);   
    }   
  
    public void incrementaOutroContador()   
    {   
        outroContador++;   
  
        System.out.println("outroContador agora é "+ outroContador);   
    }   
}   
  
public class StaticTeste   
{   
    public static void main(String args[])   
    {   
        Exemplo ex1 = new Exemplo();                        
        ex1.incrementaContador();   
        ex1.incrementaOutroContador();   
  
        Exemplo ex2 = new Exemplo();   
        ex2.incrementaContador();   
        ex2.incrementaOutroContador();   
          
        Exemplo ex3 = newExemplo();   
        ex3.incrementaContador();   
        ex3.incrementaOutroContador();   
  
        Exemplo ex4 = newExemplo();   
        ex4.incrementaContador();   
        ex4.incrementaOutroContador();   
    }   
}  

Saída:
contador agora é 1  
outroContador agora é 1
contador agora é 2  
outroContador agora é 1
contador agora é 3  
outroContador agora é 1
contador agora é 4  
outroContador agora é 1 
**reparem uma coisa, que a variável "contador" teve seu valor incrementado a cada novo objeto criado, enquanto a variável "outroContador", nao mudou o seu valor, ficou sempre em 1, pois seu valor foi zerado em seu construtor da classe.**


Um outro exemplo mostra que usando o modificador static, podemos acessar diretamente um método ou uma váriável , sem a necessidade instânciar a classe, ou seja, (acesso direto).

   
class Exemplo2   
{   
    // Escreve alguma frase na tela   
    public static void escreve(String msg)   
    {   
        System.out.println(msg);   
    }   
       
    // Retorna a multiplicação de dois números int   
    public static int multiplica(int n1, int n2)   
    {   
        return (n1 * n2);   
    }   
       
    // Construtor, apenas para mostrar que   
    // ele nem chega ser chamado   
    public Exemplo2()   
    {   
        System.out.println("Construtor do Exemplo2");   
    }   
}   
  
public class StaticTeste2   
{   
    public static void main(String args[])   
    {   
        //acessando diretamente
        Exemplo2.escreve("Multiplicando 3 vezes 3:");   
        int resultado = Exemplo2.multiplica(33);   
        Exemplo2.escreve("Resultado: "+ resultado);   
    }   
}

Agora se não fosse static:

public class StaticTeste2   
{   
    public static void main(String args[])   
    {   
        // necessário instanciar a classe para acessar
        Exemplo2 ex2 = new Exemplo2();   
        ex2.escreve("Multiplicando 3 vezes 3:");   
        int resultado = ex2.multiplica(33);   
        ex2.escreve("Resultado: "+ resultado);   
    }   
}  
...
Editar

0 comentários: