Instrutor Daniel Bernardo
Princípios de Orientação a Objetos
• Construímos Software para resolver problemas
• Pessoas tem problemas
• Logo, construímos Software para pessoas
Instrutor Daniel Bernardo
Princípios de Orientação a Objetos
Um bom Software não apenas resolve
um problema imediatamente, como
também está projetado para suportar
as inevitáveis mudanças solicitadas
pelas pessoas.
Instrutor Daniel Bernardo
Princípios de Orientação a Objetos
• Validação de CPF
– Espalhado por várias partes do sistema;
• Adição de novas funcionalidades
– Validar maior idade;
Instrutor Daniel Bernardo
Princípios de Orientação a Objetos
• Usando nossa Classe
– Devemos utilizar nossa classe em forma de Objeto;
– Um objeto é uma instância de uma classe;
– Para instanciar um objeto de uma classe, usa-se a palavra new;
– Se você tentar utilizar uma variável do tipo da nossa classe, sem
utilizar o new, obterá um NullPointerException;
Instrutor Daniel Bernardo
Pacotes
• Quando um programador utiliza as classes feitas por outro
surge um problema clássico: como escrever duas classes com
o mesmo nome?
• Por exemplo, pode ser que a minha classe de Data funcione de
um certo jeito e a classe de Data de um colega de outro jeito.
Pode ser que a classe de Data de uma biblioteca funcione
ainda de terceira maneira.
• Os diretórios estão diretamente relacionados aos chamados
pacotes e costumam agrupar classes de funcionalidade
parecida.
• Um pacote pode conter nenhum, um ou mais subpacotes e/ou
nenhuma,uma ou mais classes dentro dele
Instrutor Daniel Bernardo
Pacotes
• Em Suma:
– Um pacote ou package na tecnologia Java nada mais é do que
um conjunto de classes localizadas na mesma estrutura
hierárquica de diretórios.
– Usualmente, são colocadas em um pacote classes
relacionadas, construídas com um propósito comum para
promover a reutilização de código:
• validação de CPF e CNPJ, operações com data,
manipulação de vetores, cálculos matemáticos como
médias e percentuais, etc;
Instrutor Daniel Bernardo
Padrão de nomenclatura
• br.com.nomedaempresa.nomedoprojeto.subpacote
• br.com.nomedaempresa.nomedoprojeto.subpacote2
• br.com.nomedaempresa.nomedoprojeto.subpacote2.subpacote3
• Os pacotes só possuem letras minúsculas, não importa
quantas palavras estejam contidas nele.
• Esse padrão existe para evitar ao máximo o conflito de
pacotes de empresas diferentes.
Instrutor Daniel Bernardo
Import
Full Qualified Name
Esse é o verdadeiro nome de uma classe, por isso que duas classes X em
pacotes diferentes não conflitam:
br.com.empresa.pacote.Classe
Utiliza-se o import para declaração de classes que são referenciadas no
arquivo fonte mas que não pertencem ao pacote onde este arquivo se
encontra.
Podem referenciar:
Outras classes no mesmo projeto
Classes da API Java, como por exemplo java.util.List
Classes contidas nas bibliotecas utilizada pelo projeto, ou seja, nos arquivos
*.jar referenciados no classpath do projeto
Instrutor Daniel Bernardo
Import
• Classes essencias para o funcionamento de qualquer
projeto Java, são implicitamente importadas na Classe.
• Por isso que não é necessário fazer o import das
classes System e String por exemplo.
Instrutor Daniel Bernardo
Modificadores de Acesso
• private: A única classe capaz de acessar os atributos, construtores e
métodos privados é a própria classe. Classes não podem ser private, mas
atributos, construtores e métodos sim.
• protected: Aquilo que é protected pode ser acessado por todas as
classes do mesmo pacote e por todas as classes que a estendam.
Somente atributos, construtores e métodos podem ser protected.
• default: (sem nenhum modificador) – Se nenhum modificador for utilizado,
todas as classes do mesmo pacote têm acesso ao atributo, construtor,
método ou classe.
• public: Todas as classes podem acessar aquilo que for definido como
public. Classes, atributos, construtores e métodos podem ser public.
Instrutor Daniel Bernardo
Herança
• Regras para Herança no Java:
– Uma classe pode ser Herdada por várias outras
classes;
– Uma classe só pode Herdar uma única classe;
– Membros protected são acessíveis;
– Toda classe herda de Object;
Instrutor Daniel Bernardo
Herança
• Problema 1:
– No fim de ano, todos funcionários recebem uma
bonificação no valor de 10% do salário;
– Exceto os Gerentes, que recebem uma bonificação
de 15%;
Instrutor Daniel Bernardo
Herança
• Problema 2:
– A regra para cálculo da bonificação de gerentes
mudou, agora ela será no mesmo valor percentual
da bonificação dos funcionários mais R$ 1.000,00;
Instrutor Daniel Bernardo
Polimorfismo
• Traduzindo, do grego, ao pé da letra, polimorfismo significa
"muitas formas".
• Essas formas, em nosso contexto de programação, são as
subclasses/objetos criados a partir de uma classe maior,
mais geral, ou abstrata.
• Polimorfismo é a capacidade que o Java nos dá de controlar
todas as formas de uma maneira mais simples e geral, sem
ter que se preocupar com cada objeto especificamente
Instrutor Daniel Bernardo
Polimorfismo
• Uma variável do tipo Funcionario, pode armazenar um
objeto do tipo Funcionario;
• Se gerente é um Funcionario, então uma variável do
tipo Funcionário pode armazenar um objeto do tipo
Gerente;
Instrutor Daniel Bernardo
Polimorfismo
• Qual método o Java invocará?
– De Funcionário?
– De Gerente?
A escolha de qual
implementação será chamada é
feita em Tempo de Execução
Instrutor Daniel Bernardo
Polimorfismo
• O benefício do Polimorfismo é observado quando
utilizamos os tipos como parâmetros dos métodos:
• Problema 3: Criar uma funcionalidade que calcule o
total gasto em bonificações. Considerando todos
funcionarios da empresa. (Funcionario, Gerente e
qualquer outro que houver)
Instrutor Daniel Bernardo
Polimorfismo
• Sistema para faculdade que controle o gasto com
funcionários;
• Relatório que imprima informações do funcionário e
quanto a faculdade gasta com ele;
• Funcionario recebe salário;
• Professor recebe salário + 10,00 hora / aula;
Instrutor Daniel Bernardo
Classes Abstratas
Faz sentido existir um objeto Funcionario?
No mundo real, funcionário idealiza um
segmento.
Nós temos Secretárias, Diretores, Gerentes…
Não designamos niguém como Funcionário.
Instrutor Daniel Bernardo
Classes Abstratas
• Quando não queremos receber uma instância desta classe, mas
queremos obter a vantagem do polimorfismo e da herança, utilizamos
classe Abstrata.
• Métodos abstratos:
• Não faz sentido o método getBonificacao() ter uma implementação na
classe Funcionario, já que em nosso sistema, queremos que cada
funcionário específico tenha uma regra de bonificação diferente.
• Deixamos abstrato para utilizar na classe controladora de bonificação.
• Qualquer classe que estender Funcionário, será obrigada a implementar o
método abstrato
Instrutor Daniel Bernardo
Classes Abstratas
• Classe Diretor estende Gerente: não precisa
implementar o método, pos gerente já implementa
• Classe Secretária e Classe SecretariaAdministrativa
que estende Secretária. Classe Secretaria não precisa
implementar o método, já que é uma classe abstrata.
Instrutor Daniel Bernardo
Interfaces
• Problema: Em um sistema de banco, podem acessar Gerentes e
Diretores;
• Nem todo funcionário tem o método autentica e nem deve ter;
• Uma classe Abstrata FuncionarioAutenticavel resolveria o
problema em partes;
• Surge outro problema: Agora os clientes podem acessar o sistema.
• Jamais faça Herança sem Sentido.
Instrutor Daniel Bernardo
Interfaces
• Interfaces fazem com que classes garantam sempre um
comportamento;
• Cria um contrato que define o que uma classe deve fazer;
• A classe que quiser, pode assinar este contrato e fica obrigada a
implementar o que a Interface define;
• Interfaces expõem o que deve ser feito, e não como deve ser
feito;
• Interfaces deixam o código mais flexível a mudanças;
• Métodos public e abstract;