Métodos estáticos e variaveis de instancia

Métodos estaticos nao podem usar variaveis nao estáticas de instancia? Porque?

Métodos estáticos são métodos da Classe. Variávies de instancia são variáveis do objeto instanciado.

http://www.devdaily.com/blog/post/java/compiler-error-cannot-make-static-reference-to-non-static

Os métodos estáticos são métodos que não dependem de um objeto. Tais métodos são chamados sem que haja uma instância da classe que declara o método.
Como o método estático não possui ligação com um objeto, então o método não pode usar variáveis de instância, que são variáveis de um objeto.
Entendeu?
Qualquer coisa pergunte se não ficou claro e nós explicaremos :wink:

tipo Math.random();??
método estatico sem instancia?

[quote=denisspitfire]tipo Math.random();??
método estatico sem instancia?[/quote]

Exatamente. O método random() é chamado sem que a classe Math seja instanciada.

Yes.

Boa tarde a todos.

Para entender melhor o que são métodos estáticos é necessário entender para que servem e como funcionam.

Estes métodos funcionam como métodos globais, que executam um procedimento ou modificam valores de variáveis globais que são utilizados pela aplicação contendo apenas um único valor para toda a aplicação, enquanto que se elas estivessem em escopo de instância (Objeto), se o objeto fosse instanciado mais de uma vez, estes valores podiam variar de objeto para objeto, e o procedimento poderia variar de objeto para objeto, quando o que se deseja é apenas um único valor para as variáveis, ou apenas um determinado procedimento para toda a aplicação.

No Object Pascal do Delphi, métodos estáticos podiam ser declarados fora do escopo de classes, em um arquivo chamado de Unit (Unidade), onde geralmente também as classes e interfaces são declaradas. Estas Units eram que determinavam como os tipos de variáveis, métodos, classes e interfaces eram estruturadas e armazenada na memória. Já no java, ele entende que o que determina a estrutura de variáveis e métodos armazenados em memória é a Classe ou Interface, eliminando o papel da Unit, e por esta razão, tanto variáveis com métodos, sejam eles estáticos ou não, devem ser declarados no escopo de classe, onde os métodos estáticos são apenas membros de classe, enquanto que os métodos não estáticos são membros de instância (Objeto).

Que ver um exemplo:

     public class TesteEstatico {

             public static void mensagem() {
                   System.out.println("Estou emitindo mensagem");
             }
     }

     // Instanciando a classe TesteEstatico
     TesteEstatico teste = new TesteEstatico();

     // Não funciona
     teste.mensagem();

     // Assim funciona
     TesteEstatico.mensagem();

Repare que para invocar o método estático “mensagem” da classe “TesteEstatico” eu tive que fazer referência a ele com o nome da Classe, enquanto que com a instancia “teste” não funcionou porque este método está apenas em escopo de classe e não de instância.

Métodos estáticos não precisam de instâncias, porque quando a sua a aplicação é invocada, instanciada e armazenada em memória, o JVM, carrega para memória todas as variáveis e métodos estáticos de todas as classes, onde o nome da classe fica com um identificador (ponteiro) do método ou variável, ficando lá até a sua aplicação ser eliminada da memória. Por esta razão, é preciso ter cuidado quando declaramos variáveis e métodos estáticos em excesso, para que não tenhamos um estouro de memória a ainda assim não tirar toda a objetividade da orientação a objeto em que a linguagem Java oferece.

Um abraço.

1 curtida