Em Java, substituindo e sobrecarga são as duas características mais importantes programação orientada a objetos . O recurso é usado quando o programador deseja alcançar polimorfismo . A questão, podemos substituir o método estático em Java ou você pode sobrecarregar o método estático em Java são as duas perguntas mais importantes feitas em Entrevista Java . Nesta seção, entenderemos resumidamente a sobrecarga e a substituição. Também explicamos a resposta de por que não podemos substituir o método estático em Java?
Método Estático
O método que possui uma palavra-chave estática antes do nome do método é conhecido como método estático . Também é conhecido como método em nível de classe . Uma cópia do método estático é compartilhada por todos os objetos da classe.
public static int sum() { }
Podemos invocar métodos estáticos usando o nome da classe. Por exemplo, Matemática.abs(a) método . O método retorna o valor absoluto do argumento passado. O método estático não pode acessar variáveis ou métodos de instância.
Substituição de método
É uma característica programação orientada a objetos . É usado para obter polimorfismo em tempo de execução. A subclasse fornece uma implementação específica de um método que já é fornecido pela sua classe pai, conhecida como substituição de método. A assinatura do método nas classes pai e filho deve ser a mesma. Em substituição de método , qual método será executado, decidido em tempo de execução. A decisão é tomada de acordo com o objeto que chamamos.
Sobrecarga de método
É também um recurso da programação orientada a objetos. É usado para obter polimorfismo em tempo de compilação. Isso nos permite usar o mesmo nome de método, mas assinaturas diferentes. Se uma classe tiver mais de um método com o mesmo nome, mas com assinatura de método diferente, ela é conhecida como sobrecarga de método .
Aprendemos o que está sobrecarregando e sobrecarregando. Agora vamos direto ao ponto.
Podemos sobrecarregar um método estático?
A resposta é Sim . Podemos sobrecarregar métodos estáticos. Mas lembre-se que a assinatura do método deve ser diferente. Por exemplo, considere o seguinte programa Java.
SobrecargaStaticMethodExample1.java
public class OverloadStaticMethodExample1 { //static method public static void display() { System.out.println('Static method called.'); } //overloaded static method public static void display(int x) { System.out.println('An overloaded static method called.'); } //main method public static void main(String args[]) { //calling static method by using the class name OverloadStaticMethodExample1.display(); OverloadStaticMethodExample1.display(160); } }
Saída:
Static method called. An overloaded static method called.
Aqui surge uma questão que podemos sobrecarregar os métodos se eles forem diferentes apenas pela palavra-chave estática.
A resposta é Não. Não podemos substituir dois métodos se eles diferirem apenas pela palavra-chave estática. Por exemplo, considere o seguinte programa Java.
SobrecargaStaticMethodExample2.java
public class OverloadStaticMethodExample2 { //static method public static void sum(int a, int b) { int c=a+b; System.out.println('The sum is: '+c); } //non-static method public void sum(int a, int b) { int c=a+b; System.out.println('The sum is: '+c); } //main method public static void main(String args[]) { //calling static method by using the class name OverloadStaticMethodExample2.sum(12, 90); } }
Quando compilamos o programa acima, ele mostra o seguinte erro.
error: method sum(int,int) is already defined in class OverloadStaticMethodExample2
Podemos substituir um método estático?
Não, não podemos substituir métodos estáticos porque a substituição de métodos é baseada em ligação dinâmica em tempo de execução e os métodos estáticos são ligados usando ligação estática em tempo de compilação. Portanto, não podemos substituir métodos estáticos.
A chamada do método depende do tipo de objeto que chama o método estático. Isso significa:
- Se chamarmos um método estático usando o objeto da classe pai, o método estático original será chamado a partir da classe pai.
- Se chamarmos um método estático usando o objeto da classe filha, o método estático da classe filha será chamado.
No exemplo a seguir, ParentClass possui um método estático chamado display() e ChildClass também possui a mesma assinatura de método. O método na classe derivada (ChildClass) oculta o método na classe base. vamos ver um exemplo.
SobrecargaStaticMethodExample3.java
public class OverloadStaticMethodExample3 { public static void main(String args[]) { ParentClass pc = new ChildClass(); //calling display() method by parent class object pc.display(); } } //parent class class ParentClass { //we cannot override the display() method public static void display() { System.out.printf('display() method of the parent class.'); } } //child class class ChildClass extends ParentClass { //the same method also exists in the ParentClass //it does not override, actually it is method hiding public static void display() { System.out.println('Overridden static method in Child Class in Java'); } }
Saída:
display() method of the parent class.