Para que serve a palavra static?

Pessoal boa noite.

Estou migrando do Delphi para Java e estudando alguns livros fiquei confuso a respeito da palavra “static”.
Para que ela serve?
Escrevi a class abaixo e ela funcionou perfeitamente mas quando eu instancio a classe Montagem sem a palavra static da erro. Por que? e se o método “mostraMontagem” não for declarado com essa palavra “static”
também da erro. Por que? Alguém pode me ajudar esclarecendo esta dúvida.

public class Calculo {
static Montagem m = new Montagem();

public static void main(String args[])
{
Calculo cl = new Calculo();
cl.printMessage(“Mensagem escrita em java”);
m.mostraMontagem(“Frase de calculo escrita em montagem”);

 }
 private void printMessage(String msg)
  {
    System.out.println(msg);
   };

}

class Montagem {
public Montagem()
{

    }
   public static void mostraMontagem(String palavra)
     {
       System.out.println(palavra);
     }

}

obs: estou usando o bloco de notas nos meus codigos para entender melhor o funcionamento da linguagem.

Muiiito obrigado!

Olá
Static serve para referenciar todos aqueles atributos/métodos de classe, ou seja, que podem ser acessados diretamente da definição da classe, sem precisar instanciar nenhum objeto.

No Delphi, por exemplo, você tem este comportamento para métodos através de uma class procedure:

[code]type
TClasse = class
public
class procedure MetodoEstatico;
end;

// Chamando o método
TClasse.MetodoEstatico;
[/code]
No Java, ficaria assim:

[code]public class Classe {
public static void metodoEstatico() {
}
}

// Chamando o método
Classe.metodoEstatico();
[/code]
Abraços

Você não precisa instanciar um objeto pra acessar algum método dela.

Veja Math.

Quando é no campo (tipo public static int contador = 0), cada vez que você incrementar o contador, o valor dele vai valer pra cada objeto criado daquela classe. (Opz, acho que falei alguma coisa errada, me corrijam).

Então tipo, supondo uma classe X com uma variável static int i = 0. Cada vez que você criar um objeto dessa classe e incrementar o i, o valor dele vai valer pra todas os outros objetos que serão criados. Tipo, x1 incrementou e i == 1. Quando x2 é criada, o valor de i é 1.

http://www.guj.com.br/java.artigo.121.1.guj

Devo ter falado alguma coisa errada. O conceito dela não é bem firmão pra mim também.

Então cara… em Java, você pode ter 3 coisas “static”: blocos de inicialização, variáveis/métodos e classes internas.

Primeiro precisa entender o seguinte. Static é a mesma coisa que “de classe”, e não “de objeto”. Uma classe pode ter vários objetos. Por exemplo:
Carro vectra = new Carro();
Carro palio = new Carro();

Aqui temos apenas uma classe: “Carro”
Mas temos dois objetos: “vectra” e “palio”

Agora que já sabe a diferença entre classe e objeto, fica mais fácil. Static é “de classe”, ou seja, uma variável static da classe Carro teria o mesmo valor para qualquer objeto (vectra, palio, fusca, ferrari…). Tanto que você nem precisa criar objetos pra acessa-las. Ela é usada geralmente para contadores, ver quantos objetos foram criados a partir da classe, ou então para fazer variáveis globais (como vc deve fazer em Delphi).

Se você não coloca static nas variáveis, elas ficam com uma cópia diferente pra cada objeto (o que é o mais usual).

Blocos de inicialização são bloquinhos com coisas que você quer que executem quando a classe for carregada na virtual machine, o que acontece apenas uma vez (nunca precisei usar isso, é só pra saber que existe). Por exemplo:

static {
System.out.println(“O classloader carregou essa classe!!”);
}

E classes internas são classes dentro de classes, que também podem ser static (também nunca precisei usar isso, mas saiba que existe). Por exemplo:

class Externa {

static class interna {

}

}

Espero ter esclarecido cara… abração

3 curtidas

Pessoal, quando postarem códigos, por gentileza, usem a tag code. Quem não sabe fazer isso, pode dar uma lida aqui:
http://www.guj.com.br/posts/list/50115.java