A diferença entre vinculação estática e dinâmica em Java
- Vinculação estática em Java
- Exemplo de vinculação estática em Java
- Vinculação dinâmica em Java
- Exemplo de vinculação dinâmica em Java
- Vinculação estática e vinculação dinâmica em Java
Este tutorial apresenta a diferença entre ligação estática e ligação dinâmica em Java e lista alguns códigos de exemplo para guiá-lo no tópico.
Vinculação é vincular uma chamada de método à implementação do método e tem dois tipos: estático e dinâmico. De acordo com o polimorfismo, um objeto pode ter muitas formas, e essas formas podem ser resolvidas em tempo de compilação ou tempo de execução.
A vinculação estática ocorre quando a chamada do método é vinculada à implementação do método em tempo de compilação. A vinculação dinâmica ocorre quando a vinculação ocorre durante o tempo de execução. Vamos aprender mais sobre esses dois tipos de vinculação e examinar alguns exemplos.
Vinculação estática em Java
Conforme discutido acima, Static Binding é a vinculação que ocorre durante o tempo de compilação. Também é conhecido como Early Binding porque ocorre durante o próprio tempo de compilação.
No caso de Static Binding, o compilador sabe exatamente qual implementação do método usar. Ele usa as informações de tipo ou classe para vinculação; a sobrecarga de método é um exemplo de vinculação estática.
Observe que todos os métodos estáticos, finais e privados usam Static Binding porque as classes filhas não podem substituir os métodos estáticos, finais e privados. O compilador sabe em tempo de compilação qual implementação de método usar. Como o compilador sabe que os métodos da classe pai não podem ser substituídos, ele sempre usa a implementação da classe pai do método.
Além disso, a vinculação estática também tem um desempenho melhor, pois envolve menos sobrecarga.
Exemplo de vinculação estática em Java
No código abaixo, a classe escolar tem um método estático ringBell()
, e essa classe é estendida por Classroom
. A Classroom
também possui um método ringBell()
.
Como o método ringBell()
é estático, o compilador apenas verifica o tipo de classe e não considera a classe de objeto atribuída. Assim, quando uma classe School
é utilizada para criar um objeto de Classroom(School s2 = new Classroom())
, considera-se a implementação da classe School
e não a classe Classroom
.
class School {
public static void ringBell() {
System.out.println("Ringing the school bell...");
}
}
class Classroom extends School {
public static void ringBell() {
System.out.println("Ringing the classroom bell...");
}
}
public class Main {
public static void main(String[] args) {
School s1 = new School(); // Type is School
s1.ringBell();
Classroom c1 = new Classroom(); // Type is Classroom
c1.ringBell();
School s2 = new Classroom(); // Type is School
s2.ringBell();
}
}
Produção:
Ringing the school bell...
Ringing the classroom bell...
Ringing the school bell...
Vinculação dinâmica em Java
A vinculação dinâmica resolve a vinculação em tempo de execução porque o compilador não sabe qual implementação usar em tempo de compilação.
Também é conhecido como Late Binding porque a vinculação é resolvida em um estágio posterior durante o tempo de execução e não durante o tempo de compilação. A vinculação dinâmica também usa o objeto para vinculação e não o tipo ou classe; a substituição de método é um exemplo de vinculação dinâmica.
Exemplo de vinculação dinâmica em Java
No código abaixo, o método ringBell()
não é estático, então a substituição ocorrerá. O compilador não sabe qual implementação do método ringBell()
deve ser usada, então a ligação é resolvida em tempo de execução.
Em tempo de execução, o objeto é considerado e não o tipo que foi usado para criá-lo. Assim, quando se utiliza uma classe School
para criar um objeto de Classroom
, considera-se a implementação da classe Classroom
e não a classe School
.
class School {
public void ringBell() {
System.out.println("Ringing the school bell...");
}
}
class Classroom extends School {
@Override
public void ringBell() {
System.out.println("Ringing the classroom bell...");
}
}
public class Main {
public static void main(String[] args) {
School s1 = new School(); // Type is School and object is of School
s1.ringBell();
Classroom c1 = new Classroom(); // Type is Classroom and object is of Classroom
c1.ringBell();
School s2 = new Classroom(); // Type is School and object is of Classroom
s2.ringBell();
}
}
Produção:
Ringing the school bell...
Ringing the classroom bell...
Ringing the classroom bell...
Vinculação estática e vinculação dinâmica em Java
A vinculação estática é a conexão da chamada do método à implementação do método em tempo de compilação. Por outro lado, Dynamic Binding é a conexão da chamada do método à implementação do método em tempo de execução.
Conhecer essas duas técnicas é importante para entender o conceito de polimorfismo. A vinculação estática é usada por métodos estáticos, finais e privados; essa ligação entra em ação no caso de métodos sobrecarregados. A Ligação Dinâmica é usada para métodos virtuais (por padrão, virtual em Java) e usada para ligar métodos substituídos.