Conceitos relacionados à dinâmica da linguagem java; dynamic binding, dynamic linking e métodos virtuais

1. Vinculação dinâmica (vinculação)

Quando o código java é compilado com javac, não há nenhuma etapa de "conexão" como c ou c++, mas a máquina virtual realiza conexão dinâmica ao carregar o arquivo de classe. Ou seja, cada método não será salvo no arquivo de classe, e o endereço de entrada final do campo na memória não pode ser usado diretamente pela máquina virtual. (Extraído de uma compreensão profunda da máquina virtual java)
Em termos leigos, quando o java é compilado, o campo do método não alocará memória antes da conexão.

2. Mecanismo de carregamento de classes em tempo de execução

A máquina virtual java carrega os dados que descrevem a classe do arquivo de classe para a memória e verifica os dados, converte, analisa e inicializa e finalmente forma o tipo java usado diretamente pela máquina virtual. O processo é chamado de mecanismo de carregamento de classe . É diferente de C++, uma linguagem que precisa ser vinculada em tempo de compilação. Essa estratégia traz escalabilidade extremamente alta para java. Por exemplo, o usuário pode usar a predefinição do carregador de classes personalizado em java para permitir que um aplicativo local carregue um fluxo binário no tempo de execução e se torne parte do código do programa.

3. Exceções de tempo de execução e erros de tempo de compilação

int main(void){
    
    
   int i[1][0][-1]; // gcc拒绝编译  size of array is negative
   return 0

}
public void main (String[] args){
    
    
    int[][][] array = new int[1][0][-1];
}

Exceção de tempo de execução do relatório (NegativeArraySizeException)

4. Ligação dinâmica (polimorfismo)

A vinculação é realizada de acordo com o tipo do objeto específico em tempo de execução. O compilador ainda não sabe o tipo do objeto em tempo de execução neste ponto, mas o mecanismo de invocação do método pode investigar por conta própria para localizar o corpo do método correto.
1. A máquina virtual extrai a tabela de métodos do tipo real do objeto

2. Assinatura do método de pesquisa da máquina virtual

3. Método de chamada

Resumindo, polimorfismo é usar o ponteiro do tipo pai para apontar para uma instância de sua subclasse e, em seguida, chamar a função de membro da subclasse real por meio do ponteiro da classe pai. Esta técnica permite que o ponteiro da classe pai tenha "múltiplos formulários",

5. Métodos virtuais

5.1 Métodos não virtuais: método estático (estático), método privado (privado), método de classe pai do construtor de instância, método final.
Método virtual: A tabela de métodos virtuais em java armazena o endereço de entrada real de cada método, que será inicializado durante a fase de conexão do carregamento da classe.

5.2 Funções virtuais C++ As funções virtuais se originam da herança de classes em C++ e são um tipo de polimorfismo. Em C++, um ponteiro ou referência de uma classe base pode apontar ou referir-se a um objeto de uma classe derivada. Ao mesmo tempo, as classes derivadas podem substituir as funções de membro na classe base. O polimorfismo é implementado com funções virtuais, combinadas com vinculação dinâmica.

6. Resumo

  1. A vinculação dinâmica é principalmente comparada com c/c++, que aloca memória durante a compilação. Java é alocado no tempo de execução;
  2. Há ligação estática e ligação dinâmica; sobrecarga é ligação estática; polimorfismo é ligação dinâmica; o ponteiro da classe pai encontra o método correspondente da subclasse por meio da tabela de métodos virtuais
  3. Em C++, quando uma função é modificada pela palavra-chave virtual, a função é chamada de função virtual

おすすめ

転載: blog.csdn.net/qq_21561833/article/details/120295416