Java estática de ligação e ligação dinâmica
Recentemente, aprendi o conhecimento de Java e aprendi a ligação estática e dinâmica de Java. Então resumi e resolvi o conhecimento correspondente sobre o Baidu para ajudar a dominar essa parte do conhecimento.
O conceito de ligação ao programa:
A ligação refere -se à associação de uma chamada de método com a classe (o corpo do método) onde o método está localizado. Para Java, a ligação é dividida na ligação estática e na ligação dinâmica; ou é chamado de ligação precoce e ligação tardia.
Ligação estática:
O método está vinculado antes da execução do programa (ou seja, você já sabe qual classe o método está no processo de compilação) e é implementado pelo compilador ou por outros programas de conexão. Por exemplo: C.
Pode ser entendido simplesmente como vinculativo durante o período de compilação do programa para Java; Aqui está particularmente claro que os únicos métodos em Java são finais, estáticos, privados e construtores que são pré-vinculados
Ligação dinâmica:
Ligação posterior: liga -se de acordo com o tipo de objeto específico em tempo de execução.
Se um idioma implementar a ligação tardia, também deverá fornecer alguns mecanismos para determinar o tipo de objeto durante a operação e chamar métodos apropriados separadamente. Em outras palavras, o compilador ainda não conhece o tipo de objeto no momento, mas o mecanismo de chamada de método pode investigá -lo por si só e encontrar o corpo do método correto. Diferentes idiomas têm diferentes maneiras de implementar a ligação tardia. Mas podemos pelo menos pensar desta maneira: todos eles precisam instalar certos tipos especiais de informações no objeto.
Processo de ligação dinâmica:
Final, estático, privado e construtores são o entendimento da ligação precoce
Para o método privado, antes de tudo, não pode ser herdado. Como não pode ser herdado, não há como chamá -lo através do objeto de sua subclasse, mas só pode ser chamado através do objeto dessa classe em si. Portanto, pode -se dizer que o método privado está vinculado à classe que define esse método.
Embora o método final possa ser herdado, ele não pode ser substituído (substituído). Embora o objeto da classe infantil possa ser chamado, o método final definido na classe pai é chamado (a partir disso, podemos saber que o método é declarado como tipo final, um é impedir que o método seja substituído e o outro é efetivamente uma ligação dinâmica próxima em Java).
Os construtores não podem ser herdados (também há dizendo que as subclasses herdam incondicionalmente o construtor sem parâmetros da classe pai como seu construtor, mas eu pessoalmente acho que essa afirmação é inadequada, porque sabemos que as subclasses que não precisam de uma classe pai, que não precisamos, por meio de um método sem parâmetros, por meio de um método, para concluir a inicialização da classe parental. Não é possível usar a classe parâmetros, por meio de uma classe, que não é possível usar isso, por meio de uma classe, que não é possível usar a classe parental. herdar o construtor da classe pai). Portanto, você também pode saber a qual classe esse construtor pertence ao compilar.
Não posso explicar bem os princípios específicos do método estático. No entanto, com base nas informações on -line e no meu próprio experimento, podemos concluir que o método estático pode ser herdado por subclasses, mas não pode ser reescrito (substituído) por subclasses, mas pode ser oculto por subclasses. (This means that if there is a static method in the parent class and if there is no corresponding method in its subclass, then the method in the parent class will be used when the child class object calls this method. And if the same method is defined in the child class, the method defined in the child class will be called. The only difference is that when the child class object is transformed into a parent class object, regardless of whether the static method is defined in the child class, the object will use the static method in the Classe pai, independentemente de a classe criança ter esse método estático.
Pelo exposto, podemos concluir que, se um método não puder ser herdado ou não pode ser substituído após a herança, esse método adota a ligação estática.
Compilação e operação de Java
O processo de compilação Java é o processo de compilação do arquivo de origem Java no BYTecode (código executável JVM, ou seja, arquivo .class). Nesse processo, o Java não lida com a memória. Nesse processo, o compilador executará a análise de sintaxe. Se a sintaxe estiver incorreta, um erro será relatado.
Processo de execução do Java refere -se à JVM (Java Virtual Machine) carregando arquivos bytecode e interpretando a execução. Nesse processo, é a criação real do layout da memória e a execução dos programas Java.
Existem duas maneiras de executar o Java ByteCode: (1) Método de compilação instantânea: o intérprete primeiro compila os bytes no código da máquina e depois executa o código da máquina; (2) Método de execução de explicação: O intérprete conclui todas as operações do programa Java Bytecode, interpretando e executando um pequeno pedaço de código a cada vez. (Aqui podemos ver que o programa Java realmente passa por duas conversões durante o processo de execução, primeiro convertido em bytecode e depois convertido em código da máquina. Essa também é a razão pela qual o Java pode ser compilado e executar em qualquer lugar de uma só vez.
Como mencionado anteriormente, para os métodos em Java, exceto os finais, estáticos, privados e construtores que são as ligações iniciais, todos os outros métodos são ligações dinâmicas.
A ligação dinâmica típica ocorre sob a declaração de conversão da classe pai e da classe infantil:
Por exemplo: pai P = New Children ();
Os detalhes específicos do processo são os seguintes:
1: O compilador verifica o tipo de declaração e o nome do método do objeto.
Suponha que chamamos o método XF (ARGS) e X foi declarado como um objeto da Classe C, então o compilador listará todos os métodos nomeados F nos métodos Classe C e F herdados da superclasse da classe C.
2: Em seguida, o compilador verifica o tipo de parâmetro fornecido na chamada do método.
Se um tipo de parâmetro entre todos os métodos com o nome f corresponder ao tipo de parâmetro fornecido pela chamada mais, esse método será chamado. Esse processo é chamado de "resolução de sobrecarga".
3: Quando o programa é executado e usa a ligação dinâmica aos métodos de chamada, a máquina virtual deve chamar uma versão de método que corresponda ao tipo real do objeto apontado por x.
Suponha que o tipo real seja d (uma subclasse de C), se a classe D definir f (string), o método será chamado, caso contrário, o método f (string) será pesquisado na superclasse de D e assim por diante.
Quando uma máquina virtual Java chama um método de classe (método estático), ele seleciona o método chamado com base no tipo de referência de objeto (geralmente conhecida no tempo de compilação). Pelo contrário, quando uma máquina virtual chama um método de instância, ele selecionará o método chamado com base no tipo real do objeto (conhecido apenas no tempo de execução). Isso é uma ligação dinâmica, que é um tipo de polimorfismo. A ligação dinâmica fornece grande flexibilidade para resolver problemas de negócios reais e é um mecanismo muito bonito.
Diferentemente dos métodos, ao lidar com variáveis de membros (variáveis de instância e variáveis de classe) nas classes Java, não é a ligação do tempo de execução, mas a ligação estática no sentido geral. Portanto, no caso de transformação ascendente, o método do objeto pode encontrar a subclasse, enquanto o atributo do objeto (variável de membro) ainda é o atributo da classe pai (o esconderijo da subclasse da variável de membro da classe pai).
public class Padre {Nome da string protegida = "atributo do pai"; } public classe filho estende o pai {name da string protegida = "atributo filho"; public static void main (string [] args) {pai amostra = novo filho (); System.out.println ("Chamado Propriedade:" + Sample.name); }} Conclusão: O chamador é o atributo do pai.
Este resultado mostra que o objeto da classe criança (o identificador de referência da classe pai) é chamado para a variável de membro da classe pai. Portanto, deve ficar claro que a categoria direcionada pela ligação de tempo de execução (dinâmica) é apenas o método de um objeto.
Agora, tentando chamar o nome da variável do membro da subclasse, como fazê -lo? A maneira mais fácil é encapsular a variável do membro em um formulário de getter de método.
O código é o seguinte:
public class Padre {Nome da string protegida = "atributo do pai"; public String getName () {Return Name; }} classe pública filho estende o pai {name protegido da string = "atributo filho"; public String getName () {Return Name; } public static void main (string [] args) {padre amostra = new Son (); System.out.println ("Chamado Propriedade:" + Sample.getName ()); }} Resultado: o atributo do filho é chamado
Por que o Java adota métodos de ligação estática para atributos? Isso ocorre porque a ligação estática tem muitos benefícios, o que nos permite descobrir erros no programa durante o período de compilação, e não durante o período de tempo de execução. Isso melhorará a eficiência da operação do programa! A ligação dinâmica dos métodos é implementar o polimorfismo, que é uma característica importante do Java. O polimorfismo também é uma das principais tecnologias orientadas a objetos, por isso vale a pena para o Java implementar o polimorfismo à custa da eficiência.
Nota: A maioria do conteúdo acima vem da Internet, e uma pequena parte é uma opinião pessoal e de forma alguma observações autoritárias. Se houver alguma linguagem inadequada ou expressão incorreta, espero dar conselhos a você.
Obrigado pela leitura, espero que isso possa ajudá -lo. Obrigado pelo seu apoio a este site!