Metodo como nome static

9 respostas
herbertins

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

9 Respostas

jingle

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.

T

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.

zinho

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

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

Focao


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

T
  • 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.

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

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

Vou dar um exemplo.

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

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

exemplo

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);

	}
B
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

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:
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);
   }
}
CONSTRUÍDO COM SUCESSO (tempo total: 0 segundos)
B
herbertins:
Mass então eu posso executar normalmente chamando mtodos dentro contanto que eu não uso atributos não estaticos

exemplo

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);

	}
O único atributo static aí é typeDesc. O resto é variável local, que não são atributos.
Criado 13 de novembro de 2008
Ultima resposta 13 de nov. de 2008
Respostas 9
Participantes 6