Para que eu pudesse entender um pouco melhor o conceito de abstract. Eu fiquei pensando o que seria algo abstrato que leva a algo concreto na vida real...
Uma LUZ divina veio e disse UMA RECEITA CULINARIA
Vou explicar isso melhor...
public abstract class Funcionario {
private String nome;
private String cpf;
private double salario;
public abstract double getBonificacao();
Quando a gente declara uma class abstrata ela deixa de ser, digamos, os "ingredientes" e passa a ser uma descrição dos ingredientes. Ou seja, os ingredientes não existem todos dispostos em cima da mesa. Um sujeito qualquer deve ir buscar no armário, na geladeira ou até mesmo ir comprar no mercado (Podemos encarar que ir comprar no mercado como uma analogia do uso de interface. Podemos pensar que os igredientes não pertecem a classe casa e precisa de uma classe mercado para que a receita seja finalizada ... Enfim essa idéia não está muito madura).
O polimorfismo indica quem está fazendo a receita. Então, o sujeito é responsável por pegar todos os ingredientes necessários para dar continuidade na receita
public class TesteReferencias {
public static void main(String[] args) {
Funcioncionario g1 = new Gerente();
//O gerente está usando uma receita de funcionário
g1.setSalário(2500.0);
/*Com a instrução de como usar o igrediente salário
* ele usa o igrediente .
*/
ControleBonificacao controle = new ControleBonificacao();
controle.registra(g1);
/* Esse codigo vamos encarar que na receita pede
* para bater o ingrediente na batedeira.
*/
}
}
Podemos observar que criou um novo objeto, ou seja, uma batedeira seria objeto para complementar na receita.
Agora vamos imaginar que essa batedeira é muito inteligente sendo capaz de ler a receita e determinar qual a rotação necessária, o tipo de pá de mistura e o tempo necessário para completar a receita. E a receita fala para a batedeira perceber quem está fazendo a receita para que haja uma textura massa de diferente de acordo com o gosto do sujeito. Isso tudo seria determinado pelo os métodos.
É isso que está acontecendo com o codigo abaixo:
public class ControleBonificacao {
private double soma;
public void registra(Funcionário g) {
// batedeira lê a receita
double boni = g.getBonificacao();
/*Receita fala para a batedeira ver o tipo de
* textura da massa que o sujeito gosta
*/
this.soma = this.soma + boni;
/* Aqui a batedeira vai utilizar a rotação necessária,
* o tipo de pá de mistura e o tempo necessário.
*/
}
}
No codigo abaixo vemos a batedeira reconhecendo o tipo de gosto do sujeito atraves de como a receita falou para ser feito.
O motivo disso é que na classe abstrata temos um metodo abstrato que vai apontar para o método mais específico que pertence ao sujeito. Ou seja, quando a batedeira lê essa instrução na receita ela vai direto perguntar ao sujeito qual é o tipo de textura de massa que ele deseja.
public class Gerente extends Funcionario {
/* O metodo abstrato da Classe Abstrata está
* apotando para o metodo específico do sujeito
*/
public double getBonificacao() {
/* Aqui é onde a batedeira vai perguntar ao sujeito
*o tipo de textura que gosta
*/
System.out.println("Chamando o método de bonificacao do Designer");
return super.getSalário;
}
}
Diferentemente de uma classe não abstrata. Uma classe não abstrata ela se torna os ingredientes e o sujeito pode fazer qualquer tipo de receita que deseja fazer.
Bom isso só foi um insight meu para entender melhor a classe abstrata espero que vocês me ajudem a melhorar essa ideia.
E para completar eu não uso drogas...
PS: Um dia eu conto como eu aprendi ponteiros em C assistindo Bob Esponja..