¿Por qué el tipo de retorno del método con el mismo nombre debería ser el mismo en la subclase de Java?

Mi fondo es C ++. Sé lo que está sobrecargando y cuál es la anulación. Quiero preguntar si no quiero anular el método del padre y quiero hacer mi propio método con un tipo de retorno diferente y el mismo nombre, ¿por qué Java no me permite hacer esto?

Ejemplo:

class X{
    public void k(){

    }
}
public class Y extends X{
    public int k(){
        return 0;
    }
}

¿Por qué Java no aplica el concepto de ocultación aquí? la clase media Y debería ocultar el método de X. ¿Cuál es la razón detrás?

C ++ aplicando el concepto de ocultación.

#include <iostream>
class A{
    public:
        void k(){
            std::cout << "k from A";
        }
};
class B:public A{
    public:
        int k(){
            std::cout << "k from B";
            return 0;
        }
};
int main(){
    B obj;
    obj.k();

    return 0;
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta