perguntas exames SCJP - blocos de Inicializacao
Blocos de inicializacao rodam quando a
classe e carregada pela primeira vez(um bloco de inicializacao
estático) ou quando a instancia e criada(um bloco de inicializacao de
instancia), como podemos ver no exemplo:
package outro.pacote.teste.blocos.inicializacao;
public class SmallInit
{
static int x ;
int y ;
static{x = 7 ;} //bloco de inicializacao estatico
{y = 8;} //bloco de inicializacao de instancia
}
Como podemos ver, a sintaxe dos blocos
de inicializacao e bem complexa. Eles não tem nomes, não usam
argumentos e não retornado nada. Um bloco de inicializacao estático
roda uma vez quando a classe e carregada pela primeira vez. Um bloco
de inicializacao de instancia roda sempre que uma nova instancia e
criada. O código de blocos de instancia roda logo depois da chamada a
super() em um construtor, ou seja, depois que todos os
superconstrutores tenham rodado.
Você pode ter muitos blocos de
inicializacao em sua classe. E importante notar que, ao contrario de
métodos construtores, a
ordem em que os blocos de inicializacao aparecem em uma classe faz
diferenca . Quando chega a hora de os blocos de
inicializacao executarem, se uma classe tiver mais de um, eles
rodarão na ordem em que aparecem no arquivo da classe.. Em outras
palavras de cima para baixo.
Podemos ver outro exemplo:
Podemos ver outro exemplo:
package
outro.pacote.teste.blocos.inicializacao;
public
class
Super
{
{
System.out.println("
Super bloco Super ");
}
Super()
{
System.out.println("Metodo
Construtor Super Super ");
}
}
////---------------------
package
outro.pacote.teste.blocos.inicializacao;
public
class
Teste extends
Super
{
static{
System.out.println(
"
TESTE static 1 ");}
{
System.out.println(
"TESTE
block teste ");
}
static
{ System.out.println(
"TESTE
static 2 ");}
Teste()
{
super();
//chamada
já
é implícita
System.out.println(
"Metodo
Construtor TESTE teste ");
}
}
///------------------
package
outro.pacote.teste.blocos.inicializacao;
public
class
Main
{
public
static
void
main(String[] args)
{
new
Teste();
}
}
Qual sera a saida???!!!:
Para saber as respostas, lembre-se das
regras:
- Os blocos de inicializacao rodam na ordem em que aparecem.
- Os blocos de inicializacao estáticos rodam uma vez, quando a classe e carregada pela primeira vez.
- Os blocos de inicializacao de instancias rodam sempre que uma instancia de classe e criada.
- Os blocos de inicializacao de instancias rodam depois da chamada que o construtor faz super().
...
...
...
...
TESTE static 1
TESTE static 2
Super bloco Super
Metodo Construtor Super Super
TESTE block teste
Metodo Construtor TESTE teste
Outro teste, qual sera a saida??
package
outro.pacote.teste.blocos.inicializacao;
public
class
Init
{
public
Init(int
x)
{
System.out.println("1-arg
const ");
}
public
Init()
{
System.out.println("no-arg
const");
}
static
{
System.out.println("
1st -static init ");
}
{
System.out.println("1st
instance init");
}
{
System.out.println("1nd
instance init");
}
static
{
System.out.println("
2nd -static init ");
}
public
static
void
main(String[] args)
{
new
Init();
new
Init(7);
}
}
Resposta:
Para saber as respostas, lembre-se das regras:
- Os blocos de inicializacao rodam na ordem em que aparecem.
- Os blocos de inicializacao estáticos rodam uma vez, quando a classe e carregada pela primeira vez.
- Os blocos de inicializacao de instancias rodam sempre que uma instancia de classe e criada.
- Os blocos de inicializacao de instancias rodam depois da chamada que o construtor faz super().
..
..
..
..
1st -static init
2nd -static init
1st instance init
1nd instance init
no-arg const
1st instance init
1nd instance init
1-arg const
Nenhum comentário:
Postar um comentário