Professional Documents
Culture Documents
Programação OO em Java
Programação OO em Java
1
Fundamentos sobre Orientação a
Objeto
Objetivo
Programação Estruturada Versus OO
Características
Fundamentos OO
Classe
Encapsulamento
Limitadores de Acesso
Instância
Abstração
2
Fundamentos sobre Orientação a
Objeto
Herança
Polimorfismo
Interface
MultiHerança
Quando utilizar MultiHerança?
Colaboração entre Objetos
3
Instalação do JDK
(Java Development Kit)
4
Download JDK
(Java Development Kit)
5
Instalação do Visual
Studio Code
6
Ferramenta utilizada no Curso
7
Configuração do Visual
Studio Code para Java
8
Configuração Visual Studio
para Java
9
Configuração Visual Studio
para Java
10
Configuração Visual Studio
para Java
11
Configuração Visual Studio
para Java
12
Configuração Visual Studio
para Java
13
Configuração Visual Studio
para Java
14
Configuração Visual Studio
para Java
15
Configuração Visual Studio
para Java
16
Configuração Visual Studio
para Java
17
Configuração Visual Studio
para Java
18
Programação Clássica
versus
Programação OO
19
Progamação Clássica versus
Programação OO
Em arquitetura de computadores, pode-se visualizar o hardware dividido
basicamente em 4 áreas: área de código, área de dados, área de dados
extra e área de pilha;
20
Programação Clássica versus
Programação OO
Tanto programação clássica quanto na programação OO, os métodos
(funções e procedures) são compilados para serem executadas na área de
código do computador;
Na programação clássica a chamada aos métodos (funções e procedures)
é geralmente definida em tempo de compilação, de forma estática, através
da própria área de código, com exceção de linguagens como o javascript;
21
Programação Clássica versus
Programação OO
Porém, na programação OO a chamada aos métodos (funções e
procedures) é geralmente definida em tempo de execução, de forma
dinâmica, através da área de dados extra. No entanto, também existem
formas de forçar para que o código seja executado de forma estática como
na programação tradicional;
Na programação clássica, os métodos (funções e procedures) e variáveis
são definidos de forma separadas;
Na programação OO, os métodos (funções e procedures) e variáveis são
definidos de forma conjunta;
22
Progamação Clássica versus
Programação OO
23
Programação Clássica versus
Programação OO
Na programação clássica, como os métodos (funções e procedures) e
variáveis são definidos de forma separadas, geralmente é mais dificíl
entender quais métodos se aplicam a quais funcionalidades de um software;
Na programação OO, como os métodos (funções e procedures) e
variáveis são definidos de forma conjunta, geralmente é mais fácil
compreender quais métodos se aplicam a quais funcionalidades de um
software;
Na programação OO, como os métodos (funções e procedures) e
variáveis são definidos de forma conjunta, os conceitos de classe e
objeto conseguem se concretizar;
24
Programação Clássica versus
Programação OO
Na programação OO, como os métodos (funções e procedures) e
variáveis são definidos de forma conjunta, é possível representar
elementos da realidade humana de forma muito mais completa do que
a programação tradicional. Exemplo: pessoa, carro, venda, compra,
fornecedor, entre outros;
O reuso de componentes de software podem ser feitos tanto na
programação tradicional quanto na programação OO, porém na
programação OO o reuso pode acontecer de forma muito mais
sofisticada do que na programação tradicional;
25
Programação Clássica versus
Programação OO
Na programação OO surge um conceito que não existia na
programação tradicional: a herança de componentes de software através
de classes;
Por muito tempo a comunidade de profissionais da área colocaram a
herança como fator primordial para utilização da programação OO em
detrimento da programação tradicional. O foco era o reuso de software
através da herança de componentes de software;
Com o tempo, no entanto, a herança mostrou-se muito mais
importante para abstração (desacoplamento) dos componentes de
software do que propriamente para o reuso de software;
26
Programação Clássica versus
Programação OO
Naturalmente, na programação OO o reuso pode ser implementado de
forma mais sofisticada do que na programação tradicional, porém a
herança e a abstração de componentes de software acontecem apenas
na programação OO, conceitos encontrados apenas na OO;
27
Programação Clássica versus
Programação OO
Outras características importantes encontradas apenas na orientação a
objeto, quando comparada a programação clássica: tipos complexos
(classes como tipos complexos contendo atributos e métodos),
navegabilidade (navegação entre objetos), troca de mensagens através
de objetos (diferente da troca de dados entre métodos), representação
mais próxima dos objetos que fazem parte da realidade humana
(melhor semântica), melhor facilidade de entendimento e manutenção
do software, melhor tecnologia para desacoplamento do software
utilizado durante a manutenção e evolução do software;
28
Linguagem de
Programação OO
29
Linguagem de Programação OO
Como saber se uma linguagem de programação é orientada a objeto ou
não?
Para saber se uma linguagem de programação é orientada a objeto, pelo
menos três conceitos precisam existir na linguagem: Classe, Herança e
Polimorfismo;
Uma linguagem orientada a objetos também pode ser classificada de duas
formas: linguagem puramente orientada a objetos e linguagem
totalmente orientada a objetos;
30
Linguagem de Programação OO
Como linguagens de programação totalmente orientada a objeto pode-
se citar: Java, C#, C++, TypeScript, Object Pascal, entre outras;
32
Princípios da Orientação a
Objeto
33
OBJETIVOS
Aumentar a reusabilidade do software;
Aumentar a abstração do software.
34
ENGENHARIA DE SOFTWARE
COESÃO: mede quão relacionadas ou focadas estão as responsabilidades da classe. Uma
classe com baixa coesão faz muitas coisas não relacionadas e leva aos seguintes problemas:
- Difícil de entender;
- Difícil de reusar;
- Difícil de manter;
ACOPLAMENTO: mede o quão vinculadas estão as classes relacionadas. Uma classe com
alto acoplamento pode ser afetada fortemente pela mudança ou evolução das classes
relacionadas.
35
ENGENHARIA DE SOFTWARE
ALTA COESÃO;
FRACO ACOPLAMENTO.
36
Forte Acoplamento Fraco Acoplamento
CONSTATAÇÕES DA
ENGENHARIA DE SOFTWARE
A fase de manutenção de software é geralmente a fase mais longa;
O custo durante a fase de manutenção de software é geralmente a mais cara;
Geralmente gasta-se mais tempo mantendo um software do que o
construindo;
“[..] a maior parte do orçamento das grandes empresas é destinada à manutenção de sistemas
existentes[..]” (SOMMERVILLE, 2000)
“[..] Erlikh sugere que 90% dos custos de software estão na evolução[..]” (SOMMERVILLE,
2000)
37
O QUE SÃO PRINCÍPIOS?
principiar - Conjugar
(latim principio, -are)
v. tr.
1. Dar princípio a. = iniciar
v. intr.
2. Ter princípio.
38
O QUE SÃO PRINCÍPIOS?
princípio
prin.cí.pio
sm (lat principiu) 1 Ato de principiar. 2 Momento em que uma coisa tem origem;
começo, início. 3 Ponto de partida. 4 Causa primária. 5 Fonte primária ou
básica de matéria ou energia. 6 Filos Aquilo do qual alguma coisa procede
na ordem do conhecimento ou da existência. 7 Característica determinante
de alguma coisa.
39
CONCEITO
“Um princípio de projeto é uma ferramenta básica ou uma técnica que
pode ser aplicada a um projeto ou à escrita de um código para tornar
esse código mais flexível, extensível ou mais fácil de ser mantido.”
(MCLAUGHLIN, 2007)
Fácil de de manter
Extensível
Flexível
40
PRINCÍPIOS DA OO GARANTEM
UM BOM PROJETO OO?
Somente princípios da OO podem não garantir um bom projeto OO;
Porém, sem princípios também é difícil fazer um bom projeto;
Sem princípios, muitos padrões de projetos podem ser utilizados de
forma automática;
Os princípios são o caminho para a escolha de bons padrões de
projeto.
41
O QUE GANHO COM ISSO?
Melhoria com a qualidade estrutural do software;
Redução do custo com a construção do software;
Redução do custo com a manutenção corretiva, evolutiva e adaptativa do
software;
Redução do tempo para entrega do software durante a criação e
manutenção;
Aumento da satisfação do cliente/usuário.
42
Qualidade Estrutural Redução de Custos Redução do Tempo de Entrega Satisfação do Cliente
O QUE PERCO COM ISSO?
Maior complexidade estrutural do software;
Pode dificultar o entendimento em algumas situações.
Dificuldade de Entendimento
Complexidade Estrutural
43
PRINCÍPIOS OO
Princípio DRY (Don’t Repeat Yourself );
Princípio OCP (Open-Closed Principle);
Princípio da Inversão de Dependência;
Princípio do Mínimo Conhecimento;
Princípio de Hollywood;
Princípio da Responsabilidade Única (Singleton Responsability Principle - SRP);
Princípio da Substituição de Liskov (Liskov Substitution Principle - LSP);
44
CARACTERÍSTICAS
Evite código duplicado abstraindo coisas que são comuns e colocando-as em um único
local (Princípio DRY - Don’t Repeat Yourself );
Encapsule o que varia;
Dê prioridade à composição em relação à herança;
Programe para interface, não para implementações;
Busque designs levemente ligados entre objetos que interagem;
As classes devem estar abertas para a extensão, mas fechadas para a modificação
(Princípio OCP - Open-Closed Principle);
Dependa de abstrações. Não dependa de classes concretas (Princípio da Inversão de
Dependência);
45
CARACTERÍSTICAS
Só converse com seus amigos mais próximos (Princípio do Mínimo
Conhecimento);
Não nos telefone, nós telefonaremos para você (Princípio de Hollywood);
Uma classe só deve ter uma única razão para mudar;
Todos objetos do seu sistema devem ter uma única responsabilidade, e
todos os serviços do objeto devem se concentrar em exercer essa
responsabilidade única (Princípio da Responsabilidade Única - Singleton
Responsability Principle (SRP));
Os subtipos devem poder ser substituídos por seus tipos base (Princípio
da Substituição de Liskov - Liskov Substitution Principle (LSP)).
46
Classes em Orientação a
Objeto
47
Classes em Orientação a Objeto
48
Classes em Orientação a Objeto
49
Estrutura da Classe em
Orientação a Objeto
50
Estrutura da Classe em OO
Nome da classe – Um identificador para classe que permite referenciá-la
posteriormente, como, por exemplo, no momento da criação de um objeto;
Tipo de classe – Define um tipo para a classe: concreta, abstrata ou
constante;
Visibilidade da classe – Define o quão acessível é uma classe a partir de
outros objetos, como pública ou padrão;
Nome do atributo – Um identificador para o atributo;
Tipo do atributo – O tipo para o atributo, como: inteiro, real, caracter,
entre outros;
51
Estrutura da Classe em OO
Visibilidade do atributo – Define o quão acessível é um atributo de um
objeto a partir de outros objetos, podendo ser privado, público ou protegido;
Nome do método – Um identificador para o método;
Tipo do método – Quando o método tem um valor de retorno, é
necessário também definir o tipo de dados de retorno, como: inteiro,
caracter, entre outros;
Visibilidade do método – Define o quão visível é um método a partir de
objetos de outras classes, podendo ser privado, público ou protegido.
52
Estrutura da Classe em
Java
53
Visibilidade de Classes, Métodos e
Atributos em Java
54
Exemplo de um Modelo de Classes
em UML
55
Exemplo de uma Classe em Java
56
Compilador Java
57
Como Funciona o Compilador Java
58
Como Funciona o Garbage Collection no
Java
59
Como Funciona o Garbage Collection no
Java
60
Como Funciona o Garbage Collection no
Java
61
Como Funciona o Garbage Collection no
Java
62
Estruturas de Classe em
Orientação a Objeto
63
Estruturas de Classe em OO
64
Exemplo de Construtor e Destruidor
em Object Pascal
65
Exemplo de Construtor e
Destruidor em C++
66
Estruturas de Classe em
Java
67
Estruturas de Classe em Java
Toda classe possui pelo menos um método para construção de
objetos geralmente criada sem a palavra reservada denominada
constructor. O método construtor em Java precisa ter o mesmo nome
da classe, o que já o define como um método construtor de objetos;
Em Java, quando nenhum método constructor é explicitamente
criado, o compilador o gera implicitamente com visibilidade pública,
sem nenhuma passagem de parâmetro e com implementação vazia;
Em Java, o método construtor não precisa definir nenhum tipo de
dado de retorno. Os demais métodos da classe precisam definí-los;
É possível criar mais de um construtor para um classe;
68
Estruturas de Classe em Java
No entanto, caso algum construtor da classe seja criado
explicitamente sem que seja público e sem passagem de parâmetro, o
compilador exigirá que outro construtor que seja público e sem
passagem de parâmetro também seja criado explicitamente, ainda que
não contenha nenhuma implementação;
Em java, nenhum método destrutor de objetos será criado
explicitamente pelo implementador. A sua criação é definida
implicitamente pelo próprio Java e será chamado pelo garbage collector
quando o objeto não for refencido por mais nenhuma variável;
69
Estruturas de Classe em Java
Em java, a palavra reservada virtual não precisa ser utilizada, pois
todos métodos em java são automaticamente virtuais.
70
Métodos e Atributos de
Classe em Java
71
Estruturas de Classe em Java
Em Java, os atributos e métodos da classe geralmente não podem ser
acessados enquanto um objeto não for criado para a classe;
Porém, em Java, é possível criar métodos e atributos que possam ser
utilizados sem a criação de um objeto;
Em Java, para criar métodos e atributos que possam ser utilizados
sem a criação de um objeto (ou utilizados diretamente pela classe) é
necessário utilizar a palavra reservada static na frente do atributo ou
método desejado;
72
Estruturas de Classe em Java
Porém um atributo da classe em Java que utilizar a palavra reservada
static tornará o atributo uma variável global (tornar-se-á uma variável
compartilhada) e poderá ser utilizada por diversos objetos distintos da
aplicação, logo deve-se tomar muito cuidado com possíveis inconsistências
de dados;
Um método da classe em Java que utilizar a palavra reservada static
tornará o método global e poderá ser utilizada por diversos objetos
distintos da aplicação, porém o método não poderá ser utilizado como
herança de objeto, e nem ser utilizado pelo objeto de forma polimórfica
porque deixará de ser um método do objeto e passará a ser apenas um
método da classe; 73
Estruturas de Classe em Java
Quando utiliza-se atributos e métodos a partir de um objetos criado, diz-se
então que esses atributos e métodos são atributos e métodos de objeto;
Quando utiliza-se atributos e métodos a partir de uma classe, diz-se então
que esses atributos e métodos são atributos e métodos de classe;
Os atributos e métodos de objeto são definidos em tempo de
execução, ou seja, só podem ser utilizados ou acessados a partir da
criação do objeto;
74
Estruturas de Classe em Java
Os atributos e métodos da classe são definidos em tempo de
compilação, ou seja, só podem ser utilizados ou acessados através da
classe, sem criar o objeto;
Os atributos e métodos de objeto em uma classe podem ser acessados
por ela através da palavra reservada this utilizada na frente do atributo ou
do método desejado;
Os atributos e métodos de classe em uma classe podem ser acessados
por ela através do nome da classe utilizada na frente do atributo ou do
método desejado;
75
Estruturas de Classe em Java
Os métodos de classe em uma classe não podem acessar diretamente
os atributos e métodos de objeto desta mesma classe;
Caso a palavra reservada this ou o nome da classe seja omitido na
frente do atributo ou do método desejado, o compilador Java
considerará que o atributo ou o método chamado é um atributo ou método
de objeto, como se a palavra reservada this tivesse sido escrita na frente
do método ou do atributo;
A palavra reservada final pode ser utilizada em classes, métodos,
atributos e parâmetros de métodos;
76
Estruturas de Classe em Java
Quando a palavra reservada final é utilizada numa classe, significa que
nenhuma classe poderá herdá-la;
Quando a palavra reservada final é utilizada num método, significa que
quando uma classe herdá-la, este método não poderá ser substituído pela
classe que a herdou;
Quando a palavra reservada final é utilizada num atributo ou no
praêmetro de um método, significa que esta variável passará a ser uma
constante, ou seja, assim que esta variável receber um valor, nunca mais
poderá ser modificado;
77
Estruturas de Classe em Java
Em Java, um arquivo com a extensão .java deve ser criado para cada
classe Java criada;
Um arquivo com a extensão .java só pode conter uma classe Java;
O nome do arquivo com a extensão .java deve ter obrigatoriamente o
mesmo nome da classe Java contida neste arquivo;
Toda classe em Java pertence a um pacote e utiliza a pala reservada
package, seguida do caminho de destino da classe dentro do pacote;
Quando o pacote não é informado, o compilador Java interpreta que o
pacote padrão da classe está localizado na raiz do projeto Java;
78
Estruturas de Classe em Java
Quando um pacote é informado, a classe Java é criada dentro de uma
estrutura de diretório, de acordo com o caminho informado na palavra
reservada package;
A classe em Java só poderá ser criada de duas formas: pública ou
padrão;
Quando a classe é definida como pública, ela deverá ser precedida da
palavra reservada public;
Quando a classe é definida como padrão, ela não precisará ser
precedida por nenhuma palavra reservada, e o compilador Java
interpretará que a classe criada será do tipo padrão;
79
Estruturas de Classe em Java
Quando uma classe é pública, ela pode ser acessada por qualquer outra
classe, mesmo que pertençam a pacotes diferentes;
Quando uma classe é padrão, ela pode ser acessada por qualquer outra
classe, desde que pertençam ao mesmo pacote;
80
Objetos em Java
81
Objetos em Java
82
Exemplo de Criação de Objeto em
Java
83
Objetos em Java
84
Objetos em Java
85
Objetos em Java
86
Criando Objetos em Java
87
Criando um Objeto em Java
88
Criando um Objeto com Atributos em
Java
89
Destruindo Objetos em
Java
90
Destruindo um Objeto em Java
91
Criando e Destruindo
Objetos em Java
92
Criando e Destruindo Objetos com
Atributos em Java
93
Criando e Destruindo Objetos com
Atributos em Java
94
Exercício 1
95
Exercício 1
96
Coleção de Objetos em
Java
97
Coleção de Objetos em Java
98
Criando Coleção de Objetos em Java
99
Criando Coleção de Objetos em Java
10
Operadores em Java
10
Operadores Aritméticos Java
10
Operadores Relacionais em Java
10
Operadores Lógicos em Java
10
Estruturas Condicionais e
de Repetição em Java
10
Estrutura Condicional IF em Java
if ( condição ) {
}else{
10
Estrutura Condicional CASE em Java
switch( expressão_ou_valor )
{
case Constante1:
<comandos1>
break;
case Constante2:
<comandos2>
break;
...
default:
<comandosN>
}
10
Estrutura de Repetição WHILE em
Java
while (condição) {
break;
continue;
10
Estrutura de Repetição DO-WHILE em
Java
do {
break;
continue;
} while (condição)
10
Estrutura de Repetição FOR em Java
break;
continue;
11
Exemplo de Coleção de
Objetos em Java
11
Lendo Coleção de Objetos em Java
com Estrutura de Repetição
11
Exercício 2
11
Exercício 2
(Utilize Estrutura de Repetição e Estrutura
Condicional)
Crie uma classe chamada Aluno contendo os seguintes atributos: matricula, nome,
notaAV1, notaAV2;
Crie um método construtor de objeto passando todos os atributos da classe como
parâmetro;
Crie 5 objetos contendo 5 alunos distintos e suas respectivas notas;
A média para aprovação da disciplina é 7;
Mostre em tela todos os alunos que foram aprovados;
Mostre em tela todos os aluno que foram reprovados;
Mostre em tela o melhor aluno da disciplina;
Mostre em tela o pior aluno da disciplina.
11
Tipos em Java
11
Tipos em Java
11
Tipo de Dados Primitivos em Java
boolean;
byte;
char;
short;
int;
long;
float;
double.
11
Classes que representam os Tipos de
Dados Primitivos em Java
String;
Boolean;
Character;
Byte;
Short;
Integer;
Long;
Float;
Double.
11
Classe como Tipo Complexo em Java
11
Tratamento de Erro em
Java
12
Tratamento de Erro em Java
try{
} catch(Nome_da_Classe_de_Erro){
} finally{
12
Exemplo de Tratamento de Erro em Java
12
Exemplo de Tratamento de Erro em Java
12
Exemplo de Tratamento de Erro em Java
12
Exemplo de Tratamento de Erro em Java
12
Exemplo de Tratamento de Erro em Java
12
Criação de Erro
Personalizado em Java
12
Criação de Erro Personalizado em Java
try{
} catch(Nome_da_Classe_de_Erro){
} finally{
12
Criação de Erro Personalizado em Java
12
Criação de Erro Personalizado em Java
13
Criação de Erro Personalizado em Java
13
Exercício 3
13
Exercício 3
(Utilize Classes Personalizadas de Erro)
Crie uma classe chamada ContaBancaria contendo os atributos privados:
nomeTitular, movimentacaoBancaria e dependentes;
Crie uma classe chamada Dependente contedo um atributo privado chamado
movimentacaoBancaria e um atributo privado chamado nomeDependente;
O atributo dependentes, da classe ContaBancaria, será uma lista de objetos do
tipo de classe Dependente;
Crie uma classe chamada MovimentacaoBancaria contendo uma atributo privado
chamado valorMovimentacao do tipo real e um atributo privado chamado
tipoMovimentacao do tipo caracter, podendo ser D (Débito) ou C (Crédito);
O atributo movimentacaoBancaria, das classes ContaBancaria e Dependente,
será uma lista de objetos do tipo de classe MovimentacaoBancaria;
13
Exercício 3
(Utilize Classes Personalizadas de Erro)
Crie um construtor, sem passagem de parâmetros, que instancie uma lista vazia de
objetos para o atributo movimentacaoBancaria e dependentes na classe
ContaBancaria;
Crie um construtor, sem passagem de parâmetros, que instancie uma lista vazia de
objetos para o atributo movimentacaoBancaria na classe Dependente;
Crie um método público na classe ContaBancaria chamado adicionarDependente,
passando o nome do dependente como parâmetro ao método;
Crie um método público na classe ContaBancaria chamado movimentarConta,
passando o valor e o tipo da movimentação bancária como parâmetros ao método;
Crie um método público na classe Dependente chamado movimentarConta, passando
o valor e o tipo da movimentação bancária como parâmetros ao método;
13
Exercício 3
(Utilize Classes Personalizadas de Erro)
O titular da conta bancária poderá realizar infinitas movimentações bancárias, tanto
operações de crédito como operações de débito, mas poderá ter no máximo três
dependentes em sua conta;
Os dependentes da conta bancária realizam apenas operações de débito e
poderão gastar no máximo 1200 reais cada um;
Crie um classe de exceção chamada LimiteDependentesException com sua
respectiva mensagem de erro;
Crie uma classe de exceção chamada TipoOperacaoException com sua
respectiva mensagem de erro;
Crie uma classe de exceção chamada LimiteMovimentacaoException com sua
respectiva mensagem de erro;
13
Exercício 3
(Utilize Classes Personalizadas de Erro)
Crie um método chamado getNomeTitular para retornar o nome do titular da conta
bancaria na classe ContaBancaria;
Crie um método chamado getNomeDependente para retornar o nome do
dependente da conta bancaria na classe Dependente;
Crie um método chamado getMovimentacaoBancaria para retornar uma lista de
objetos do tipo de classe MovimentacaoBancaria tanto na classe ContaBancaria
como na classe Dependente;
Crie um método chamado getDependentes para retornar uma lista de objetos do
tipo de classe Dependente na classe ContaBancaria;
Crie uma classe chamada Teste contendo apenas o método main para testar as
demais classe criadas;
13
Exercício 3
(Utilize Classes Personalizadas de Erro)
O método main da classe Teste deverá criar uma conta bancária para um cliente e
adicionar 3 dependentes para ele;
Realizar 4 movimentações para o titular da conta;
Para cada dependente deve ser realizada pelo menos 3 movimentações bancárias;
Fazer com que o método main exiba o titular da conta, seus dependentes e as
movimentações bancárias do titular e de cada dependente da conta bancária;
Testar a exceção criada para limite de dependentes por titular da conta;
Testar a exceção criada para limite de movimentação bancária por dependente;
Testar a exceção criada para tipo de operação bancária realizada por dependente.
13
Exercício 4
13
Exercício 4
13
Herança em Orientação a
Objeto (Reuso)
14
Herança em Orientação a Objeto
(Reuso)
O conceito de herança é uma das características que tornam a Orientação a Objetos
única;
Herança é um mecanismo que permite que características comuns a diversas classes
sejam centralizadas para serem reutilizadas a partir de uma classe base ou
superclasse;
Novas classes podem então ser criadas para herdarem ou reutilizarem as
características comuns encontradas em uma superclasse;
Cada classe derivada ou subclasse herda as características (atributos e métodos) da
superclasse, podendo também apresentar novas características (atributos e métodos)
em sua respectiva subclasse;
Uma classe que herda uma superclasse passa a ser também do mesmo tipo de sua
superclasse;
14
Exemplo de Herança
(Reuso)
14
Herança em Orientação a
Objeto com Java (Reuso)
14
Herança em Orientação a Objeto
(Reuso)
14
Herança em Orientação a Objeto
(Reuso)
14
Herança em Orientação a Objeto
(Reuso)
14
Herança em Orientação a Objeto
(Reuso)
14
Herança em Orientação a
Objeto (Visibilidade)
14
Herança em Orientação a Objeto
(Visibilidade)
A visilibilidade sobre os métodos e atributos de um objeto criado depende do
tipo da classe utilizada para criação do objeto e do tipo da classe do atributo
ou variável que receberá o objeto criado;
Como exemplo, pode-se citar um classe A que possui um atributo A e um método
A, e uma classe B que possui um método B e um atributo B;
Assuma então que a classe A herdará a classe B;
Um objeto instanciado da classe B conterá em memória apenas o atributo A e o
método A (ponteiro para o método A);
Um objeto instanciado da classe A conterá em memória os atributos A e B e os
métodos A e B (ponteiros para o método A e o método B);
14
Herança em Orientação a Objeto
(Visibilidade)
Caso o implementador crie um atributo ou variável do tipo Classe A para receber
um objeto criado (new) a partir da classe A, então o objeto que será criado em
memória conterá os métodos A e B e os atributos A e B, e o atributo ou variável que
receberá esse objeto conseguirá ter acesso tanto aos métodos A e B quanto aos
atributos A e B;
Caso o implementador crie um atributo ou variável do tipo Classe B para receber
um objeto criado (new) a partir da classe A, então embora o objeto criado em
memória contenha os métodos A e B e os atributos A e B, o atributo ou variável que
receberá esse objeto conseguirá ter acesso apenas ao método B e ao atributo B;
15
Herança em Orientação a Objeto
(Visibilidade)
Caso o implementador crie um atributo ou variável do tipo Classe A para receber
um objeto criado (new) a partir da classe B, o compilador gerará um erro, pois um
objeto criado a partir da Classe A poderá ser atribuido a um atributo ou variável do
tipo Classe A ou do Tipo classe B. No entanto, um objeto criado a partir da Classe B
poderá apenas ser atribuido a um atributo ou variável do tipo Classe B;
Isso acontece porque na herança não há apenas de métodos e atributos, há
também herança de tipo de classe;
Como a classe A herda a classe B, então a classe A é também do tipo classe B;
Como a classe B não herda nenhuma classe, então a classe B é apenas do tipo
classe B.
15
Herança em Orientação a Objeto
(Visibilidade)
15
Herança em Orientação a Objeto
(Visibilidade)
15
Herança em Orientação a Objeto
(Visibilidade)
15
Exercício 5
15
Exercício 5
Criar uma superclasse chama ProvaUniversidade contendo um construtor que
receba 2 notas: AV1 e AV2;
Criar um método na superclasse chamado calcularMedia que calculará a média
final do aluno na universidade;
Criar duas subclasses chamadas ProvaEstacio e ProvaUniJorge que herdarão a
superclasse ProvaUniversidade;
Criar um método em cada subclasse chamado aprovado que retorna um valor
booleano (true ou false) para informar se o aluno foi aprovado ou não na
universidade;
15
Exercício 5
15
Modelo do Exercício 5
15
Herança em Orientação a
Objeto (Abstração e
Polimorfismo)
15
Herança em Orientação a Objeto
(Abstração e Polimorfismo)
Existem geralmente dois tipos de métodos em orientação a objetos: métodos
concretos e métodos abstratos;
Os métodos concretos são aqueles que sempre apresentam a assinatura do
método com sua implementação;
Os métodos abstratos são aqueles que apresentam apenas a assinatura do
método sem a sua implementação;
Existem geralmente dois tipos de classes em orientação a objetos: classes
concretas e classes abstratas;
As classes concretas podem ser instanciadas e possuem apenas métodos
concretos em sua implementação;
16
Herança em Orientação a Objeto
(Abstração e Polimorfismo)
As classes abstratas não podem ser instanciadas e podem possuir tanto métodos
concretos quanto métodos abstratos em sua implementação;
Os métodos concretos e os métodos abstratos das classes também podem ser
classificados de duas formas: métodos virtuais ou métodos não virtuais;
As chamadas aos métodos virtuais são definidas em tempo de execução,
através de ligação dinâmica ou ligação tardia (late binding), enquanto as
chamadas aos métodos não virtuais ou métodos estáticos são definidas em
tempo de compilação, através de ligação estática;
Em Java, com exceção dos métodos estáticos, todos os métodos de uma classe
são considerados métodos virtuais;
16
Herança em Orientação a Objeto
(Abstração e Polimorfismo)
Os métodos virtuais permitem que a orientação a objeto apresente uma de suas
características mais importantes, chamada polimorfismo;
Através do polomorfismo as chamadas aos métodos virtuais são definidas através
de override (substituição ou sobrescrita) de métodos;
Os métodos concretos e os métodos abstratos das classes também podem se
apresentar mais de uma vez com a mesma assinatura do método, através de
overload (sobrecarga ou sobreposição) de métodos;
Uma classe abstrata que contém métodos abstratos, quando herdada por outra
classe abstrata, não será obrigada a implementar os métodos abstratos da classe
herdada;
16
Herança em Orientação a Objeto
(Abstração e Polimorfismo)
Uma classe abstrata que contém métodos abstratos, quando herdada por uma
classe concreta, será obrigada a implementar todos os métodos abstratos da
classe herdada;
Um dos objetivos da classe abstrata é o de permitir que as subclasses
concretas possam navegar entre os objetos através das classes abstratas;
Desta forma, evoluções futuras do software sofrerão menores impactos
durante modificações realizadas, principalmente durante modificações realizadas
em classes concretas;
Por isso, é importante navegar entre classe abstratas, evitando a navegação
entre classes concretas sempre que possível;
16
Exemplo de Superclasse
em Orientação a Objeto
com Java (Abstração e
Polimorfismo)
16
Exemplo de Classe Abstrata e
Método Abstrato em Java
public abstract class Conta {
this.saldo = saldo;
}
return saldo;
}
16
Exemplo de Classe Abstrata e
Método Abstrato em Java
public class ContaCorrente extends Conta {
16
Exemplo de Herança em
Orientação a Objeto em
Java (Abstração e
Polimorfismo)
16
Exemplo de Classe Abstração e
Polimorfismo em Java
16
16
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exemplo de Classe Abstração e
Polimorfismo em Java
17
Exercício 6
18
Exercício 6
Criar uma superclasse abstrata chamada ProvaUniversidade contendo um
construtor que receba uma nota AV1, uma nota AV2 e uma nota AV3; um peso para
a nota da AV1, um peso para a nota da AV2 e um peso para a nota da AV3; uma
média utilizada para aprovação das disciplinas na universidade; e um atributo do tipo
booleano para informar se o aluno realizou ou não a prova final;
Declarar todos os atributos da classe ProvaUniversidade como protegidos;
Criar um método público e abstrato na superclasse ProvaUniversidade
chamado getProvaFinalUniversidade que conterá apenas a assinatura do método;
Criar um método público e abstrato na superclasse ProvaUniversidade
chamado calcularMedia que conterá apenas a assinatura do método;
18
Exercício 6
Criar um método público e concreto na superclasse ProvaUniversidade chamado
aprovado que retorna um valor booleano (true ou false) para informar se o aluno foi
aprovado ou não na universidade;
Na Estácio o aluno será aprovado se possuir média ponderada igual ou superior a 6,
e na UniJorge o aluno será aprovado se possuir média ponderada superior ou igual a 7;
Criar duas subclasses concretas chamadas ProvaEstacio e ProvaUniJorge que
herdarão a superclasse ProvaUniversidade;
As classes ProvaEstacio e ProvaUniJorge conterão um construtor que utilizará a
cláusula super passando todos os parâmetros definidos no construtor da classe
ProvaUniversidade;
18
Exercício 6
Na Estácio todos os pesos das provas possuem valor 1, enquanto na UniJorge as
duas primeiras provas possuem peso de valor 1 e a prova final possui peso de valor 3;
Criar um método público e concreto nas subclasses ProvaEstacio e ProvaUnijorge
chamado calcularMedia que calculará a média final do aluno na universidade;
Caso o aluno esteja habilitado a realizar a prova final, a média será calculada envolvendo as
notas das 3 avaliações, caso contrário envolverá apenas as notas das duas primeiras
avaliações;
Criar um método público e concreto nas subclasses ProvaEstacio e ProvaUnijorge
chamado getProvaFinalUniversidade que retornará um objeto do tipo
ProvaFinalUniversidade;
18
Exercício 6
O método getProvaFinalUniversidade retornará um objeto criado a partir da classe
ProvaAV3Estacio na classe ProvaEstacio, e o método getProvaFinalUniversidade retornará
um objeto criado a partir da classe ProvaFinalUniJorge na classe ProvaUniJorge;
Criar uma superclasse abstrata chamada ProvaFinalUniversidade contendo um
construtor que receba a nota da prova final, o peso da prova final, o atributo informando
se o aluno realizou ou não a prova final, e um objeto do tipo da classe
ProvaUniversidade;
Criar um método protegido e abstrato na superclasse ProvaFinalUniversidade chamado
habilitadoRealizarProva que conterá apenas a assinatura do método;
Criar duas subclasses concretas chamadas ProvaAV3Estacio e ProvaFinalUniJorge que
herdarão a superclasse ProvaFinalUniversidade;
18
Exercício 6
Na Estácio, se o aluno estiver habilitado para realizar a prova final (AV3), a nota da
prova final (AV3) substituirá a menor nota entre AV1 e AV2 e será realizado o cálculo da
média ponderada entre duas maiores notas apenas;
18
Exercício 6
O aluno da Estácio estará habilitado para fazer a prova final (AV3) caso o valor da nota
da prova final (AV3) ainda permita o aluno a atingir a média da instituição, caso contrário
não poderá realizar a prova final (AV3). Caso o aluno já tenha atingido a média da
instituição, ele ainda poderá realizar a prova final para aumentar sua média final;
Na UniJorge, se o aluno estiver habilitado para realizar a prova final (AV3), a nota da
prova final (AV3) somar-se-á às notas da AV1 e da AV2 para o cálculo da média
ponderada;
O aluno da UniJorge estará habilitado para fazer a prova final caso o valor da nota da
prova final ainda permita o aluno a atingir a média da instituição. Caso o aluno já tenha
atingido a média da instituição, não poderá realizar a prova final;
Criar uma classe concreta chamada Teste que conterá apenas o método main para
testar as classes criadas anteriormente;
18
Exercício 6
Neste método deve-se criar um objeto do tipo ProvaEstacio e um objeto do tipo
ProvaUnijorge, e para cada objeto deve-se passar as notas da AV1, AV2 e AV3; os
pesos da AV1, da AV2 e da AV3, e a média de aprovação das disciplinas pela instituição;
Chamar o método aprovado para cada objeto criado e informar na tela se o aluno foi
aprovado ou não em cada instituição;
Chamar o método calcularMedia para cada objeto criado e informar a média do aluno;
Chamar o método aprovado para cada objeto criado e informar na tela se o aluno foi
aprovado ou não em cada instituição;
Chamar o método calcularMedia para cada objeto criado e informar a média do aluno;
Colocar a classe Teste num pacote (package) chamado universidade.prova.teste e
colocar as demais classes num pacote chamado universidade.prova;
18
Modelo do Exercício 6
18
Herança Múltipla em
Orientação a Objeto
18
Herança Múltipla em Orientação a
Objeto
C
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Herança Múltipla em Orientação a
Objeto
19
Exercício 7
19
Exercício 7
Criar uma classe concreta chamada LojaVirtual contendo três atributos privados:
produtos, vendas e carrinhoCompra; e cinco métodos públicos:
adicionarProduto, listarProdutos, adicionarVenda, calcularTotalVendas e
getCarrinhoCompra;
O atributo produtos é do tipo ArrayList<Produto>, o atributo vendas é do tipo
ArrayList<Venda> e o atributo carrinhoCompra é do tipo CarrinhoCompra;
O método adicionarProduto irá adicionar um produto ao atributo produtos;
O método listarProdutos irá listar todos os produtos existentes no atributo
produtos;
O método adicionarVenda irá adicionar uma venda ao atributo vendas;
20
Exercício 7
O método calcularTotalVendas irá somar e retornar a soma de todos os valores
das vendas através do atributo vendas;
O método getCarrinhoCompra irá criar e retornar um objeto do tipo
CarrinhoCompra, atribuindo o novo objeto ao atributo carrinhoCompra. Caso o
objeto já tenha sido criado, retornar apenas o atributo carrinhoCompra;
Criar uma classe concreta chamada CarrinhoCompra contendo três atributos
privados: produtos, venda e lojaVirtual; e quatro métodos públicos: adicionarItem,
listarItens, esvaziarCarrinho e getVenda;
O atributo produtos é do tipo ArrayList<ProdutoCarrinho>, o atributo venda é do
tipo Venda e o atributo lojaVirtual é do tipo LojaVirtual;
20
Exercício 7
A classe CarrinhoCompra ira conter um construtor que receberá um atributo do tipo
LojaVirtual e que será atribuido ao atributo lojaVirtual;
O método adicionarItem irá adicionar um item ao atributo produtos;
O método listarItens irá listar todos os itens existentes no atributo produtos;
O método EsvaziarCarrinho irá apagar todos os itens existentes no atributo produtos;
Existirão dois métodos getVenda na classe CarrinhoCompra que retornarão o mesmo
tipo de dados, porém um método irá receber o parâmetro qtdParcelas do tipo int,
enquanto o outro método não receberá nenhum parâmetro;
Os dois métodos getVenda irão criar e retornar um objeto do tipo Venda, atribuindo o
novo objeto ao atributo venda. Caso o objeto já tenha sido criado, retornar apenas o
atributo venda;
20
Exercício 7
Criar uma classe abstrata chamada Venda contendo três atributos protegidos:
produtosVendidos, estoque e lojaVirtual; dois métodos públicos e concretos:
listaritens e getEstoque; e um método público e abstrato: realizarVenda;
O atributo produtosVendidos é do tipo ArrayList<ProdutoVendido>, o atributo
estoque é do tipo Estoque e o atributo lojaVirtual é do tipo LojaVirtual;
A classe Venda irá conter um construtor que receberá um atributo do tipo
LojaVirtual que será atribuido ao atributo lojaVirtual, e um atributo do tipo
Arraylist<Produto> que será atribuido ao atributo produtosVendidos;
O método listarItens irá listar todos os itens existentes no atributo
produtosVendidos;
20
Exercício 7
O método getEstoque irá criar e retornar um objeto do tipo Estoque, atribuindo o
novo objeto ao atributo estoque. Caso o objeto já tenha sido criado, retornar apenas
o atributo estoque;
Criar uma classe concreta chamada VendaAVista que herdará a classe Venda e
que implementará o método realizarVenda;
A classe VendaAVista irá conter um construtor que receberá um atributo do tipo
LojaVirtual e um atributo do tipo Arraylist<Produto>, que serão passados à
superclasse através da sintaxe super;
O método realizarVenda da classe VendaAVista irá chamar o método
localizarItemProduto da classe Estoque para cada produto adicionado ao atributo
produtosVendidos da classe Venda;
20
Exercício 7
Caso cada produto seja localizado no estoque, deverá mostrar o valor total de cada
produto e chamar o método esvaziarCarrinho da Classe CarrinhoCompra;
Caso algum produto não seja localizado no estoque, deve-se disparar uma exceção
informando que a venda não poderá ser realizada por que há algum produto que não
existe no estoque;
Criar uma classe concreta chamada VendaAPrazo que herdará a classe Venda, que
conterá um atributo qtdParcelas do tipo int e que implementará o método realizarVenda;
A classe VendaAPrazo irá conter um construtor que receberá um atributo do tipo
LojaVirtual e um atributo do tipo Arraylist<Produto>, que serão passados à superclasse
através da sintaxe super, e um atributo que receberá a quantidade de parcelas do tipo
int que será armazenado no atributo qtdParcelas;
20
Exercício 7
Caso a quantidade de parcelas seja maior que 3, o valor de cada produto será
acrescido de 10% de juros;
O método realizarVenda da classe VendaAPrazo irá chamar o método
localizarItemProduto da classe Estoque para cada produto adicionado ao atributo
produtosVendidos da classe Venda;
Caso cada produto seja localizado no estoque, deverá mostrar o valor total de cada
produto e chamar o método esvaziarCarrinho da Classe CarrinhoCompra;
Criar uma classe abstrata chamada Produto contendo cinco atributos protegidos:
descricao, preco, desconto, qtdParaDesconto e qtdItensFazemParteProduto; dois
métodos públicos e concretos: getPreco e getDescricao; e três métodos públicos e
abstratos: getDesconto, getQtdParaDesconto, getQtdItensFazemParteProduto;
20
Exercício 7
A classe Produto irá conter um construtor que receberá cinco atributos como
parâmetro: descricao, preco, desconto, qtdParaDesconto e
qtdItensFazemParteProduto;
Os atributos preco e desconto são do tipo float, os atributos qtdParaDesconto e
qtdItensFazemParteProduto são do tipo int e o atributo descricao é do tipo string;
Os produtos são vendidos na loja virtual tanto em atacado quanto em varejo; os
produtos vendido em varejo são vendidos individualmente, enquanto os produtos
vendidos em atacado são vendidos através de caixas contendo vários itens de um
mesmo produto;
O atributo qtdParaDesconto define quantos produtos individuais ou quantas caixas
devem ser vendidas para se obter o desconto informado pelo atributo desconto;
20
Exercício 7
O atributo qtdItensFazemParteProduto define quantos itensfazem parte do
produto. Quando o produto é vendido individualmente, o valor é sempre 1, porém
quando o produto é vendido em caixa, este valor é sempre maior que 1;
Nesta loja virtual, quando um produto individual acaba, mas ainda existe em caixa,
o produto poderá ser retirado da caixa pra ser vendido individualmente, sendo que a
caixa não poderá ser mais vendida porque estará incompleta;
Criar duas classes concretas chamadas ProdutoItem e ProdutoCaixa que
herdarão a classe Produto e que implementarão os métodos: getDesconto,
getQtdParaDesconto e getQtdItensFazemParteProduto;
20
Exercício 7
As classes ProdutoItem e ProdutoCaixa irão conter um construtor que
receberão os atributos: descricao, preco, desconto, qtdParaDesconto e
qtdItensFazemParteProduto, que serão passados à superclasse através da sintaxe
super;
Criar duas classes concretas chamadas ProdutoCarrinho e ProdutoVendido que
conterão um construtor que receberá a quantidade do produto, do tipo int, e um
objeto do tipo Produto como parâmetros;
Criar um método público e concreto chamado getProduto e getQuantidade nas
classes ProdutoCarrinho e ProdutoVendido, que retornarão o atributo produto e o
atributo quantidade, respectivamente;
20
Exercício 7
Criar uma classe concreta chamada Estoque contendo um atributo privado
chamado produtosEstocados e três métodos públicos e concretos:
adicionarItemProduto, removerItemProduto e localizarItemProduto;
O atributo produtosEstocados é do tipo ArrayList<ProdutoEstocado>;
O método adicionarItemProduto irá adicionar um produto ao atributo
produtosEstocados;
O método adicionarItemProduto deverá ser utilizado para cadastrar itens
individuais de produtos e caixas contendo itens de produtos;
Quando for cadastrar os itens individuais no estoque deve-se informar o produto e
a quantidade destes itens individuais disponíveis;
21
Exercício 7
Quando for cadastrar as caixas no estoque, deve-se informar o produto que está
dentro da caixa e a quantidade de itens individuais deste produto disponíveis dentro
da caixa.
O método removerItemProduto irá remover um produto do atributo
produtosEstocados;
O método localizarItemProduto irá localizar um produto no atributo
produtosEstocados recebendo a descrição do produto como parâmetro e
retornando o objeto do tipo Produto, caso seja encontrado;
Se o produto localizado for do tipo caixa e a quantidade de itens dentro da caixa for
menor do que a quantidade de itens que fazem parte do produto especificado na
classe Produto, o método localizarItemProduto deverá retornar nulo;
21
Exercício 7
Criar uma classe chamada Teste contendo o método main() para realizar os
testes sobre o modelo de classes criado;
Instanciar um objeto do tipo LojaVirtual e adicionar produtos para serem vendidos
pela loja virtual;
Adicionar itens ao carrinho de compras oriundos dos objetos do tipo Produto
cadastrados na loja virtual;
Adicionar itens ao estoque oriundos dos objetos do tipo Produto cadastrados na
loja virtual;
Realizar algumas vendas a vista e a prazo através da classe Venda e verificar se o
retorno do método calcularTotalVendas na classe LojaVirtual está retornando o
valor total correto.
21
Modelo do Exercício 7
21