A sobrescrita do método funciona. Acontece que um método com o modificador “static” é estático e não um membro de instância da classe. Ou seja, ele independe da instância do objeto em questão, ele faz referência direta à classe e não ao objeto.
Por exemplo eu poderia acessar Transporte.exibeDados() diretamente, sem nem mesmo ter uma instância da classe transporte.
Portanto se você deseja acessar o método das subclasses, deve fazer referência a elas. Bicicleta.exibeDados() por exemplo.
Ah… é considerado uma boa prática sempre que for acessar membros estáticos de uma classe de modo direto através do nome da classe (como eu fiz acima). Acessar membros estáticos através da instância de algum objeto (como você fez tipo.exibeDados() não é uma boa prática!
o polimorfismo se aplica a instancia e nao a membro static… até pq os membros static eles nao sao herdados e sim redefinidos… nesse caso ai nao tem subscrição e sim uma redefinição.
Transporte t = new Navio();
t.exibeDados();
ele vai chamar o metodo da classe de Transporte, ou seja, do tipo de referencia(antes =) e nao do objeto( após o =).