situacao a seguir:Essa e uma representacao na notacao UML (Unified Modeling Language) que nos informa que existe a definicao de tres classes em nosso sistema: existe a classe abstrata Animal (note que ela esta em italico, isso significa na notacao UML que trata-se de uma classe abstrata) e existem tambem outras duas classes chamadas Cachorro e Gato, que sao filhas da classe Animal. Ou seja, todo objeto das classes Cachorro e Gato vao ter todas as caracteristicas (atributos e metodos) presentes na classe Animal, e mais algumas caracteristicas proprias.Imagine que vamos criar um sistema de cadastro de animais. Vamos, por questoes didaticas, supor que todos os animais de nosso sistema fiquem armazenados em um array. Entao existiria um array contendo objetos dos tipos Gato e do tipo Cachorro. Mas armazenar diversos tipos diferentes de objetos em um unico array nao e uma boa ideia, pois depois, para extrair essas informacoes de volta e bastante complicado. Mas pare e pense por um instante: objetos do tipo Cachorro e objetos do tipo Gato sao tambem objetos do tipo Animal, correto? Bom, entao podemos criar um array capaz de armazenar Animais! Assim nossa vida fica bem mais facil, bastando atribuir ao array os objetos (do tipo Cachorro e Gato - que estendem a classe Animal) que queremos guardar. Em forma algoritmica, seria mais ou menos:Animal[] listaDeAnimais = new Animal[100]; // Criamos um array com 100 posicoes que armazena objetos do tipo Animal.listaDeAnimais[0] = new Cachorro("Frodo"); // Criamos um novo objeto do tipo Cachorro com o nome Frodo e armazenamos no arraylistaDeAnimais[1] = new Gato("Alan"); // Criamos um novo objeto do tipo Gato com o nome Alan e armazenamos no array.......Certo! Agora temos um array com varios objetos do tipo Animal. Agora vamos fazer um looping por todos esses objetos, enviando para cada um deles a mensagem "fale". O que iria acontecer?Inicialmente, vamos supor que a classe abstrata Animal possui o metodo "fale", e que ele seja implementado (de forma algoritmica) da seguinte forma:Classe Animal { metodo fale() { imprimaNaTela(" Eu sou mudo! "); }}Desta forma, todo objeto que de alguma classe que estenda a classe Animal vai ter automaticamente o metodo "fale", e isso inclui todos os objetos das classes Cachorro e Gato. Mas todos eles, atualmente, ao receber a mensagem "fale" vao responder imprimindo na tela a mensagem "Eu sou mudo!". Mas Gatos e Cachorros podem falar! O que podemos fazer e sobreescrever o metodo fale para cada uma das classes, substituindo entao seu conteudo pelo comportamento que queremos que cada subclasse tenha.Por exemplo, poderiamos escrever na classe Gato do seguinte metodo:Classe Gato { Metodo fale() { imprimaNaTela(" Miaaaaaauuuuuu! "); }}Para a classe Cachorro, poderiamos fazer de forma semelhante:Classe Cachorro { Metodo fale() { imprimaNaTela(" Au au au! "); }}Agora, se fizermos um looping entre todos os objetos contidos em nosso array criado anteriormente enviando para cada objeto a mensagem "fale", cada um deles ira ter um comportamento diferente, dependendo se e um Cachorro ou um Gato. Nosso looping entre todos os animais cadastrado no nosso sistema seria mais ou menos assim:int cont; para