Conhecer a instancia da SuperClasse

9 respostas
cafezin

Imagine que eu tenho uma classe com o nome dos métodos iguais, trocando apenas o parâmetro.

public metodo (String s) {
} 
public metodo (Integer s) {
}
public metodo (Double s) {
}

Até aqui tudo bem.

Agora imagine se além desses métodos eu tenha também um método que o parâmetro é um Objeto.

public metodo (Pessoa s) {
}

Até aqui tudo bem também.

Só que esse objeto é generico. Por exemplo uma classe Pessoa, onde existem subclasses dela.
Logo, quando eu for chamar o método vou passar a subclasse no parâmetro.
Por exemplo:

metodo(empregado) // objeto que tem como superclasse Pessoa.
metodo(gerente) // objeto que tem como superclasse Pessoa.
metodo(diretor) // objeto que tem como superclasse Pessoa.

Enfim a pergunta. O meu metodo “” metodo (Pessoa pessoa) {} “” tem como saber de que instância é “pessoa”.

9 Respostas

Zeed01

Boa tarde galera !

Você quer saber dentro do seu método “metodo (Pessoa s)” se o objeto passado é Empregado, Gerente ou Diretor ?

Se for isso, porque não usa o instanceOf dentro desse método.

[]s

davidbuzatto

Tem sim.

public class Pessoa {

}

public class PessoaFisica extends Pessoa {

}

public class Teste {

    public static void main( String[] args ) {

        Teste t = new Teste();
        Pessoa p = new Pessoa();
        PessoaFisica pf = new PessoaFisica();

        t.umMetodo( p );
        t.umMetodo( pf );

    }

    public void umMetodo( Pessoa p ) {

        if ( p instanceof Pessoa ) {
            System.out.println( "Objeto do tipo Pessoa." );
        } else if ( p instanceof PessoaFisica ) ) {
            System.out.println( "Objeto do tipo PessoaFisica." );
        }

        // ou se quiser dificultar :D (pode ser um caso dos códigos toscos :D )
        if ( p.getClass().equals( Pessoa.class ) ) {
            System.out.println( "Objeto do tipo Pessoa." );
        } else if ( p.getClass().equals( PessoaFisica.class ) ) {
            System.out.println( "Objeto do tipo PessoaFisica." );
        }

    }

}
[]'s
cafezin
davidbuzatto:
Tem sim.
public class Pessoa {

}

public class PessoaFisica extends Pessoa {

}

public class Teste {

    public static void main( String[] args ) {

        Teste t = new Teste();
        Pessoa p = new Pessoa();
        PessoaFisica pf = new PessoaFisica();

        t.umMetodo( p );
        t.umMetodo( pf );

    }

    public void umMetodo( Pessoa p ) {

        if ( p instanceof Pessoa ) {
            System.out.println( "Objeto do tipo Pessoa." );
        } else if ( p instanceof PessoaFisica ) ) {
            System.out.println( "Objeto do tipo PessoaFisica." );
        }

        // ou se quiser dificultar :D (pode ser um caso dos códigos toscos :D )
        if ( p.getClass().equals( Pessoa.class ) ) {
            System.out.println( "Objeto do tipo Pessoa." );
        } else if ( p.getClass().equals( PessoaFisica.class ) ) {
            System.out.println( "Objeto do tipo PessoaFisica." );
        }

    }

}
[]'s
Aqui não tem problemas porque você já definiu o tipo antes
Pessoa p = new Pessoa();  
PessoaFisica pf = new PessoaFisica();
O caso seria esse:
Pessoa p = new Pessoa();  
Pessoa pf = new PessoaFisica();
Peço desculpas talvez eu não tenha deixado claro. Mas muito obrigado.
cafezin

Zeed01:
Boa tarde galera !

Você quer saber dentro do seu método “metodo (Pessoa s)” se o objeto passado é Empregado, Gerente ou Diretor ?

Se for isso, porque não usa o instanceOf dentro desse método.

[]s

Na verdade é isso mesmo, não estava achando o instanceOf aqui.
Obrigado e Boa tarde

cafezin

Ae pessoal,
Estou tentando mais algumas coisas, agradeço a quem colaborar.

E se o parametro ainda for uma lista...
public void createObjects(List<Pessoal> pessoa) {
 // nao da pra fazer por que é uma lista, teria de fazer o cast de cada um
     if (pessoa instanceof Gerente) {
	type gerente = (Gerente) pessoa;
			
		}
}
if (pessoa instanceof List<Pessoa>) {
       // também não da pra fazer, até porque seria muito ninja.
	List<Gerente> gerente = (List<Gerente>) pessoa;
}
alucardeck
cafezin:
Ae pessoal, Estou tentando mais algumas coisas, agradeço a quem colaborar. E se o parametro ainda for uma lista...
public void createObjects(List<Pessoal> pessoa) {
 // nao da pra fazer por que é uma lista, teria de fazer o cast de cada um
     if (pessoa instanceof Gerente) {
	type gerente = (Gerente) pessoa;
			
		}
}

Nesse caso não tem jeito.. o instanceOf aponta para o objeto List, e nao para sua lista interna..
tem q por dentro do For e comparar 1 a 1...

cafezin:
if (pessoa instanceof List<Pessoa>) {
       // também não da pra fazer, até porque seria muito ninja.
	List<Gerente> gerente = (List<Gerente>) pessoa;
}

não dá por meios "convencionais"...
e tb não seria nem um pouco seguro se desse..
já que nem toda Pessoa é um Gerente..

vc vai ter q iterar a lista, e converter 1 a 1, adicionando na lista nova..

cafezin

Tá certo é isso mesmo que pensei.

Muito obrigado!!!

pmlm

Ou, mais correcto e sem andar atrás de instanceOf…

import java.util.List;
import java.util.ArrayList;

public class Teste {  
     
     public static void main( String[] args ) {  
      
            Teste t = new Teste();  
            Pessoa p0 = new Pessoa();
            Pessoa p1 = new Empregado();
            Pessoa p2 = new Gerente();
            Empregado p3 = new Empregado();
            Gerente p4 = new Gerente(); 
      
            List<Pessoa> l = new ArrayList<Pessoa>();
            l.add(p0);
            l.add(p1);  
            l.add(p2);
            l.add(p3);
            l.add(p4);
            
            t.testa(l);
      
        }  
      
        public void testa( List<Pessoa> l ) {  
      
          for (Pessoa p:l){
            p.imprime();
          }
      
        }  
      
    }  
    
    class Pessoa {  
        void imprime(){
        System.out.println("Pessoa");
        }
    }  
      
    class Empregado extends Pessoa {  
        void imprime(){
            System.out.println("Empregado");
        }
    }  
    
      class Gerente extends Pessoa {  
        void imprime(){
            System.out.println("Gerente");
        }
    }
Lucas_Abbatepaolo

Como vc esta usando herança…mesmo sua variavel de referencia seja do tipo pessoa, se dentro dela existir um objeto que foi instanciado de uma subclasse de pessoa, quando vc executar a chamada do metodo, sera executado o metodo da subclasse…somente se nao for encontrado um metodo correspondente ao chamado na subclasse, sera executado o metodo da superclasse…

Att.

Criado 1 de abril de 2011
Ultima resposta 2 de abr. de 2011
Respostas 9
Participantes 6