O polimorfismo permite que você use um tipo generico para representar um objeto de uma subclasse... ex.:
public class Pessoa{
}
public class Funcionario extends Pessoa{
}
public class Cliente extends Pessoa{
}
Pessoa p = new Funcionario();
Pessoa p2 = new Cliente();
Veja que o tipo da variavel é Pessoa, mas o objeto colocado nela é de uma subclasse, assim as variaveis p e p2 darão acesso aos membros que são definidos na classe Pessoa, mas não darão acesso aos membros definidos somente nas subclasses...
http://pt.wikipedia.org/wiki/Polimorfismo
Já o Encapsulamento consiste em esconder dentro do objeto "coisas" que não dizem respeito a quem o usa, que são importantes apenas para o objeto, é como você usar um carro, você não precisa saber como o motor funciona, só precisa saber que tem que apertar o acelerador, o freio, etc...
veja:
public class Pessoa{
private String nome;
private int idade;
public void setNome(String nome){
this.nome = nome;
}
public String getNome(){
return nome;
}
//get e set idade
}
Ninguem precisa saber que existe uma variavel nome e uma idade na classe pessoa, só precisa saber que existem os metodos set e get pra cada um, o que esses metodos fazem pra guardar e recuperar o nome e a idade não interessa...
Pessoa p = new Pessoa();
p.setNome("jair");
String n = p.getNome();
Assim o ideal é manter publico só o que o usuario da classe precisa para usa-la, o que é mecanismo interno não precisa, e não deve, ser exposto...
http://pt.wikipedia.org/wiki/Encapsulamento