Ajuda com herança e polimorfismo

2 respostas
nilemarbarcelos

Pessoal, estou pondo em prática alguns exercicios da caelum(fj-11), porém, também crio os meus próprios exercicios, com outros assuntos.
A descrição é a seguinte:
Estou criando Funcionarios, que extendem a classe Pessoa, para a seguir criar a classe Empresa com uma List de funcionarios.
Minha classe Pessoa possui apenas String nome e int idade, e a classe Funcionarios possui uma String cargo.

Porém ao tentar declarar com polimorfismo, eu acabo por não conseguir setar o cargo, acho que devo ter exagerado no encapsulamento,
Segue o código:

package com.caelum.testeListaObjetos;

public class Pessoa {

	private String nome;
	private int idade;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public int getIdade() {
		return idade;
	}

	public void setIdade(int idade) {
		this.idade = idade;
	}

}
package com.caelum.testeListaObjetos;

public class Funcionario extends Pessoa {

	private String cargo;
	
	public void setCargo(String cargo){
		this.cargo = cargo;
	}
	
	public String getCargo(){
		return cargo;
	}
	
	
}
package com.caelum.testeListaObjetos;

public class Testar {

	public static void main(String[] args) {
		
		Pessoa p1 = new Funcionario();
		p1.setNome("João");
		p1.setIdade(25);
		p1.setCargo("Diretor"); // Aqui eu não consigo setá-lo
		
		
	}
	
}

Alguém poderia abrir meus olhos para onde estou errando?
Desde já obrigado

2 Respostas

Rodrigo_Sasaki

"Exagerar" no encapsulamento foi engraçado hehehee

acontece que você está com o tipo mais genérico.

Pessoa é mais genérico do que Funcionário, certo? Quando você diz
Pessoa p = new Funcionario();

a JVM sabe que você tem uma instância de pessoa, não funcionário.
Portanto você só tem acesso aos métodos e atributos de Pessoa.

para ter acesso aos métodos de funcionário você pode ou instanciar um funcionário diretamente, ou dar um cast.
Pessoa p = new Funcionario();
Funcionario f = (Funcionario) p; // agora tem acesso aos métodos de Funcionario
Funcionario func = new Funcionario(); // assim também

EDIT:
Porém se você tivesse algum método sobreescrito, seria diferente.

Ex:
class Pessoa{

    public void imprime(){
        System.out.println("Sou uma pessoa");
    }

}

class Funcionario extends Pessoa{

    @Override
    public void imprime(){
        System.out.println("Sou um funcionário");
    }

}

class Teste{

    public static void main(String[] args){
        Pessoa p = new Funcionario();
        p.imprime(); // Será invocado o método de Funcionário
    }

}
nilemarbarcelos

digaoneves,

Ahh sim, a minha dúvida foi sanada justamente no seu edit uahueha
Porque eu já possuia um exemplo com a sobrescrita, e estava tentando fazer o mesmo no exemplo aqui do tópico.
Muito obrigado pela resposta
abraço

Criado 8 de maio de 2012
Ultima resposta 8 de mai. de 2012
Respostas 2
Participantes 2