herança

7 respostas
dntalemao

Galera minha dúvida eu acho que é bem simples, por exemplo:

class Pessoa{

    Pessoa(){
        System.out.println(getValue());

    }

    public int getValue(){

        return -1;
    }

}


public class Funcionario extends Pessoa{
    
     public int getValue(){

        return 2;
     }
    public static void main (String [] args){

        Funcionario func=new Funcionario();

    }


}

por que a saída gerada será 2 e não -1?

7 Respostas

Ruttmann

Porque você alterou o compartamento do método que foi herdada da superclasse…

Quando você herda classes, herda todos os comportamentos(métodos) da mesma, mas pode alterar para refinar o comportamento…

Se você tivesse apenas feito o extends, instanciado o Funcionario e chamado o método, iria ter a saída -1. Como você alterou o método na sua subclasse, a saída será conforme a sua alteração…

dntalemao

Ruttmann:
Porque você alterou o compartamento do método que foi herdada da superclasse…

Quando você herda classes, herda todos os comportamentos(métodos) da mesma, mas pode alterar para refinar o comportamento…

Se você tivesse apenas feito o extends, instanciado o Funcionario e chamado o método, iria ter a saída -1. Como você alterou o método na sua subclasse, a saída será conforme a sua alteração…

mas no caso quando eu instancio a classe Funcionario o construtor dele implicitamente chama o construtor da superclasse, e dentro do construtor da superclasse é que ocorre o chamada do metodo getValue().

Henrique_Moraes

Mas você sobrescreveu o método getValue() na classe Funcionário.

dntalemao
class Pessoa{  
  
    char sexo='m';    

    Pessoa(){  
        System.out.println(getValue()); 
        System.out.println(sexo); 
  
    }  
  
    public int getValue(){  
  
        return -1;  
    }  
  
}  
  
  
public class Funcionario extends Pessoa{  
  
     char sexo='f'
      
     public int getValue(){  
  
        return 2;  
     }  
    public static void main (String [] args){  
  
        Funcionario func=new Funcionario();  
  
    }  
  
  
}

Adicionei o atributo sexo nas duas classes, sei que é errado fazer isso, duplicação de código totalmente desnecessária, porém foi só a título de exemplo.
No caso a saída gerada será:
2
m
Por que então a saída não foi:
2
f

Fellipex

Porque a classe funcionário que herda de pessoa e não o contrário, logo quando você altera o comportamento do método da classe funcionário, essa alteração só servirá para ela e subsequentemente para seus filhos, mas o getValue de pessoa continuará sendo igual visto que ele é a classe Pai. Esse é um dos princípios de herança você tem uma classe Pai que tem um método X, que soma 1+1 , dai você cria uma classe filha que tem o mesmo método X porém ele soma 1+2, logo você utiliza um método mais genérico da classe Pai, e especializa para suas classes filhas, entendeu?

Andersonrms
dntalemao:
class Pessoa{  
  
    char sexo='m';    

    Pessoa(){  
        System.out.println(getValue()); 
        System.out.println(sexo); 
  
    }  
  
    public int getValue(){  
  
        return -1;  
    }  
  
}  
  
  
public class Funcionario extends Pessoa{  
  
     char sexo='f'
      
     public int getValue(){  
  
        return 2;  
     }  
    public static void main (String [] args){  
  
        Funcionario func=new Funcionario();  
  
    }  
  
  
}

Adicionei o atributo sexo nas duas classes, sei que é errado fazer isso, duplicação de código totalmente desnecessária, porém foi só a título de exemplo.
No caso a saída gerada será:
2
m
Por que então a saída não foi:
2
f

Os métodos são sobrepostos nas subclasses, porém as variáveis são sombreadas (ou ocultas). A diferença entre os dois comportamentos é q na sobreposição o q importa para qual método será executado é o tipo do objeto, enquanto q no sombreamento é usado o tipo da referência. No seu exemplo é executado o método da subclasse pois o tipo do objeto é funcionário, e é usada a variável da superclasse pq a classe Pessoa não enxerga a variável q está sendo sombreada na subclasse (não ocorre polimorfismo). Mudando um pouco o código:

Pessoa func = new Funcionario();
System.out.println(func.getValue()); // imprime 2 (pois o objeto é do tipo Funcionario)
System.out.println(func.sexo);      // imprime m (pois a referência é do tipo Pessoa)
dntalemao
Andersonrms:
dntalemao:
class Pessoa{  
  
    char sexo='m';    

    Pessoa(){  
        System.out.println(getValue()); 
        System.out.println(sexo); 
  
    }  
  
    public int getValue(){  
  
        return -1;  
    }  
  
}  
  
  
public class Funcionario extends Pessoa{  
  
     char sexo='f'
      
     public int getValue(){  
  
        return 2;  
     }  
    public static void main (String [] args){  
  
        Funcionario func=new Funcionario();  
  
    }  
  
  
}

Adicionei o atributo sexo nas duas classes, sei que é errado fazer isso, duplicação de código totalmente desnecessária, porém foi só a título de exemplo.
No caso a saída gerada será:
2
m
Por que então a saída não foi:
2
f

Os métodos são sobrepostos nas subclasses, porém as variáveis são sombreadas (ou ocultas). A diferença entre os dois comportamentos é q na sobreposição o q importa para qual método será executado é o tipo do objeto, enquanto q no sombreamento é usado o tipo da referência. No seu exemplo é executado o método da subclasse pois o tipo do objeto é funcionário, e é usada a variável da superclasse pq a classe Pessoa não enxerga a variável q está sendo sombreada na subclasse (não ocorre polimorfismo). Mudando um pouco o código:

Pessoa func = new Funcionario();
System.out.println(func.getValue()); // imprime 2 (pois o objeto é do tipo Funcionario)
System.out.println(func.sexo);      // imprime m (pois a referência é do tipo Pessoa)

essa era exatamente minha dúvida, obrigado!
valeu ae pessoal.

Criado 23 de outubro de 2012
Ultima resposta 24 de out. de 2012
Respostas 7
Participantes 5