Bateu a dúvida: static

10 respostas
D

De repente me bateu essa dúvida:
Vamos supor q eu tenha 2 classes: A e B, seja essa a classe A:

class A () {
  public A() {}

  public static void main() {
    B b = new B();
  }

}

e a classe B

class B() {

  private Date date = new Date();

  private static Long id = new Long(5);

  static {
    system.out.println("estatico");
  }

}

Baseado nisso, qndo q os operadores new da classe B serão executados!? E o bloco estático!? Qndo o programa iniciar, ou qndo instanciar a classe?!

10 Respostas

S

O operador new da classe B será executado apenas quando for chamado pelo método main da classe A!

O bloco estatico é executado logo que esta classe é carregada pela VM! independente se vc esta instanciando um Objeto da classe B ou não naquele momento!

O Objeto “Long” será carregado também quando a VM for iniciada! independente também de ter algum objeto de B instanciado!

Se eu intendi bem sua pergunta isso acredito que responde! mas qualquer coisa da um toke ai…

D

entao, na hora q eu der um java meuPrograma

os estáticos serao inicializados, e depois os não estaticos?

S

Exatamente!!

inclusive aquele bloco estatico que vc colocou sera impresso na tela na hora que esta carregando seu programa e em mais nenhum momento ele será executado! não intereça quantos objetos vc instancia daquela classe!

Lembre-se: o que é estatico pertence a classe e não aos objetos desta classe!

D

Pode crer, a minha duvida era se o estático ira executar na hora q o programa fosse rodado, ou na primeira vez em q fosse preciso…

S
"sens":
O bloco estatico é executado logo que esta classe é carregada pela VM! independente se vc esta instanciando um Objeto da classe B ou não naquele momento!

O bloco só é executado quando for criada uma instância da classe, e será executado somente uma vez. E acredito que isso serve para os atributos também, pois não faz sentido carregar todos os atributos static de todas as classes de java.lang.

Faça o teste:
class A {
    public static void main(String[] args) {
        B x; // = new B(); --> Imprimiria "b".
        System.out.println("a");
    }
}

class B {
    static {
        System.out.println("b");
    }
}

Só mais uma coisa: esse main da classe A do darkseid não tem o String como argumento, então é só um método normal de nome main :)

D

oloko… esqueci do String… hehehe foi malz, mas a idéia era criar um main mesmo, e nao um metodo comum de nome main

S

O bloco só é executado quando for criada uma instância da classe, e será executado somente uma vez. E acredito que isso serve para os atributos também, pois não faz sentido carregar todos os atributos static de todas as classes de java.lang.

Reafirmo o que eu falei anteriormente! Um bloco estatico é executado apenas quando a classe é carregada pela VM! o que acontece neste exemplo é que a VM carrega a classe “B” apenas quando ela precisa utilizar, e por isto se não for utilizado (a classe “B”) o bloco estatico dela não aparece( pois nem é carregada pela VM).

veja o seguinte exemplo;

class A { 
    public static void main(String[] args) { 
        System.out.println("a"); 
        B.imprimir();
    } 
} 

class B { 
    static { 
        System.out.println("b"); 
    } 
    static void imprimir() {
        System.out.println("Imprimir");
    }
}

Neste caso não tem nenhuma instancia de “B” sendo criada! mas a classe tem que ser carregada! sendo assim o bloco estatico irá ser executado tb! Ele executa apenas uma vez! mas quando a classe é carregada pela VM !

[]s Victor

F

concordo com o sens, não é preciso que a classe seja estanciada para q seus membros estáticos sejam executados e/ou inicializados, basta que essa classe seja eleita pela JVM a ser carregada, apartir daí todos o membros staticos serão realizados, uma única vez!

A necessidade de estanciação para inicializar e/ou executar valem para membros de instancias!

S

Eu concordo também, mas me expressei muito mal.
Quando você disse isso:

achei que você quis dizer que seriam carregados todos os membros estáticos de todas as classes importadas, independentes de serem usados ou não.

Agora entendi o que quis dizer.

F
class A () //NAO COMPILA , Nao existe parenteses na declaracao de classes
{   
  public A() {} 

  public static void main() { 
    B b = new B(); 
  } 

}
class B() { 

  private Date date = new Date(); 

  private static Long id = new Long(5); 

  static { 
    system.out.println("estatico"); 
    //NAO COMPILA o S do System eh maiusculo...
  } 

}
rsssssssss ... oh la einh .. antes de mais nada no exame .. temos q verificar essas coisitas!!! sei q isso naum foi o objetivo deste topico!

Os blocos, atributos , metodos , innerclass ESTATICOS de uma classe sao colocados em um repositorio da JVM, chamada de Classes Pre Loaders,quando a mesma é compilada, entao esse
lugar eh responsavel por controlar tudo q eh estatico ... logo .. quando vc acessa um membro estatico de uma classe, ele ira nesse lugar da JVM, procurar o tal ...

Criado 7 de março de 2005
Ultima resposta 8 de mar. de 2005
Respostas 10
Participantes 5