Tentando fazer um algoritmo que me retorna-se se duas classes eram do mesmo tipo fuçando com o eclipse eu consegui fazer, mas não entendi como foi feito.
No caso tenho uma superClasse Funcionario com algumas subClasses, e em um laço com todas essas subclasses misturadas preciso saber qual é de uma determinada subClasse.
Eis o algoritmo em questão:
for (int i = 0; i < funcionarios.length; i++)
if (funcionarios[i].getClass().equals(FuncionarioEnsinoBasico.class))
gastoEnsinoBasico += funcionarios[i].getRendaBasica();
Oq eu não entendo é esse .class no final, qualquer luz seria de grande ajuda!!
nao tem como ter um array de classes misturadas, nao eh necessario a comparacao ja que todas elas sao da mesma classe e consequentemente herdeiros do mesmo pai.
Em Java existe uma classe chamada Class, que representa justamente informações de uma classe em tempo de execução. Para cada classe carregada no seu programa existe um objeto da classe Class com essas informações. Ele pode ser acessado tanto pelo método getClass() do objeto quanto pela constante .class, acessada pelo nome da classe.
Claro que pode! Se tudo o mais falhar, você pode declarar um array de Object’s :
Object [] arr;
[/quote]
mesmo assim sera um array da classe object. o que muda sao as instancias e devera entao usar a palavra intanceof para comparar e nao == ou etquals[/quote]
Claro que pode, vai funcionar perfeitamente. Um método sobrescrito sempre executa a versão da classe da instância, logo, o método getClass() retornará a classe real do objeto, e não o tipo da referência.
Discordo de vc rmendes08!! O tipo de REFERÊNCIA determina qual método sobrecarregado será usado em tempo de compilação e não em tempo de execução como em um teste IF. Portanto vinids, use instanceof ou o equals para testar se uma determinada classe passa no teste É-UM. Porém teste as referências e não FucnionarioEnsinoBasico.class.
[quote=GLEMES]Discordo de vc rmendes08!! O tipo de REFERÊNCIA determina qual método sobrecarregado será usado em tempo de compilação e não em tempo de execução como em um teste IF. Portanto vinids, use instanceof ou o equals para testar se uma determinada classe passa no teste É-UM. Porém teste as referências e não FucnionarioEnsinoBasico.class.
Flw!![/quote]
Veja bem GLEMES, acho que você não entendeu. Para você acessar um método é preciso que ele esteja declarado no tipo de referência da variável (ou expressão) e que ele seja visível (public, protected, etc.). Uma vez que o método é acessível pela referência, a versão que de fato vai executar é a versão declarada no tipo da instância referenciada. Caso fosse diferente, se você chamasse um método por um refeência cujo tipo é uma interface você receberia um erro, pois interfaces não definem implementação, sacou ? Exemplo:
interface Mostravel{
String mostrar();
}
public void main(String args[]){
Mostravel [] arr = {
new Mostravel(){public String mostrar(){return "A"},
new Mostravel(){public String mostrar(){return "B"},
new Mostravel(){public String mostrar(){return "C"},
new Mostravel(){public String mostrar(){return "D"},
new Mostravel(){public String mostrar(){return "E"},
}
for(Mostravel m : arr)
Sytem.out.println(m.mostrar());
}
rmendes08, nós estamos falando sobre métodos sobrecarregados!! No seu exemplo não há sobrecarga de método. Em métodos sobrescritos funciona exatamente como vc disse, mas não em métodos sobrecarregados, que foi a afirmação que vc fez anteriormente.