JavaRush /Blogue Java /Random-PT /Diferenças entre ligação antecipada e tardia em Java

Diferenças entre ligação antecipada e tardia em Java

Publicado no grupo Random-PT
Para entender a diferença entre vinculação inicial (estática) e vinculação tardia (dinâmica) em Java, você deve primeiro entender o que é vinculação . Vincular significa que há uma conexão entre o link e o código. Por exemplo, uma variável que você faz referência está vinculada ao código no qual está definida. Da mesma forma, o método chamado está vinculado ao local do código onde está definido.
Diferenças entre ligação antecipada e tardia em Java - 1
Existem dois tipos de vinculação de método na linguagem Java: vinculação inicial (também chamada de estática) e vinculação tardia (respectivamente, dinâmica) . Chamar um método em Java significa que o método está vinculado a um código específico, seja em tempo de compilação ou em tempo de execução, quando o programa é executado e os objetos são criados. Como o nome sugere, a vinculação estática é de natureza mais estática do que acontece em tempo de compilação, o que significa que o código “sabe” qual método chamar após compilar o código-fonte Java em arquivos de classe. E como se refere à fase inicial do ciclo de vida do programa, também é chamado de vinculação antecipada. Por outro lado, a vinculação dinâmica ocorre em tempo de execução, após o programa ser executado pela Java Virtual Machine. Nesse caso, qual método chamar é determinado pelo objeto específico, portanto a informação não está disponível em tempo de compilação porque os objetos são criados em tempo de execução. E como isso acontece no final do ciclo de vida do programa, é chamado de ligação tardia em Java.
Portanto, a diferença fundamental entre ligação estática e dinâmica em Java é que a primeira ocorre mais cedo, em tempo de compilação, com base no tipo da variável de referência, e a última ocorre mais tarde, em tempo de execução, usando objetos concretos.
Vejamos mais algumas diferenças para entender isso melhor e também poder responder a essa pergunta muito popular feita em entrevistas sobre Java.

Ligação antecipada e tardia em Java

Existem muitas diferenças entre vinculação estática e dinâmica em Java, mas o mais importante é como a JVM as utiliza. Você já se perguntou como a JVM decide qual método chamar quando há mais de um método com o mesmo nome no escopo? Se você já usou sobrecarga ou substituição de métodos, sabe que em Java é possível ter vários métodos com o mesmo nome. No caso de Java, a JVM usa ligação estática e dinâmica para selecionar o método desejado.

Exemplo de ligação estática e dinâmica em Java

Neste programa, você verá que a ligação de métodos virtuais não ocorre em tempo de compilação usando ligação estática, pois isso chamaria um método da superclasse, como acontece com métodos estáticos que são vinculados antecipadamente. Se um método de uma subclasse for chamado, um objeto específico será usado para vincular a função em tempo de execução e, portanto, a vinculação dinâmica será usada para vincular funções virtuais.
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
Como você pode ver, uma chamada de método premium()resultou na execução de um método da subclasse, enquanto uma chamada de método category()resultou na execução de um método da superclasse. Isso ocorre porque premium()- é um método virtual, que é resolvido usando ligação tardia, enquanto category()- é um método estático, que é resolvido usando ligação estática em tempo de compilação por nome de classe.
Interessado em ler sobre Java? Junte-se ao grupo de desenvolvedores Java !

Diferenças entre ligação antecipada e tardia em Java

Agora que você sabe como Java vincula chamadas de método e como funciona a vinculação estática e dinâmica, vamos recapitular as principais diferenças entre vinculação inicial e tardia em Java:
  1. A vinculação estática ocorre em tempo de compilação, enquanto a vinculação dinâmica ocorre em tempo de execução.

  2. Como a vinculação estática ocorre no início do ciclo de vida de um programa, ela é chamada de vinculação antecipada. Da mesma forma, a ligação dinâmica também é chamada de ligação tardia porque ocorre mais tarde na execução do programa.

  3. A ligação estática é usada na linguagem Java para resolver métodos sobrecarregados, enquanto a ligação dinâmica é usada na linguagem Java para resolver métodos substituídos.

  4. Da mesma forma, os métodos privados, estáticos e terminais são resolvidos usando ligação estática porque não podem ser substituídos, enquanto todos os métodos virtuais são resolvidos usando ligação dinâmica.

  5. No caso da vinculação estática, não são utilizados objetos concretos, mas sim informações de tipo, ou seja, o tipo da variável de referência é utilizado para descobrir o método desejado. Por outro lado, a ligação dinâmica usa um objeto específico para encontrar o método desejado em Java.
Aqui está um bom exercício baseado nos conceitos de ligação estática e dinâmica em Java. Você pode responder à pergunta: "O que será gerado quando o programa a seguir for executado?"
Diferenças entre ligação antecipada e tardia em Java - 2
Qual será o resultado deste programa? Collection, Setou HashSet? Isso é tudo que queríamos dizer sobre as diferenças entre vinculação inicial (estática) e vinculação tardia (dinâmica) em Java. Esta é uma das melhores perguntas da entrevista por telefone Java porque oferece algumas oportunidades para testar a profundidade de conhecimento do candidato. Lembre-se sempre de que os métodos privados , estáticos e finais são vinculados por meio de vinculação estática , enquanto os métodos virtuais são vinculados por meio de vinculação dinâmica . Da mesma forma, o melhor exemplo de ligação estática é a sobrecarga de método, enquanto a substituição é dinâmica. Fonte
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION