Erro com polimorfismo

7 respostas
Slipguedes
Estou tentanto fazer um código usando polimorfismo e ñ estou conseguindo sobrescrever um método da classe abstrata. Ao ínves de me retornar um string o programa me retorna a classe q eu estou executando e um endereço de mémoria. Alguem poderia me dizer como resolvo isso? Segue o código.
public abstract class Uneb {
      
    private String nome;
    private int semestre;
    
    public Uneb(String nom, int periodo){
        setnome(nom);
        setperiodo(periodo);
    }
    public void setnome(String nom){
        nome = nom;
    }
    public void setperiodo(int periodo){
        semestre = periodo;
    }
    
    public String getnom(){
        return nome;
    }
    public int getperiodo(){
        return semestre;
    }
    
    public String ToString(){
        return String.format("%s \n %s : %s%s\n", getnom(), "Semestre", getperiodo(),"º"); 
    }
    public abstract void materias();
}
public class Analise extends Uneb {
    
    public Analise(String nome, int semestre){
        super(nome, semestre);
    }
    public void materias(){
        JOptionPane.showMessageDialog(null, "Calculo Númerico\nTópicos em Ciência da Computação\n " +
                "Gestão de Cpd");            
    }
    public String ToString(){
        return String.format("%s\n%s", super.toString(), " Campus II - Alagoinhas-Ba"); 
    }

}
public class Matematica extends Uneb{
    
    public Matematica(String nome, int semestre){
        super(nome, semestre);
    }
    public void materias(){
        JOptionPane.showMessageDialog(null, "Estágio");
    }
    public String ToString(){
        return String.format("%s\n%s", super.toString(), " Campus II - Alagoinhas"); 
    }
}
public class Teste {
    
    public static void main(String args[]){
        Analise analise = new Analise("Johnny", 7);
        Matematica matematica = new Matematica("Jacqueline", 9);
        
        Uneb uneb[] = new Uneb[2];
        
        uneb[0] = analise;
        uneb[1] = matematica;
        
        for(Uneb currentuneb : uneb){
            JOptionPane.showMessageDialog(null, currentuneb);
            System.out.println(currentuneb);
            currentuneb.materias();            
        }
        
    }

}

7 Respostas

peczenyj

primeira sugestão: chame os seus métodos de toString , com t minúsculo :wink:

W

sim e qual e o metodo?!? tu so fez postar o codigo , ao que me lembre
isso aqui:

System.out.println(currentuneb);

vai exibir o end da do obj da classe mesmo  que logo acima voce atribuiu a cada posicao do vetor

a variavel que aponta para o objeto da classe analise e Matematica

e isso aqui:

currentuneb.materias();

deve exibir os dialog na tela

primeiro o de  analise e depois o de matematica
Analise analise = new Analise("Johnny", 7);  
Matematica matematica = new Matematica("Jacqueline", 9);  
          
Uneb uneb[] = new Uneb[2];  
         
uneb[0] = analise;  
uneb[1] = matematica;
Slipguedes

Poxa kra era isso mesmo. Hehehehehehe. Agora eu ñ consegui entender direito como o java sabe q método chamar e se existisse mas de um método sobrescrito ele chamaria o qual?
Obrigadão

peczenyj

Alias isso poderia ser

Uneb analise = new Analise("Johnny", 7); Uneb matematica = new Matematica("Jacqueline", 9);
:wink:

peczenyj

Poxa kra era isso mesmo. Hehehehehehe. Agora eu ñ consegui entender direito como o java sabe q método chamar e se existisse mas de um método sobrescrito ele chamaria o qual?
Obrigadão

O java estava chamando o toString() da classe Object. Como todos as classes descendem de Object, todos tem esse método.

Agora se alguma classe sobreescreve esse método, o compilador é esperto para descobrir que uma instância é da classe Matemática e chama o método de instância certo.

W

Poxa kra era isso mesmo. Hehehehehehe. Agora eu ñ consegui entender direito como o java sabe q método chamar e se existisse mas de um método sobrescrito ele chamaria o qual?
Obrigadão

voce nao tem como sobreescrever o mesmo metodo mais de uma vez na mesma classe… vai da erro de compilacao se fizer isso…
talvez tua duvida tenha sido com ele sabe se o metodo e o de analise ou de matematica…
isso ele descobre em tempo de execução…
ele vai pegar tua variavel de referencia ver pra que objeto ela aponto… vai nesse objeto e executa o metodo sobre escrito, ele nem chega a ir no teu metodo escrito pela primeira vez na classe abstrata

Slipguedes

Poxa kra era isso mesmo. Hehehehehehe. Agora eu ñ consegui entender direito como o java sabe q método chamar e se existisse mas de um método sobrescrito ele chamaria o qual?
Obrigadão

O java estava chamando o toString() da classe Object. Como todos as classes descendem de Object, todos tem esse método.

Agora se alguma classe sobreescreve esse método, o compilador é esperto para descobrir que uma instância é da classe Matemática e chama o método de instância certo.

Isso só funcionará então com metodos da classe Object. Se eu sobrescrever métodos q ñ existe na classe Object ñ daria certo. É isso?

Criado 30 de maio de 2008
Ultima resposta 30 de mai. de 2008
Respostas 7
Participantes 3