Para que serve o static{ ... }  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
daniel-6-strings
Thread.start()

Membro desde: 13/10/2009 15:44:25
Mensagens: 43
Offline



Eu andei vendo isso em códigos de terceiros em Java e .NET C#, e não entedi como funciona e para que serve, os atributos static eu entendo, fazem parte da classe e não de uma instancia, mas esse codigo eu não entendi, alguém pode me explicar ?

Obrigado.

This message was edited 1 time. Last update was at 26/01/2010 03:03:20

sulito
Virtual Machine Man

Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline

Estas com sorte eu estou estudando para a prova SCJP, e ainda estou nos primeiros capitulos, mas é o seguinte



isto chama-se bloco de inicialização estatico da classe
tipo para inicializar as variaveis de instancia normalmente faz-se isso

int a=3;
mas se quisermos por
int a=3 *(Math.sqrt(34)/44)-Math.exp(9);
visto que esta forma de inicializar a variavel de instançia fica ja um pouco confusa porque a expressão é grande, então dai podemos inicializar nos construtores ou blocos de inicialização.
mas usando os blocos estaticos de inicialização ai não temos que por o mesmo codigo em todos os construtores da classe.
se tem um codigo que estara em todos os construtores ai é boa oportunidade para usar blocos de inicialização, os blocos de inicialização podem ser ou não estatico
mas a linguagem java tem muitas coisas, mas devemos apenas usar aquilo que realmente precisamos e que torna o nosso codigo claro, por isso não acho muito bom por
varios blocos estaticos de inicialização na classe,

e ja ia esquecendo o bloco de inicialização estatico é executado sempre antes de todos os construtores, e se um bloco de inicialização lança uma excepção verificada, então ai todos os construtores devem lançar esta execpção,

This message was edited 1 time. Last update was at 26/01/2010 05:51:19


LPI-101
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2947
Localização: sp
Offline

o que o sulito disse está correto, só complementando...

na ordem é executado da seguinte forma:

primeiro os blocos estaticos das classes mães, avós, etc,começando pela mais acima até chegar a classe sendo usada.

depois disso os blocos não estaticos.

depois os construtores.

os blocos estaticos são executados uma unica vez quando a classe vai para a memoria, enquanto que os não estaticos são executados cada vez que você instancia a classe.

bom, se não me engano é isso.

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
sulito
Virtual Machine Man

Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline

bom, se não me engano é isso.



è mesmo isso não te enganaste, a ordem é esta.

LPI-101
pablouu
Thread.start()
[Avatar]

Membro desde: 27/04/2009 19:35:47
Mensagens: 46
Offline

sulito,
poderia explicar essa parte : e se um bloco de inicialização lança uma excepção verificada, então ai todos os construtores devem lançar esta execpção.
talvez com algum exemplo.
também to estudando pra scjp.

Sun Certified Java Programer 6.0
[Email] [MSN]
sulito
Virtual Machine Man

Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline

É o seguinte, vou ser o mais sincero possivel, eu li isso num livro e ficou o conceito na cabeça, mas nunca testei excepções em blocos estatico , mas prometo que vou fazer uns testes e ainda amanha eu tenho uma exemplo montado, porque eu tambem estou a estudar para o scjp e não quero e nem vou deixar passar nenhuma duvida .
e se eu não encontrar um exemplo no livro, vamos enviar um email para a editora e o autor, para explicarem melhor

This message was edited 1 time. Last update was at 26/01/2010 09:14:38


LPI-101
dipeloco
JavaChild
[Avatar]

Membro desde: 21/05/2007 12:14:11
Mensagens: 124
Offline

Caso um bloco static lance um exception ... ela será encpsulada em uma java.lang.ExceptionInInitializerError .....
[Email]
Marky.Vasconcelos
Moderador
[Avatar]

Membro desde: 11/04/2007 18:18:20
Mensagens: 6594
Localização: São Paulo/SP
Offline

dipeloco wrote:Caso um bloco static lance um exception ... ela será encpsulada em uma java.lang.ExceptionInInitializerError .....


E é dai que saem as ExceptionInInitializerError que são tão dificeis de se diagnosticar.

A não ser que o código seja seu.

This message was edited 1 time. Last update was at 26/01/2010 09:55:25


Github Facebook +Mark @MarkyHitchhiker WP: MarkyTech's

Projects:
Android Roadmap - Aprenda Android do inicio (Java é o unico pre-requisito)
Towel ( ObjectTableModel & Swing & Utils )
Tower Defense Game - Java2D [Open-Source] [How-to-play]
EVGD: Programação de jogos (links) Ponto V! - Desenvolvimento de jogos para indies, curiosos e profissionais

DefaultTableModel?! PARE! Não faça isso! Faça melhor!

Dicas: Faça perguntas inteligentes! ; MigLayout ; GridBagLayout (Joke)

Develop games is fantastic, with words you can make worlds!!!

DON'T PANIC!
MarkyHitchhiker's Blog!
[WWW] [MSN]
daniel-6-strings
Thread.start()

Membro desde: 13/10/2009 15:44:25
Mensagens: 43
Offline


o que o sulito disse está correto, só complementando...
na ordem é executado da seguinte forma:
primeiro os blocos estaticos das classes mães, avós, etc,começando pela mais acima até chegar a classe sendo usada.
depois disso os blocos não estaticos.
depois os construtores.
os blocos estaticos são executados uma unica vez quando a classe vai para a memoria, enquanto que os não estaticos são executados cada vez que você instancia a classe.
bom, se não me engano é isso.


Entendi e vou realizar alguns testes e debugar para ver a execução, mas existe blocos não estaticos ?? como seria a sintaxe ??

Valew.
daniel-6-strings
Thread.start()

Membro desde: 13/10/2009 15:44:25
Mensagens: 43
Offline

Eu fiz assim por intuição e funcionou, esta correto somente colocar as chaves no bloco nao-estatico ? ( linha 14 )




Execução:



Output:

STATIC RUN - MyBlockTest
STATIC RUN - MyBlockTestChildren
NON-STATIC RUN - MyBlockTest
CONSTRUCTOR - MyBlockTest
NON-STATIC RUN - MyBlockTestChildren
CONSTRUCTOR - MyBlockTestChildren
NON-STATIC RUN - MyBlockTest
CONSTRUCTOR - MyBlockTest
NON-STATIC RUN - MyBlockTestChildren
CONSTRUCTOR - MyBlockTestChildren


Ele pasou pelo bloco estatico da super classe e depois da subclasse uma vez na criação da primeira instancia , e depois ele passa pelo bloco nao-estatico e depois pelo construtor toda vez que instancio um objeto da classe.

Valews.

This message was edited 2 times. Last update was at 26/01/2010 15:21:28

sulito
Virtual Machine Man

Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline

O pessoal todo perdeu o foco da conversa explicar como se usa os blocos de inicialização e dar exemplo ja esta mais que resolvido , mas agora surgiu outro problema que me fez passar a noite em claro , eu li num livro o seguinte:

o bloco de inicialização estatico é executado sempre antes de todos os construtores, e se um bloco de inicialização lança uma excepção verificada, então ai todos os construtores devem lançar esta execpção,

mas vou postar exactamente como esta no livro

Um bloco de inicialização pode lançar uma exeção verificada somente se todos os construtores das classes declararem lançar a mesma execeção
o problema é que o livro tem esta frase mas não tem exemplo e dai que eu quero testar para ver se isso é veridico, e desde ontem que eu tento lançar uma execção num bloco de inicialização e sem sucesso. precisamos de um exemplo que funcione para esclarecer isso, e ou o livro esta errado ou é problema da tradução do livro, porque o original deste livro é em ingles

os dados do livro:

TITULO: A linguagem de programação java (quarta edição)
autores: Ken Arnold , James Gosling, David Holmes
editora:bookman
tradução: MARIA LUCIA BLANCK LISBOA
capa:


a pagina onde tirei a frase foi a pagina 73 no tema 2.5.2-blocos de inicialização


e principalmente para o pessoal que esta a estudar para scjp que é o meu caso devemos descobrir o que se passa

devemos conseguir um exemplo que mostra uma exeção lançada por um bloco de inicialização, ou então o pessoal que escreveu ou traduziu o livro se enganou
e mais uma dica o livro não se referia a

Membro desde: 21/05/2007 12:14:11
Mensagens: 72
Offline
Caso um bloco static lance um exception ... ela será encpsulada em uma java.lang.ExceptionInInitializerError .....
axo eu

This message was edited 3 times. Last update was at 27/01/2010 05:53:59


LPI-101
maior_abandonado
JWizard
[Avatar]

Membro desde: 03/09/2007 11:30:08
Mensagens: 2947
Localização: sp
Offline

sulito wrote:Um bloco de inicialização pode lançar uma exeção verificada somente se todos os construtores das classes declararem lançar a mesma execeção
o problema é que o livro tem esta frase mas não tem exemplo e dai que eu quero testar para ver se isso é veridico, e desde ontem que eu tento lançar uma execção num bloco de inicialização e sem sucesso. precisamos de um exemplo que funcione para esclarecer isso, e ou o livro esta errado ou é problema da tradução do livro, porque o original deste livro é em ingles


veja o exemplo dessa classe abaixo:



se você tirar o throws de qualquer um dos construtores a classe simplesmente não compila, conforme o livro que você disse fala, então não é erro de tradução, esta correto isso mesmo, se um bloco lançar exceção, o construtor precisa declara-la.

Lembrando que exceção não verificada são as filhas, netas etc, de RuntimeException, as que tiverem na arvore de herança dela, estas podem ser lançadas, mas se você lançar uma que seja verificada (não filha de RuntimeException), precisará dar o throws nos construtores, se você mudar a exceção lançada no bloco da classe que eu postei para IllegalArgumentException, ai ja vai compilar mesmo tirando a declaração da exceção no construtor..

eu também tinha duvida quanto a isso, então resolvi testar...rs

espero ter ajudado...

falando nisso, caso seu problema tenha sido resolvido, edite o seu primeiro post e coloque um [RESOLVIDO] no titulo do tópico.
sulito
Virtual Machine Man

Membro desde: 23/11/2009 07:15:59
Mensagens: 608
Offline

calminha ai irmão , assim não vale não,
deves por uma excepção verificada no construtor ( ex: Exception) , e o SQLException é verificada tens toda a razão, mas nos exemplos que eu utilizava eu tentava com o Exception e não funcionava tipo:

isto tambem devia funcionar mas não funciona, com o sqlexception que usaste funciona lindamente com com o exception nao funciona, por isso a duvida ainda continua, porque eu tenho tentando com o exception e nada desde ontem

LPI-101
daniel-6-strings
Thread.start()

Membro desde: 13/10/2009 15:44:25
Mensagens: 43
Offline

Agora embassou. .!! rs, mas estamos aqui para aprender.

Eu fiz os testes no Eclipse ( utilizo a jdk1.6.0_12 ):

No bloco estatico não consegui lançar uma Exception, a não ser que eu colocasse num bloco try:



No bloco não estático, só consegui lancar a excecao se colocar um condicional ( linha 07 ) e colocar a clausula throws nos construtores:



E ai no main tenho que colocar o try:



output:
java.lang.Exception
STATIC RUN - MyBlockTest

at estudo.objects.MyBlockTest.<clinit>(MyBlockTest.java:2
at estudo.main.Main.main(Main.java:44)
NON-STATIC RUN - MyBlockTest
java.lang.Exception
at estudo.objects.MyBlockTest.<init>(MyBlockTest.java:43)
at estudo.main.Main.main(Main.java:44)

colocando a clausula throws no metodo main:


output:
STATIC RUN - MyBlockTest
NON-STATIC RUN - MyBlockTest
java.lang.Exception
at estudo.objects.MyBlockTest.<clinit>(MyBlockTest.java:2
at estudo.main.Main.main(Main.java:44)
Exception in thread "main" java.lang.Exception
at estudo.objects.MyBlockTest.<init>(MyBlockTest.java:43)
at estudo.main.Main.main(Main.java:44)

Interessante.

Valews.

This message was edited 1 time. Last update was at 27/01/2010 15:23:47

Bruno Laturner
GUJ Expert
[Avatar]
Membro desde: 18/02/2008 16:17:53
Mensagens: 3300
Offline

sulito wrote:calminha ai irmão , assim não vale não,
deves por uma excepção verificada no construtor ( ex: Exception) , e o SQLException é verificada tens toda a razão, mas nos exemplos que eu utilizava eu tentava com o Exception e não funcionava tipo:

isto tambem devia funcionar mas não funciona, com o sqlexception que usaste funciona lindamente com com o exception nao funciona, por isso a duvida ainda continua, porque eu tenho tentando com o exception e nada desde ontem


Compilei e rodei usando o jdk 1.5.0_22, compilou e rodou tranquilamente. Veja se o teu erro não está em quem está instanciando essa classe.

A resposta acima foi achada em menos de 5 minutos no google.
The prisoner falls in love with his chains. --E.W. Dijkstra
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team