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 : ,

0 thoughts on “Java, exercício de análise”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.