Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Sobrescrita == Polimorfismo ?

Qual a diferença entre polimorfismo e sobrescrita ? Ambos podem mudar o método e etc, não estou enxergando diferença grande.

12 respostas

Boa noite Thiago, na verdade a reescrita é o fato de alterar a implementação do método da classe pai. Já o Polimorfismo seria poder referenciar um objeto filho pela sua classe pai.

Por exemplo, imagine que temos a classe Cao que extends Animal, logo podemos :

Cao cao = new Cao();

ou

Animal cao = new Cao();

Ou seja, o polimorfismo é poder referenciar um objeto de varias formas.

Espero ter sido claro!

Abraços e bons estudos

Hmm, Polimorfismo se divide em sobrescrita e sobrecarga ? Ou não tem relação ?

Se como vc falou Polimorfismo é referenciar de varias formas, qual séria a vantagem de criar um Cao do do tipo do pai dele Animal ?

Thiago, você está confundindo as definições.

Sobrecarga É quando você escreve métodos com o mesmo nome mas com assinaturas diferentes:

Exemplo:

public int somar(int x, int y){
    return (x+y);
}

public int somar(int x, int y, int z){
    return (x+y+z)
}

somar(10,10);
somar(10,10,10);

Ou seja, eu fiz a sobrecarga do método somar. quando eu chamar o método passando 2 argumentos ele vai usar o primeiro método, quando eu chamar o método com 3 argumentos ele usa o segundo método.

Isso é muito utilizado em sobrecarga de construtores para permitir que eu possa instanciar meu objeto de varias maneiras. Vale a pena dar uma pesquisada sobre.

Sobrecarga eu entendi meu problema é com a definição de polimorfismo e quando é viável usar e etc.

a sobrescrita é quando eu eu tenho uma classe pai que possui um método e minha classe filha sobrescreve o método da pai.

Exemplo:

public class Funcionario{
    private nome;
    private salario;

    //Métodos Setter's..............
    //Métodos Getter's............

    public double getSalario(int horas){
        return horas*100;
    }
}
public class Estagiario extends Funcionario{

    @Override
    public double getSalario(int horas){
        return horas*50;
    }
}
public class Diretor extends Funcionario{

    @Override
    public double getSalario(int horas){
        return horas*200;
    }
}

Conforme o exemplo, eu tenho minha classe Funcionário comum na qual o método getSalario retorna as horas trabalhadas vezes 100 reais. Ja na classe Estagiario o mesmo método foi sobrescrito (herdado da classe Funcionario) e retorna as horas vezes 50 reais. E na classe diretor o método foi sobrescrito (herdado da classe Funcionario) e retorna as horas vezes 150 reais.

Sim sim isso entendi meu problema é com o conceito de polimorfismo, como foi falado mais cedo o polimorfismo é referenciar um objeto de várias maneiras certo ? quando deve ser usado idealmente ?

solução!

Polimorfismo é como o guilherme disse, referenciar um objeto filho pela sua classe pai.

A vantagem disso depende do cenário que você aplica e de que forma.

Vamos usar as classes que eu te falei logo acima "Funcionario", "Diretor" e "Estagiario". e vamos supor que o método getSalario() retorna o salario de 1 dia trabalhado, ok?

Agora alguem da minha empresa pediu pra eu criar uma classe que calcule o salario mensal de cada funcionario. Ok... Facil!

public class CalculadoraSalario{
    public double calculaSalarioMensal(Estagiario e){
        return e.getSalario()*30;
    }

    public double calculaSalarioMensal(Diretor d){
        return d.getSalario()*30;
    }
}

Diretor d = new Diretor();
Estagiario e = new Estagiario();

CalculadoraSalario c = new CalculadoraSalario();
 c.calculaSalarioMensal(d);
 c.calculaSalarioMensal(e);

Percebeu que pra cada classe eu tive que criar um método que calcula o salario? uma para o diretor, outra pra o estagiario.

Isso parece errado!

Se eu tivesse 10 classes para cada profissao eu teria que criar 10 métodos diferentes?

Nesse caso uma boa aplicação é o uso do polimorfismo

public class CalculadoraSalario{
    public double calculaSalarioMensal(Funcionario f){
        return f.getSalario()*30;
    }
}

Diretor d = new Diretor();
Estagiario e = new Estagiario();

CalculadoraSalario c = new CalculadoraSalario();
 c.calculaSalarioMensal(d);
 c.calculaSalarioMensal(e);

Como:

Diretor É UM FUNCIONÁRIO porque ele herda de funcionario.

Estagiario É UM FUNCIONÁRIO porque ele herda de funcionario.

Eu posso criar um método que recebe uma classe pai genérica "Funcionario" e receber qualquer filho que herde dessa classe otimizando meu código.

Otimo, no caso polimorfismo é fazer algo o mais generico possivel, que possa funcionar para todos os seus Filhos, e dai quando executar o programa vai saber qual função executar de acordo com cada filho, se eles tiverem ou não as funções criadas, correto? levando em conta que nesse cenario não teria uma interface ou metodo abstrado.

estou certo ?

Deixa ver se entendi o que vc quis dizer.

"...e dai quando executar o programa vai saber qual função executar de acordo com cada filho..."

Nesse exemplo que eu dei ele vai executar a mesma lógica para qualquer objeto do tipo Funcionario que for passado. Tanto Estagiario como Diretor vao executar a lógia do salario diario * 30.

Mas, podemos fazer chegar nisso que você falou da seguinte maneira.

public class CalculadoraSalario{
    public double calculaSalarioMensal(Funcionario f){
        if(f instanceof Estagiario){
        //executa uma lógica para estagiários
        }

     if(f instanceof Diretor){
        //executa uma lógica para diretores
        }
    }
}

Usando o operador instanceof eu consigo descobrir se o objeto passado como funcionário é um diretor ou um estagiario.

Não o que eu quis dizer foi que quando a função CalculadoraSalario for ser executada ela vai usar a função getSalario de cada filho (diretor, estagiario), pois na Classe deles existe está função getSalario, caso não exista ele pega do Pai Funcionario certo ?

O que to querendo dizer "acho", que o polimorfismo é usado para em código ser criado algo generico, mas em execução ele vai saber usar o metodo correto para cada filho.

Aaa sim.. No nosso exemplo a gente sobrescreveu o método em Diretor e em Estagiario.

Mas se não tivessemos feito isso, ela teria de qualquer forma o getSalario() herdado de Funcionario.

Você esta certo.

ok vlw mano pela a grande paciência !!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software