Como funciona o metodo static?

7 respostas
A

Olá,
Tem duvida de como funciona o metodo static neste programa abaixo. A saída impressa quando o programa é executado é: CFBAED. Não entendi o funcionamento desse programa. Alguém poderia por favor me explicar?

class SuperInicializacao{

    SuperInicializacao() {
          System.out.print ("A");
  }


  {
       
       System.out.print ("B");
  } 


  static{

      System.out.print ("C");
   
  }

}

public class Inicializacao extends SuperInicializacao {

      Inicializacao( ) {
           System.out.print ("D");
}


{
       
       System.out.print ("E");
 } 

  static{

      System.out.print ("F"); 
  }

public static void main ( String [  ] args) {
       Inicializacao in = new Inicializacao( );

}

}

7 Respostas

P

cara…
1º - use as tags “code” do forum …ajuda muito…fica mais facil de visualizar

class SuperInicializacao{
    SuperInicializacao() {
        System.out.print("A");
    }
    
    {
        System.out.print("B");
    }
    
    static{
        System.out.print("C");
    }
}

public class Inicializacao extends SuperInicializacao {
    Inicializacao( ) {
        System.out.print("D");
    }
    {
        System.out.print("E");
    }
    static{
        System.out.print("F");
    }
    
    public static void main( String [ ] args) {
        Inicializacao in = new Inicializacao( );
    }
    
}

naum é ?

agora vou tentar explicar ki raios ta acontecendo ae

Cara o que vc tem nas classe abaixo são blocos de codigo static e de instancia.
Bom, td o que static pertence a classe não a instancia… vc não precisar ter um objeto
para acessar um metodo, atributo ou bloco static…

um bloco e executado durante o carregamento da instancia e no caso
de um bloco estatico, carregado pelo classloader, assim que a jvm passa
a "conhecer" a classe…

então o fluxo desta executcao ficaria assim

Inicializacao in = new Inicializacao( );

aqui a o classloader carrega a classe Inicializacao e sua hierarquia de classe…(SuperInicializacao >> Object)
enato aqui o bloco estatico é executado…

static{
        System.out.print("C");
    }

depois o bloco estatico da classe Inicializacao (respeitando a hierarquia)

static{
        System.out.print("F");
    }

agora ele cria a instancia e executa os bloco não estaticos e os construtores das respectivas classe

superclasse
bloco

{
        System.out.print("B");
    }

construtor

SuperInicializacao() {
        System.out.print("A");
    }

subclasse
bloco

{
        System.out.print("E");
    }

construtor subclasse

Inicializacao( ) {
        System.out.print("D");
    }

é , a grosso modo, +/- isso…

akumaldo

então poderiamos dizer é:
ordem da instanciação:

metodos estáticos da ordem da classe super, depois das filhas
blocos de código da classe super, depois filhas
blocos de construto da classe super, depois filhas…
é essa a ordem? :shock:

A

É verdade.Foi mal. Da proxima vez usarei o ‘Code’ do forum.

Valeu!!
Comecei a entender o funcionamento, mas fiquei com duvida nesta parte: “Bom, td o que static pertence a classe não a instancia…”

A classe que voce se refere sao as classes inicializacao e superinicializacao?

E nesta parte:
“agora ele cria a instancia e executa os bloco não estaticos e os construtores das respectivas classe”

Que instancia é essa que voce se refere?

akumaldo

AlunoJava:

É verdade.Foi mal. Da proxima vez usarei o ‘Code’ do forum.

Valeu!!
Comecei a entender o funcionamento, mas fiquei com duvida nesta parte: “Bom, td o que static pertence a classe não a instancia…”

A classe que voce se refere sao as classes inicializacao e superinicializacao?

E nesta parte:
“agora ele cria a instancia e executa os bloco não estaticos e os construtores das respectivas classe”

Que instancia é essa que voce se refere?

Bom…o modificador static vai dizer para a classe, que aquela variável o metodo que está com esse modificador PERTENCE A CLASSE! e não a instancia! então no caso os blocos de inicialização staticos são inicializados primeiro por pertencer a classe, e sempre na ordem de classe mãe para classe filha…Como os blocos estáticos NÃO pertencem a instância, os mesmos são executados ANTES da criação da instância, ou seja, antes da chamada dos construtos!
Após os blocos estáticos de inicialização serem executados, as instâncias podem ser criadas com os respectivos construtos das classes e os blocos de inicialização que não são estáticos podem então serem executados…pois fazem parte da instancia e não da classe!
espero ter ajudado…senão…fala ae… :smiley:

A

Ajudou muito.

Deixa ver se eu entendi. A instancia que voce se refere é instancia
da classe que é feita atraves do construtor? Entao Para instanciar um classe nao é preciso ter um objeto?
Instancia quer dizer criaçao de objetos e classes, é isso mesmo ou
estou falando besteira?

Entao o fluxo a ordem de execucao do programa fica assim: static,
blocos nao estaticos e construtores.

akumaldo

AlunoJava:
Ajudou muito.

Deixa ver se eu entendi. A instancia que voce se refere é instancia
da classe que é feita atraves do construtor? Entao Para instanciar um classe nao é preciso ter um objeto?
Instancia quer dizer criaçao de objetos e classes, é isso mesmo ou
estou falando besteira?

Entao o fluxo a ordem de execucao do programa fica assim: static,
blocos nao estaticos e construtores.

Bom vamos lá…uma instancia de classe e um objeto de uma classe…são palavras diferentes para uma mesma coisa…
A ordem é: bloco statico primeiro…por que? por que como ele faz parte da classe e não da instancia ele é feito antes do construto…por que é o construto que cria a instancia entende…
Depois fica os blocos não estáticos de inicialização e o construtor por último!

:smiley:

A

Entendi!! :smiley:

Obrigado akumaldo e pm pela ajuda.

Criado 7 de julho de 2006
Ultima resposta 9 de jul. de 2006
Respostas 7
Participantes 3