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
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.
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]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.