You are on page 1of 213

Plano de Ensino

1
Fundamentos sobre Orientação a
Objeto

Objetivo
 Programação Estruturada Versus OO

 O que ganho com isso?


Características

Fundamentos OO

Classe

Encapsulamento

Limitadores de Acesso
 Instância

 Tipos de Chamada a Métodos e Atributos


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

 A primeira liguagem de programação puramente orientada a objeto


conhecida chama-se Smalltalk;

Numa linguagem puramente orientada a objeto algumas caracteríticas
são importantes, como: tudo na linguagem é um objeto; não existem
atributos e métodos estáticos, tudo é dinâmico; todos os tipos de dados
também são do tipo objeto; nenhum atributo pode ser definido como público
em uma classe;
 Alguns estudiosos acreditam que ao ensinar programação OO, a
linguagem Smalltalk deveria ser escolhida para educar melhor o aluno
sobre OO;
31
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;

- É constantemente afetada por outras mudanças;


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.

Baixa Coesão Alta Coesão

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.

Sinónimo Geral: começar


Figura 1: Jesus e o sermão da montanha

FONTE: Dicionário Priberam da Língua Portuguesa

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.

FONTE: Michaelis - Moderno Dicionário da Língua Portuguesa

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

 Um dos principais resultados das fases de análise e projeto OO em engenharia de


software;

O uso de uma linguagem de modelagem, como o diagrama de classes UML,
permite expressar esse resultado de maneira organizada e padronizada;
 Uma classe é composta de propriedades (atributos) e comportamentos
(métodos);
 Uma classe pode ser concreta (pode ser instanciada) ou abstrata (não pode ser
instanciada);

O método de uma classe pode ser concreto (com implementação) ou abstrato
(sem implementação);

48
Classes em Orientação a Objeto

 Toda classe possui, geralmente, pelo menos um método construtor de objetos e


um método destruidor de objetos;

Os métodos de uma classe são geralmente virtuais, cujas chamadas são
definidas em tempo de execução;
 Os atributos de uma classe geralmente possuem 3 tipos de visibilidade: pública,
privada ou protegida.

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

Observação: Todo método é uma função na linguagem 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

 Toda classe possui pelo menos um método para construção de


objetos geralmente criado com uma palavra reservada denominada
constructor;

Toda classe possui pelo menos um método para destruição de
objetos geralmente criado com uma palavra reservada denominada
destructor;
 Algumas linguagens OO utilizam a palavra reservada virtual para
definir que o método da classe será chamada em tempo de execução.

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

 Um objeto é criado a partir de uma classe;


 Um objeto é a representação em memória dos atributos e métodos de
uma determinada classe em tempo de execução;

Sem a criação de um objeto não pode-se acessar seus atributos e
executar seus métodos;
 Quando um objeto Y é criado a partir de uma classe X, diz-se então
que o objeto Y é uma instância da classe X;

A palavra reservada em Java para criar objetos a partir de uma classe é
denominada new;

82
Exemplo de Criação de Objeto em
Java

83
Objetos em Java

84
Objetos em Java

 A palavra reservada new deve ser utilizada juntamente com o nome


da classe, e os atributos de um determinado método construtor criado na
classe devem ser passados como parâmetro nesta classe, caso existam;
 Caso não haja nenhum construtor criado na classe, utilizar então a
palavra reservada new com o nome classe sem passagem parâmetros para
ser instanciada;

Em orientação a objeto, os métodos geralmente são “armazenados” e
chamados dinâmicamente a partir de um objeto instanciado;

85
Objetos em Java

 Essa é uma das grandes diferenças entre a programação orientada a


objeto e as programações tradicionais, quando os métodos são
chamados de forma estática (com exceção de linguagens como javascript
que não é orientada a objeto, mas possui recursos para chamada dinâmica
de métodos, o que acaba tornando a utilização deste recurso bastante
confusa também).

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

 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;
 Mostre em tela todos os 5 alunos e seus respectivos atributos.

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 ) {

// ação se a condição for verdadeira

}else{

// ação se a condição for falsa

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) {

// ação se a condição for verdadeira

break;

continue;

10
Estrutura de Repetição DO-WHILE em
Java
do {

// a ação é sempre executada na primeira vez

// se a condição for verdadeira então executa a ação novamente

break;

continue;

} while (condição)

10
Estrutura de Repetição FOR em Java

for (inicializador_variavel; condição; incremento_variavel) {

// ação se a condição for verdadeira

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

 Tipo de dados primitivos;


 Classes que representam os tipos de dados primitivos;

Outras classes que representam tipos complexos (atributos e métodos);

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

 Outras classes da biblioteca do próprio fabricante;



Classes de terceiros;

Classes criadas pelo próprio usuário implementador.

11
Tratamento de Erro em
Java

12
Tratamento de Erro em Java

try{

// código que pode disparar um erro

} catch(Nome_da_Classe_de_Erro){

// código para tratar o erro

} finally{

// código para finalizar o bloco

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{

// código que pode disparar um erro

} catch(Nome_da_Classe_de_Erro){

throw new NomeClasseErroPersonalizada();

} finally{

// código para finalizar o bloco

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

Faça um programa que contenha uma classe que representa um funcionário,


registrando seu nome, salário, departamento e data de admissão. Crie por último
uma classe que representa uma empresa, registrando seu nome e CNPJ. Em todas
as classes defina os atributos como privados, e faça um programa que:
 Crie uma empresa;

Adicione a empresa alguns funcionários (solicitar no início quantos);

Dê aumento de 10% a todos os funcionários que possuem mais de dois anos na
empresa;

Mostrar os dados de todos os funcionários antes e depois do aumento.

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

 Na Estácio o aluno será aprovado se possuir média aritmética igual ou superior a 6, e


na UniJorge o aluno será aprovado se possuir média aritmética superior ou igual a 7;

Dentro do método aprovado de cada subclasse deverá ser chamado o método da
superclasse chamado calcularMedia, para calcular a média do aluno e retornar se o
aluno foi aprovado ou não;

Criar uma classe chamada Teste que conterá apenas o método main para testar as
classes criadas anteriormente;

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 e da AV2 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.

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 {

private double saldo;

public void setSaldo(double saldo) {

this.saldo = saldo;
}

public double getSaldo() {

return saldo;
}

public abstract void imprimeExtrato();


}

16
Exemplo de Classe Abstrata e
Método Abstrato em Java
public class ContaCorrente extends Conta {

public void imprimeExtrato(){

System.out.println(“Imprime extrato de conta corrente”);


}
}

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

 As classes ProvaAV3Estacio e ProvaFinalUniJorge conterão um construtor que


utilizará a cláusula super passando os parâmetros: nota da prova final, peso da prova
final, o atributo se realizou a prova final, e um objeto do tipo da classe
ProvaUniversidade;

Criar um método público e concreto nas subclasses ProvaAV3Estacio e
ProvaFinalUniJorge chamado habilitadoRealizarProva que informará se o aluno está ou não
habilitado para realizar a prova final (AV3);

 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

You might also like