Java, exercício de análise
assunto: hierarquia, classes, interface, derivadas
pergunta: qual o output do seguinte:
package recursopa2; interface IPodeDeslocar { void vira(double angulo); void defineVelocidade(double v); } interface IPodeCaminhar extends IPodeDeslocar { void caminha(); } interface IPodeCorrer extends IPodeCaminhar { void corre(); } interface IPodeVoar extends IPodeDeslocar { void voa(double altitude); } class Felino implements IPodeCorrer { public void corre() { } //está mal falta mas outras três //para ser concreta e não precisar do abstract //precisa: caminha, defineVelocidade, vira } abstract class AveRapina implements IPodeVoar { public void voa(double a) { } //para ser concreta precisa do vira, defineVelocidade //mas é abstract e não precisa } class Tigre extends Felino { //se corrigir acrescentado em Felino //caminha, defineVelocidade, vira //assim em Tigre devemos implemntar todas //corre, caminha, defineVelocidade, vira //e sem restringir a visibilidade, isto é //mantendo public void corre() ... } class Avestruz implements IPodeCorrer { public void vira(double angulo) { } public void defineVelocidade(double v) { } public void caminha() { } public void corre() { } //está correcta este concretização } class Aguia extends AveRapina implements IPodeCaminhar { public void vira(double angulo) { } public void defineVelocidade(double v) { } public void caminha() { } //aguia deriva de AveRapina //tem por via do implements: //caminha, vira, defineVelocidade //tem pelo extends da sua derivada abstract //deveria ter voa, mas a AveRapina é asbtract //logo esta classe implementa tudo } class Main { public static void main(String args[]) { IPodeDeslocar d1[] = new IPodeDeslocar[10]; //não tem erro //podemos criar arrays dinâmicos para interfaces d1[0] = new AveRapina(); //erro: não se pode criar um objecto de uma classe abstracta //podem existir referências, objetos não d1[0].voa(10.5); //erro, d1 é uma referencia para IPodeDeslocar //mas o IPodeDeslocar não tem o método voa d1[1] = new Avestruz(); Avestruz av = d1[1]; //erro, uma referências para derivada não pode receber //uma referencia para o topo da hierarquia IPodeDeslocar t1 = new Tigre(); IPodeCorrer t2 = t1; //t2=t1, siginifca o mais abaixo receber o mais acima //IPodeDeslocar é o topo, IPodeCorrer está abaixo //não funciona. t1 = t2; //o de cima pode receber o debaixo //IPodeDeslocar é o topo, IPodeCorrer está abaixo Tigre t2 = new Felino(); //erro, porque Tigre deriva de Felino //uma referência para a derivada não pode receber a da base //só a referência para base é que podia receber a derivada Aguia ag = new Aguia(); AveRapina ar = ag; //aguia deriva de aveRapina //aveRapina está mais acima pode então receber //o que está mais abaixo ar.caminha(); //não faz parte das funções que desaguam.. IPodeCaminhar aguia = new Aguia(); //sim porque Ague implementa IPodeCaminhar IPodeCorrer tigre = new Tigre(); //sim IPodeCorrer está na linha acima da hierarquia tigre = aguia; //erro, porque tigre está mais abaixo na hierarquia //IPodeCaminhar está acima não pode ser dado ao mais abaixo aguia = tigre; //IPodeCorrer está acima e pode ser dado ao mais abaixo //ao contrário já dá IPodeCaminhar ag2 = (AveRapina) aguia; //não está na mesma linha IPodeCorrer t3 = (Felino) tigre; } }Tags : java, Programação avançada
0 thoughts on “Java, exercício de análise”