public class Veiculo {
public void liga() {
System.out.println("Ligando Veiculo");
}
}
class Carro extends Veiculo {
public void liga() {
System.out.println("Ligando Carro");
}
}
class Moto extends Veiculo {
public void liga() {
System.out.println("Ligando Moto");
}
}
public class Teste {
public static void main(String[] args) {
Veiculo m = new Moto();
m.liga();
Veiculo c = new Carro();
c.liga();
}
}
Esse exemplo as classe filhas sobrescrevem os métodos da classe mãe, se houver mais métodos especificos serão das classes filhas.
Funcionario f = new Gerente();
Funcionario f
f é a referência de Funcionário gerente herda da classe genérica funcionário, a classe Gerente é uma classe especializada e funcionário é uma classe genérica, se caso vc quisesse acessar metódos que só existe em Gerente teria que instanciar a classe Gerente.
Vi que vc comentou:
Entretanto, pelo que eu entendi, dessa forma não conseguimos acessar métodos que sejam exclusivos da classe filha através dessa instância de "f" por exemplo
futuramente, vc verá uma coisa chamada responsabilidade única, em outras palavras, cada um no seu quadrado, isso é para diminuir o acoplamento, se houver muitas dependencias, haverá dificuldade em manutenção do código.
mas o intuito da heraça é hedar da classe pai, de baixo para cima, não tem sentindo vc acessar da classe mãe para classe filha, mesmo pq a classe mãe sempre será mais generico.
espero ter ajudado.