A ordem de carregamento de arquivos de classe
1. Primeiro carregue as variáveis estáticas e os blocos de inicialização estática da classe pai (a ordem de execução é organizada em ordem)
2. Recarregue as variáveis estáticas e os blocos de inicialização estática que executam esta classe
Enquanto a classe não for destruída, as variáveis estáticas e o bloco de inicialização estática serão executados apenas uma vez, e essas duas etapas não serão executadas mais adiante na operação subsequente da classe.
Processo de criação de instância de classe
Uma instância da classe é criada apenas quando o novo método é chamado.
1. Na ordem de carregamento do arquivo de classe acima (pule esta etapa se a classe tiver sido carregada)
2. Variáveis não estáticas e blocos de inicialização não estática da classe pai
3. O método de construção da classe pai
4. Variáveis não estáticas e blocos de inicialização não estática desta classe
5. O método de construção desta classe
4. Ao destruir uma instância de classe, primeiro destrua a parte da subclasse e depois destrua a parte da classe pai.
Os métodos estáticos e os métodos não estáticos são chamados passivamente
Ou seja, o sistema não ligará e executará automaticamente. Portanto, o usuário não o executa quando não é chamado. A principal diferença é que os métodos estáticos podem ser chamados diretamente com o nome da classe (e os objetos de instanciação também podem ser feitos), enquanto métodos não estáticos só podem ser chamados após instanciar o objeto.
Conceitos relacionados
Palavra -chave estática:
é um modificador usado para modificar os membros (variáveis de membros e funções membros)
Os membros modificados têm as seguintes características:
Carregar como a classe é carregada (assim que a classe for carregada, os dados estáticos carregarão imediatamente o espaço na memória)
Desaparece quando a classe desaparece, indicando que tem o ciclo de vida mais longo
Preferencialmente sobre a existência do objeto (o objeto desaparece, estática ainda está lá)
Existência estática primeiro, o objeto existe mais tarde
Compartilhado por todos os objetos
Salve o espaço de memória
Quando um membro é modificado estaticamente, além de ser chamado pelo objeto, ele também pode ser chamado diretamente pelo nome da classe.
Escrita: Nome da classe. Membro estático
Notas sobre uso
Métodos estáticos podem acessar apenas membros estáticos (métodos e variáveis)
Métodos não estáticos podem acessar estáticos e não estáticos
Isso e as palavras -chave não podem ser escritas em métodos estáticos
Porque precedência estática sobre o objeto, isso não pode aparecer em métodos estáticos
A função principal é estática
publicstaticVoidMain (String [] args) {}
Quando usar estático?
Precisamos começar de dois aspectos: porque o conteúdo da modificação estática inclui variáveis e funções de membros.
Quando definir uma variável estática (variável de classe)
Quando dados compartilhados aparecem no objeto, os dados são modificados estaticamente. Os dados exclusivos no objeto devem ser definidos como existentes não estaticamente existentes na memória da heap.
Quando definir uma função estática
Quando dados não estáticos (dados específicos do objeto) não são acessados internamente, a função pode ser definida como estática.
Prós e contras estáticos
lucro:
1. Armazene dados compartilhados em espaços separados para objetos, salvando espaço. Não há necessidade de armazenar uma cópia de cada objeto.
2. Pode ser chamado diretamente por nomes de classe
Desvantagens:
1. Ciclo de vida é muito longo
2. As limitações de acesso ocorrem (apenas acesso estático)
Estrutura de memória
Quando os programas Java estão em execução, eles precisam alocar espaço na memória. Para melhorar a eficiência da computação, diferentes áreas do espaço foram divididas, porque cada área possui um método específico de processamento de dados e método de gerenciamento de memória.
Memória da pilha
Usado para armazenar variáveis locais Quando os dados forem usados, o espaço ocupado será liberado automaticamente.
Memória da pilha
Matrizes e objetos (entidades), instâncias criadas através de novas são armazenadas na memória da heap (as variáveis de membro são estabelecidas com o estabelecimento do objeto e existem na memória da heap onde o objeto está localizado). Cada entidade possui um valor de endereço de memória (as variáveis são referenciadas pelo endereço). As variáveis na entidade têm valores de inicialização padrão. A entidade não é mais usada e será reciclada pelo coletor de lixo dentro de um tempo incerto (mecanismo de coleta de lixo)
Área de método, área de método local, registro
verificar
| Ordem de carregamento | Variável estática da classe pai = 1 | Variável não estática da classe pai = 1 | Variável estática da subclasse = 1 | Variável não estática da subclasse = 1 |
|---|---|---|---|---|
| [A classe pai chama o método estático da classe pai] | Parent.pstaticmethod (); | |||
| Bloco de inicialização estática da classe pai um | 2 | |||
| Bloco de inicialização estática da classe pai dois | 3 | |||
| Método estático da classe pai | 4 | |||
| [Subclasse chama Métodos estáticos da subclasse] | Child.cstaticmethod (); | |||
| Bloco de inicialização estática da subclasse um | 5 | 2 | ||
| Bloco de inicialização estática da subclasse dois | 6 | 3 | ||
| Métodos estáticos da subclasse | 7 | 4 | ||
| 【Subclasse Instanciação】 | Criança c = novo filho (); | |||
| A classe pai é um bloco de inicialização não estático um | 8 | 2 | ||
| O bloco de inicialização não estático da classe pai dois | 9 | 3 | ||
| Construtor da classe pai | 10 | 4 | ||
| Subclasse não estática Bloco de inicialização um | 11 | 5 | 5 | 2 |
| Subclasse não estática Bloco de inicialização dois | 12 | 6 | 6 | 3 |
| Método de construção da subclasse | 13 | 7 | 7 | 4 |
| 【A classe dos pais instancia o objeto de subclasse】 | Pai p = novo filho (); | |||
| A classe pai é um bloco de inicialização não estático um | 14 | 2 | ||
| O bloco de inicialização não estático da classe pai dois | 15 | 3 | ||
| Construtor da classe pai | 16 | 4 | ||
| Subclasse não estática Bloco de inicialização um | 17 | 5 | 8 | 2 |
| Subclasse não estática Bloco de inicialização dois | 18 | 6 | 9 | 3 |
| Método de construção da subclasse | 19 | 7 | 10 | 4 |
| Ordem de carregamento | Variável estática da classe pai = 1 | Variável não estática da classe pai = 1 | Variável estática da subclasse = 1 | Variável não estática da subclasse = 1 |
|---|---|---|---|---|
| 【Subclasse Instanciação】 | Criança c = novo filho (); | |||
| Bloco de inicialização estática da classe pai um | 2 | |||
| Bloco de inicialização estática da classe pai dois | 3 | |||
| Bloco de inicialização estática da subclasse um | 4 | 2 | ||
| Bloco de inicialização estática da subclasse dois | 5 | 3 | ||
| A classe pai é um bloco de inicialização não estático um | 6 | 2 | ||
| O bloco de inicialização não estático da classe pai dois | 7 | 3 | ||
| Construtor da classe pai | 8 | 4 | ||
| Subclasse não estática Bloco de inicialização um | 9 | 5 | 4 | 2 |
| Subclasse não estática Bloco de inicialização dois | 10 | 6 | 5 | 3 |
| Método de construção da subclasse | 11 | 7 | 6 | 4 |
| 【A classe dos pais instancia o objeto de subclasse】 | Pai p = novo filho (); | |||
| A classe pai é um bloco de inicialização não estático um | 12 | 2 | ||
| O bloco de inicialização não estático da classe pai dois | 13 | 3 | ||
| Construtor da classe pai | 14 | 4 | ||
| Subclasse não estática Bloco de inicialização um | 15 | 5 | 7 | 2 |
| Subclasse não estática Bloco de inicialização dois | 16 | 6 | 8 | 3 |
| Método de construção da subclasse | 17 | 7 | 9 | 4 |
| [A classe pai chama o método estático da classe pai] | Parent.pstaticmethod (); | |||
| Método estático da classe pai | 18 | |||
| [Subclasse chama Métodos estáticos da subclasse] | Child.cstaticmethod (); | |||
| Métodos estáticos da subclasse | 19 | 10 |
classe pública classtest {public static void main (string args []) {System.out.println ("【Instanciação da subclasse】 | filho c = new Child ();"); Criança c = novo filho (); System.out.println ("【Classe premium instancia o objeto de subclasse】 | pai p = new Child ();"); Pai p = novo filho (); System.out.println ("[Classe premium chama o método estático da classe pai] | parent.pstaticmethod ();"); Parent.pstaticmethod (); System.out.println ("[Subclasse chama o método estático da subclasse] | Child.cstaticMethod ();"); Child.cstaticmethod (); }} classe pública classtest2 {public static void main (string args []) {System.out.println ("[classe presidida CHAMANCIA DA CLASSE PAI Método estático] | Parent.PstaticMethod ();"); Parent.pstaticmethod (); System.out.println ("[Subclasse Calling Subclass Static Method] | Child.CstaticMethod ();"); Child.cstaticmethod (); System.out.println ("[Instanciação da subclasse] | Child c = new Child ();"); Criança c = novo filho (); System.out.println ("【Classe de pais instancia o objeto da classe infantil】 | Pai p = new Child ();"); Pai p = novo filho (); }} classe pública pai {// classe pai estática variável estática int m = 1; // Variável não estática da classe pai int n = 1; // Bloco de declaração estática 1 estática {m ++; // j ++; Variável não estática da classe pai não pode ser usada no sistema de bloco de declaração estática.out.println ("Classe preparente Bloco de inicialização estática 1 |" + m); } // Bloco de declaração estática 2 estático {m ++; System.out.println ("Classe Preparante Bloco de Inicialização estática 2 |" + M); } // construtor public parent () {m ++; n ++; System.out.println ("Construtor de classe preparente |" + m + "|" + n); } // Bloco de declaração não estático {m ++; n ++; System.out.println ("Classe Presidente Bloco de inicialização não estática 1 |" + m + "|" + n); } // Bloco de declaração não estático {m ++; n ++; System.out.println ("Classe Presidente Bloco de inicialização não estática 2 |" + m + "|" + n); } // método não estático public void pmethod () {m ++; n ++; System.out.println ("Método não estático da classe presidida |" + m + "|" + n); retornar; } // método estático public static void pstaticmethod () {m ++; // j ++; A variável não estática da classe pai não pode ser usada no sistema de métodos estáticos.out.println ("Método estático presidido |" + m); retornar; } @Override Protected void finalize () lança arremesso {super.finalize (); System.out.println ("Destroe a classe pai |"); }} public class Child estende o pai {// estática estática estática int i = 1; // variável não estatística int j = 1; // Bloco de declaração estática 1 estática {m ++; i ++; // j ++; Variáveis não estatais não podem ser usadas no sistema de bloco de declaração estática.out.println ("Subclasse estática Bloco de inicialização 1" + "|" + m + "||" + i); } // Bloco de declaração estática 2 estático {m ++; i ++; System.out.println ("Bloco de inicialização estática da subclasse 2" + "|" + m + "||" + i); } // construtor public filho () {m ++; n ++; i ++; j ++; System.out.println ("Subclass Constructor" + "|" + m + "|" + n + "|" + i + "|" + j); } // Bloco de declaração não estático {m ++; n ++; i ++; j ++; System.out.println ("Subclasse não estática Bloco de inicialização um" + "|" + m + "|" + n + "|" + i + "|" + j); } // Bloco de declaração não estático {m ++; n ++; i ++; j ++; System.out.println ("Subclasse não estática Bloco de inicialização dois" + "|" + m + "|" + n + "|" + i + "|" + j); } // método não estático public void pmethod () {m ++; n ++; i ++; j ++; System.out.println ("Subclasse herda métodos não estáticos" + "|" + m + "|" + n + "|" + i + "|" + j); retornar; } // Método estático public estático void pstaticmethod () {// O método estático não pode ser herdado m ++; i ++; // j ++; Variáveis não estatais não podem ser usadas em métodos estáticos; } // método não estático public void cmethod () {m ++; n ++; i ++; j ++; System.out.println ("Método não estático da subclasse" + "|" + m + "|" + n + "|" + i + "|" + j); retornar; } // método estático public static void cstaticmethod () {m ++; i ++; // j ++; Variáveis não estáticas não podem ser usadas no sistema de métodos estáticos.out.println ("Método estático da subclasse" + "|" + m + "||" + i); retornar; } @Override Protected void finalize () lança arremesso {super.finalize (); System.out.println ("Destroy Subclass |"); }}Resumir
O exposto acima é todo o conteúdo deste artigo sobre a análise abrangente do processo de carregamento de classe em Java. Espero que seja útil para todos. Se você tiver alguma dúvida, poderá deixar uma mensagem a qualquer momento e o editor responderá a todos a tempo. Ansioso por seus comentários valiosos.