1
resposta

[Dúvida] Sobrescrita de método Java

Olá! Estou iniciando em Java e agradeceria se me esclarecessem minha confusão. O código Java a seguir apresenta a sobrescrita de métodos em uma classe com herança, mas não consegui entender qual é o critério para o compilador escolher qual método vai utilizar. Ao rodar o código, é impresso na tela a string "lmnoplmnop"

1) No trecho de código "Va1 o=new Va2()" o que posso esperar de um objeto Va2 sendo criado, mas armazenado como objeto Va1?

2) Pelo que pude entender, o código lê o método getStr() de Va1, porém tal método esta sobrescrito em Va2. Por que, então, não é lido o método getStr() de Va1

3) Ao executar fin() e chamar ini(), dessa vez ele lê o ini() definido em Va2, sobrescrevendo o ini() de Va1, diferente de como fez com o getStr().

Ao ler esse código, não consegui compreender qual caminho eu devo esperar de um compilador do quesito sobrescrita de métodos. Aguardo ajuda dos colegas.

public class Va1 {
    public static String getStr() {
    return “abcdefghijklmnop“;
    }
    public String ini(String s, int cpr) {
    return s.substring(0, cpr);
    }
    public String fin(String s, int cpr) {
    return ini(s, cpr)+s.substring(s.length()-cpr, s.length());
    }
}
public class Va2 extends Va1 {
    public static String getStr() {
    return “0123456789ABCDEF“;
    }
    public String ini(String s, int cpr) {
    return s.substring(s.length()-cpr, s.length());
    }
    public static void main(String[] args) {
    Va1 o=new Va2();
    }
    System.out.println(o.fin(o.getStr(), 5));
}
1 resposta

Oi, dev! Tudo bem?

Desculpa a demora por um retorno.

Em relação a sua primeira pergunta, no trecho de código "Va1 o=new Va2()", quando criamos um objeto Va2 e o armazenamos em uma variável do tipo Va1, estamos usando o conceito de polimorfismo. Isso significa que podemos tratar o objeto Va2 como se fosse um objeto Va1, aproveitando assim os métodos e atributos da classe Va1. Nesse caso, apenas poderemos acessar os métodos e atributos que são herdados pela classe Va2 da classe Va1.

Em relação a pergunta número 2, no código fornecido, o método getStr() é estático nas duas classes, o que significa que ele não pode ser sobrescrito. A sobrescrita de métodos só é possível quando o método não é estático. Portanto, quando chamamos o método getStr() através do objeto "o", o compilador escolhe o método getStr() da classe Va1, já que ele não pode ser sobrescrito.

Por fim, em ralação a pergunta número 3, no caso dos métodos ini() e fin(), eles são métodos não estáticos e podem ser sobrescritos. Quando chamamos o método fin() através do objeto "o", o compilador escolhe o método fin() da classe Va2, pois o objeto o é do tipo Va2. Já o método ini() é chamado da classe Va2 porque ele foi sobrescrito nessa classe.

Espero ter ajudado na compreensão do problema. Caso tenha ficado alguma dúvida, sinta-se à vontade em comunicar, estou à disposição!

Um forte abraço e bons estudos!

Caso este post tenha te ajudado, por favor, marcar como solucionado ✓