Dúvida Herança

10 respostas
rmala_ti

Pessoal, o código abaixo

class Funcionario{}

class Gerente extends Funcionario{)

public class TestaFuncionario {
  public static void main(String []args){

    Funcionario funcionario = new Funcionario();
    Gerente gerente = funcionario; //Não funciona

    Gerente ger = new Gerente();
    Funcionario fun = ger; //Funciona corretamente
  }
}

Bem a dúvida é a seguinte: Qual o motivo exatamente que a primeira referência não funciona?
Todo Gerente é um Funcionário, pois Gerente estende funcionário, então pq não compila?
Bateu uma grande dúvida agora.
Valeu.

10 Respostas

dreamspeaker

Vc não pode converter um Funcionário pra Gerente. Um Gerente é um Funcionário (por isso a segunda associação funciona), mas nem todo Funcionário será um Gerente.

Nesse caso, vc precisa fazer um cast explicito.

Gerente gerente = (Gerente)funcionario;
peczenyj

Isso funciona:

class Funcionario{}
class Gerente extends Funcionario{}

public class A{
 public static void main(String [] args)
 {
        Funcionario f = new Gerente();
        Gerente g = new Gerente();
        f = (Funcionario) g;
 }

}

Agora, transformar um Funcionario (puro) em Gerente não rola. Vai gerar um ClassCastException.

Andre_Brito

Nem todo funcionário é um gerente, certo?
Portanto, um funcionário que não seja gerente (na vida real), não “cabe” no cargo.
Já, todo gerente é um funcionário. Então todo gerente “cabe” num funcionário.

rmala_ti

dreamspeaker:
Vc não pode converter um Funcionário pra Gerente. Um Gerente é um Funcionário (por isso a segunda associação funciona), mas nem todo Funcionário será um Gerente.

Nesse caso, vc precisa fazer um cast explicito.

Gerente gerente = (Gerente)funcionario;

Agora ficou mais tranquilo.
Mas o que acontece quando se faz um cast explícito transformando um funcionário em gerente? É isso mesmo que eu entendi?
Obrigado.

P

Você está por sua conta e risco…

para fazer um cast desse tipo vc tem q ter a certeza que está fazendo a coisa certo…(vc tem q ter certeza de q AQUELE funcionario É UM Gerente)

por exemplo, vc está recuperando um objeto do banco de dados e vc SABE q esse objeto é um Funcionario, então vc pode fazer o cast, senao será lancada uma exceçao

peczenyj

Um cast é descoberto em tempo de compilação pois...

class Funcionario{}
class Gerente extends Funcionario{}

public class A{
 public static void main(String [] args)
 {
        x();
        z();
        y(); // aqui vai dar problema
 }

 public static void z(){
        Gerente g = new Gerente();
        Funcionario f = (Funcionario) g;
        Gerente gg = (Gerente) f;
        System.out.println("Gerente -> Funcionario -> Gerente");
 }
 public static void y(){
        Funcionario f = new Funcionario();
        Gerente g = (Gerente) f;
        System.out.println("Funcionario f -> Gerente g");

 }
 public static void x(){
        Gerente g = new Gerente();
        Funcionario f = (Funcionario) g;
        System.out.println("Gerente g -> Funcionario f");
 }

}
$ java A
Gerente g -> Funcionario f
Gerente -> Funcionario -> Gerente
Exception in thread "main" java.lang.ClassCastException: Funcionario cannot be c
ast to Gerente
        at A.y(A.java:20)
        at A.main(A.java:9)

Perceba que eu posso ter um Funcionario que é um Gerente (Polimorfismo). Nesse caso eu posso fazer o cast "de volta". Agora um Funcionario "normal" não.

LPJava

pense dessa forma… nem todo funcionario é gerente… mais um gerente ele é funcionario…

Entao qdo vc diz ali, //nao funciona é pq nem todo funciona é gerente, vc na empresa tem o pessoal serviço gerais, a secretaria, o analista etc… e todos sao funcionarios…

Ja no outro que funciona vc diz… olha meu gerente é um funcionario q claro que sim…

Agora se vc fizer uma pesquisa no mundo da ADM vai ver que funcionrio nao existe mais agora é Colaborador rs.

Um exemplo semelhante: carro, moto todos sao veiculos… mais nem todo veiculo… é um carro, uma moto por exemplo :d

flw!

rmala_ti

Nossa galera, agora eu entendi mesmo!
Muito obrigado a todos vocês pela grande aula que me deram.
OO é difícil no princípio, mas depois que começa a entender os conceitos até que fica divertido.
Abração.

peczenyj

rmalati:
Nossa galera, agora eu entendi mesmo!
Muito obrigado a todos vocês pela grande aula que me deram.
OO é difícil no princípio, mas depois que começa a entender os conceitos até que fica divertido.
Abração.

Vc vai ter uma surpresa quando descobrir o Duck Typing do Ruby :slight_smile:

rmala_ti

peczenyj:
rmalati:
Nossa galera, agora eu entendi mesmo!
Muito obrigado a todos vocês pela grande aula que me deram.
OO é difícil no princípio, mas depois que começa a entender os conceitos até que fica divertido.
Abração.

Vc vai ter uma surpresa quando descobrir o Duck Typing do Ruby :)

Ah já ouvi dizer muito bem do Ruby, mas é demais pra minha cabeça, deixa eu aprender Java primeiro. hehheehe.
Valeu.

Criado 28 de fevereiro de 2008
Ultima resposta 29 de fev. de 2008
Respostas 10
Participantes 6