Dúvidas com Polimorfismo e Encapsulamento

Olá, pessoal! Estou começando a estudar Java agora e estou com dificuldade para entender alguns conceitos básicos. Gostaria apenas que me ajudassem na definição de dois assuntos (por enquanto) que sei que são importantíssimos: Polimorfismo e Encapsulamento. Não precisa falar mto não. Só mesmo um conceito sucinto será suficiente.

Pra provar que não precisa falar mto, vou dá um exemplo. Perguntei pra um amigo o conceito de Sobrecarga de Métodos (method overload) e ele disse: “É quando vc usa a mesma assinatura de um método, mas modifica o tipo do parâmetro que este irá receber.”

Obrigada a todos, aguardo as respostas

Polimorfismo tem a ver com herança, por exemplo. Você sabe que todas as classes em java extendem Object, certo? Se caso você criar um método com essa aparência.

  public void myMethod( Object obj ) {
      System.out.println( obj.hashCode() );
   }

você pode passar qualquer objeto criado em java, porque ele concerteza vai ter o método hashCode, podendo ter sido sobreposto ou não.

Encapisulamento é proteger a informação da sua classe, Ter variáveis privadas e o acesso a elas é feito através de métodos publicos. Funciona para você controlar o que você passa para sua variável! o exemplo básico da idade que eu adoro:

sem encapsulamento

class Test {
  int idade;

  public static void main( String[] args ) {
         Test test = new Test();
          test.idade = -10; //temos uma idade negativa
   }
}

con encapsulamento

class Test {
  private int idade;

  public void setIdade( int idade ) {
      if( idade < 0 )
            this.idade = 0;
      else
            this.idade = idade;
    }

  public static void main( String[] args ) {
         Test test = new Test();
          test.setIdade( -10 ); //temos idade = 0
   }
}

O polimorfismo permite que você use um tipo generico para representar um objeto de uma subclasse… ex.:

[code]public class Pessoa{

}

public class Funcionario extends Pessoa{

}

public class Cliente extends Pessoa{

}

Pessoa p = new Funcionario();
Pessoa p2 = new Cliente();[/code]
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…

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:

[code]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

}[/code]
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…

Vou dar uma outra visão dos dois casos.
Polimorfismo: Um exemplo é o botão ON/OFF. No seu controle remoto, o mesmo botão serve para ligar/desligar a TV ou o DVD ou o Video, depende em qual aparelho ele está conectado (pode chamar isso de “assinatura”)
Encapsulamento: Quando vc entra no seu carro e aperta o acelerador, um monte de ações mecânicas e eletrônicas são disparadas, mas não sabemos exatamente quais foram e em qual seqüência, isso tudo foi “embalado” para apenas acelerar.

Espero que tenha ajudado.

Bruno, Jairelton e Marcelo, mto obrigada pela ajuda!!! :grin:

aproveitando o tópico poliformismo não seria você usar um método para obter resultados diferentes ?

do tipo


public class poligono{
void desenha();
}

public class circulo extends poligono{
desenha();
}

public class quadrado extends poligono{
desenha();
}

bem o que estou tentado disser é o seguinte temos a classe pai que é poligono nela tem o metodo desenha e temos as classes circulo e quadrado que são filhas da classe poligno ambas herdaram o método desenha(); mas cada classe ira exibir um tipo diferente de poligono. Este tipo de coisa também é um poliformismo ???

Isso é override (sobrescrita):

Depois de sobrescrever você até pode usar polimorfismo para acessar os metodos sobrescritos, mas a sobrescrita em si não é polimorfismo…