Metodos static e a memoria

Bom, metodos e propriedades declarados como “static” sao comuns a todas instancias de determinado objeto, ou seja, ha apenas uma referencia na memoria independentemente da quantidades de objetos criados.

A duvida eh: isso reduz o consumo de memoria, “otimiza” o programa? por exemplo, digamos que eu tenha os metodos “void escreve(), int retornaMultiplicacao(int, int)” e a propriedade “String nomeDaClasse”. Nao vejo uma razao para nao declarar tais como static, ja que nao dependem de algo que mude de objeto para objeto. Dessa forma, se eu tiver 4 referencias para objetos da classe X, teria apenas uma referencia para os metodos 'escreve, retornaMultiplicacao" e uma referencia para “nomeDaClasse” na memoria.
Ta certo essa minha colocacao?

Se estiver, entao eh recomendavel declarar tudo o que foi possivel como static?

Rafael

As chamadas de método static são MUITO mais rápidas que as não static. Porque? Porque eles sao resolvidos em tempo re compilacao, e nao de execucao!

Tipo

Object o = new String(“paulo”);
System.out.println(o.toString());

Aqui, a resposta será “paulo”, e não “java.lang.Object@1df47a”. Porque? Porque eh feita uma chamada de metodo virtual, ele chama o toString da verdadeira classe do objeto.

Agora, experiemente fazer isso para um metodo estatico. O metodo chamado seria o da classe Object, e nao da String.

Essa procura do metodo que ele deve chamar, eh LENTA em java. Tipo, nao muito lenta, mas consome tempo. Por isso metodos estaticos sao muito mais rapidos na chamada.

Usa sempre metodos estaticos? Nunca. Dessa maneira voce estaria perdendo o bem mais valioso do java, a orientacao a objetos.

Voce quer deixar seus metodos da sua classe sendo executado mais rapidamente? Declare a classe final! Porque? Porque assim o java fica esperto, e nao precisa procurar que metodo chamar, ja que ele sabe que aquela classe nao tem subclasses! Louco neh?

Bom, mas ainda fica uma duvida: quando eh conveniente declarar como static e quando nao? ( tirando as respostas obvias como compartilhar recursos )…

Usa static quando a chamada de metodo que voce for fazer, nao envolve nenhuma instancia da classe que voce quer colcoar o metodo static

melhor: quando voce eprcebe que aquele metodo poderia estar em qualquer outra classe!

utilizar static em varíaveis
somente em variáveis globais

[quote=“blackhat”]utilizar static em varíaveis
somente em variáveis globais[/quote]

Nao eh bem assim :slight_smile:
Pode ter uma variavel staic que seja private. Static na eh utilizado apenas para “emular” variaveis globais.

Sem contar os metodos estaticos.

Acho que é inútil declarar uma variável static como private ja que static normalmente é chamado Classe.ALGUMACOISASTATIC ou até mesmo um método.

Inutil nao eh. Considere isso:

// ....
private static int contador = 0;
// ....
public static int getNextValue()
{
    return contador++;
}
// ...

dessa maneira vc nao pode acessar “contador” diretamente, mas garante que todas as intstancias da classe vao compartilhar a mesma variavel entre si.

Rafael

exatamente

alias, tem gente que programa sem NUNCA escrever uma variavel PUBLIC, soh metodos…

outra coisa, para voce fazer um SINGLETON, precisa de um provate static

a hora certa de vc escrever um public static eh pra constantes, ai viria um final tambem