Estou confuso sobre como substituir difere de ocultar em Java. Alguém pode fornecer mais detalhes sobre como eles diferem? Eu li o tutorial Java, mas o código de amostra ainda me deixou confuso.
Para ser mais claro, entendo bem a substituição. Meu problema é que não vejo como ocultar é diferente, exceto pelo fato de que um está no nível da instância enquanto o outro está no nível da classe.
Olhando para o código do tutorial Java:
public class Animal {
public static void testClassMethod() {
System.out.println("Class" + " method in Animal.");
}
public void testInstanceMethod() {
System.out.println("Instance " + " method in Animal.");
}
}
Então temos uma subclasse Cat
:
public class Cat extends Animal {
public static void testClassMethod() {
System.out.println("The class method" + " in Cat.");
}
public void testInstanceMethod() {
System.out.println("The instance method" + " in Cat.");
}
public static void main(String[] args) {
Cat myCat = new Cat();
Animal myAnimal = myCat;
Animal.testClassMethod();
myAnimal.testInstanceMethod();
}
}
Então eles dizem:
A saída deste programa é a seguinte:
Método de aula em Animal.
O método de instância em Cat.
Para mim, o fato de chamar um método de classe testClassMethod()
diretamente da Animal
classe executa o método em Animal
classe é bastante óbvio, nada de especial nisso . Em seguida, eles chamam testInstanceMethod()
de uma referência para myCat
, então, novamente, bastante óbvio que o método executado então é aquele na instância deCat
.
Pelo que vejo, a ocultação de chamadas se comporta como uma substituição, então por que fazer essa distinção? Se eu executar este código usando as classes acima:
Cat.testClassMethod();
Vou pegar:
O método de classe em Cat.
Mas se eu remover testClassMethod()
de Cat, então terei:
O método de classe em Animal.
O que me mostra que escrever um método estático, com a mesma assinatura do pai, em uma subclasse praticamente faz uma substituição.
Espero estar deixando claro onde estou confuso e alguém pode lançar alguma luz. Muito obrigado antecipadamente!