Metodo como nome static

boa tarde galera

alguem pode me explicar como funciona isso

static {
.
.
.
.
}

eu não entendo o que isso faz, parece um metodo chamado static sei lá

abs a todos

Não é um método.

Isso vai fazer que logo quando java “ler” (não sei se é bem essa expressão) a classe (não necessariamente instanciar) vai executar esse trecho de código.

Isso não é um método e sim um bloco contendo instruções que serão executadas apenas uma vez (quando a classe for carregada).

Essas instruções só podem referenciar membros estáticos da classe a que pertence.

http://java.sun.com/docs/books/tutorial/java/javaOO/initial.html

ele vai executar mesmo que a classe não seja instanciada neh?

Essas instruções só podem referenciar membros estáticos da classe a que pertence.

não entendi o que vc quis dizer com isso???

att


http://www.guj.com.br/posts/list/1076.java

  • Hum, mais ou menos. Se você nunca referenciar a classe (seja instanciando um objeto dessa classe, seja usando o “Class.forName”, seja acessando um método estático dessa classe) então a classe não será carregada e o bloco não será executado.

[quote]Essas instruções só podem referenciar membros estáticos da classe a que pertence.

não entendi o que vc quis dizer com isso??? [/quote]

Vou dar um exemplo.

class Jaraqui {
    public int x;
    public static double y;
    static {
        x = 0; // dá erro de compilação porque x não é estática
        y = 1.0; // esta linha está OK
    }
}

Mass então eu posso executar normalmente chamando mtodos dentro contanto que eu não uso atributos não estaticos

exemplo

[code] static {

	ElementDesc elemField = new ElementDesc();
	elemField.setFieldName("logradouro");
	elemField.setXmlName(new QName("bean-mappings.xml", "logradouro"));
	elemField.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
	elemField.setNillable(true);
	typeDesc.addFieldDesc(elemField);
	
	elemField = new ElementDesc();
	elemField.setFieldName("bairro");
	elemField.setXmlName(new QName("bean-mappings.xml", "bairro"));
	elemField.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
	elemField.setNillable(true);
	typeDesc.addFieldDesc(elemField);

}[/code]

[quote=herbertins]ele vai executar mesmo que a classe não seja instanciada neh?

Essas instruções só podem referenciar membros estáticos da classe a que pertence.

não entendi o que vc quis dizer com isso???

att[/quote]

Sim, não precisa instanciar uma classe. No momento que a classe for chamada(de qualquer forma) pela primeira vez, esses atribuições inline à variáveis static e os blocos static serão executados na ordem que se encontram no código.

E métodos static só podem acessar variáveis static, e variáveis locais (contando também aquelas passadas como argumento para o parâmetro do método).

Exemplo

public class StaticTestMain
{
   static int i = 1;
   int j = 2;

   public static void main(String[] args)
   {
      System.out.println(i);
      System.out.println(j);
   }
}

Dá este erro

StaticTestMain.java:11: non-static variable j cannot be referenced from a static context System.out.println(j); 1 error
Isto por que main, um método static, está acessando uma variável não static. É um dos erros mais comuns cometidos por iniciantes.

Para resolver isso instanciamos um objeto da classe:

[code]
public class StaticTestMain
{
static int i = 1;
int j = 2;

public static void main(String[] args)
{
System.out.println(i);

  StaticTestMain main = new StaticTestMain();
  System.out.println(main.j);

}
}
[/code]CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)

[quote=herbertins]Mass então eu posso executar normalmente chamando mtodos dentro contanto que eu não uso atributos não estaticos

exemplo

[code] static {

	ElementDesc elemField = new ElementDesc();
	elemField.setFieldName("logradouro");
	elemField.setXmlName(new QName("bean-mappings.xml", "logradouro"));
	elemField.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
	elemField.setNillable(true);
	typeDesc.addFieldDesc(elemField);
	
	elemField = new ElementDesc();
	elemField.setFieldName("bairro");
	elemField.setXmlName(new QName("bean-mappings.xml", "bairro"));
	elemField.setXmlType(new QName("http://www.w3.org/2001/XMLSchema", "string"));
	elemField.setNillable(true);
	typeDesc.addFieldDesc(elemField);

}[/code][/quote]

O único atributo static aí é typeDesc. O resto é variável local, que não são atributos.