2 - Introdução À Programação OO em Java
2 - Introdução À Programação OO em Java
OO em Java
Prof. Sérgio Assunção Monteiro
Apresentação
Propósito
Preparação
Objetivos
Módulo 1
Classes e objetos
Módulo 2
Herança e polimorfismo
Agrupamento de objetos
Módulo 4
Ambientes de desenvolvimento
meeting_room
Introdução
A programação orientada a objetos (POO) é um paradigma que
surgiu em resposta à crise do software. A POO buscou resolver
diversos problemas existentes no paradigma de programação
estruturada, como a manutenibilidade e o reaproveitamento de
código. Essas deficiências tiveram papel central na crise, pois
causavam o encarecimento do desenvolvimento e tornavam a
evolução do software um desafio.
JAVA
content_copy
Em Java, cada classe pública deve estar em um arquivo com o mesmo
nome da classe e extensão “java”. Logo, a classe do código superior
deve ser salva em um arquivo de nome “Aluno.java”.
Dica
O site jdoodle possui um compilador java online, onde você pode copiar
e executar os códigos.
looks_one
Normal
looks_two
Enum
A partir disso, vamos nos deter apenas à forma normal.
JAVA
content_copy
JAVA
content_copy
Observamos nessa declaração a presença dos símbolos reservados (e
obrigatórios) e a existência do Identificador (ClasseSimples).
JAVA
content_copy
Considerando que:
Annotation expand_more
Static expand_more
Composição de modificadores
Podemos combinar alguns desses modificadores com outros. Por
exemplo, podemos definir uma classe da seguinte forma:
JAVA
content_copy
JAVA
content_copy
Esse exemplo código é apenas conceitual. A ideia é nos acostumarmos
com o Java e obtermos o melhor do potencial que ele pode nos
oferecer.
Atividade 1
B Class Aluno{}
looks_one
Declaramos um objeto como sendo do tipo de uma classe.
looks_two
Na sequência, instanciamos o objeto e passamos a utilizá-lo.
JAVA
content_copy
Podemos, ainda, reescrever esse código da seguinte maneira:
JAVA
content_copy
JAVA
content_copy
Devemos notar que o método construtor e classe possuem o mesmo
nome. Além disso, passamos dois parâmetros para o construtor para
estabelecer o comportamento inicial do objeto que vai instanciá-la.
Outro ponto que precisamos observar é o escopo das variáveis dentro
de uma classe. Por exemplo, vamos supor que tirássemos o trecho do
seguinte código.
JAVA
content_copy
JAVA
content_copy
O que ocorreria nesse caso?
Estados de um objeto
O estado de um objeto é definido pelos seus atributos, enquanto seu
comportamento é determinado pelos seus métodos. Por exemplo,
vamos considerar a seguinte instanciação a partir da classe do código
anterior:
JAVA
content_copy
Após a execução do código, teremos um objeto criado e armazenado
em memória identificado por “novoAluno”. O estado desse objeto é
definido pelas variáveis “nome, idade, codigo e aleatorio”, e seu
comportamento é dado pelos métodos “public Aluno (String nome, int
idade), public void definirNome (String nome) e public void definirIdade
(int idade)”.
Atenção!
Atividade 2
A linguagem de programação Java possui muitas particularidades
sobre o ciclo de vida de um objeto. A ideia é reduzir as
possibilidades de um programa causar riscos de segurança para o
sistema, mas, na prática, essa forma de trabalhar impõe limites
sobre o que o programador pode atuar no ciclo de vida dos objetos.
Nesse sentido, sobre objetos em Java, selecione a opção correta:
Classes e o encapsulamento de
código
Do ponto de vista da POO, o encapsulamento visa ocultar do mundo
exterior os atributos e o funcionamento da classe.
looks_one
“private”
looks_two
“protected”
looks_3
“public”
Quando tratarmos sobre as propriedades de herança e polimorfismo,
vamos nos aprofundar mais sobre o uso desses modificadores. Por
enquanto, deve ficar claro para nós que “private” indica que o método ou
atributo só pode ser acessado internamente à classe, enquanto “public”
define que ambos são visíveis para todo o exterior.
Roteiro de prática
Passo 1
Abstração expand_more
Passo 2
Agora, implemente o exemplo de código em Java que usa o
encapsulamento:
JAVA
content_copy
Passo 3
looks_one
O modificador “private” usado no método “setNome”, o qual indica que
ele só pode ser usado por métodos dentro da própria classe.
looks_two
O modificador “public” usado nos métodos “getNome” e
“getCodigoIdentificador”, os quais indicam que podem ser chamados
por objetos que instanciam a classe.
Chave de respostaexpand_more
JAVA
content_copy
O restante do código deve ficar inalterado.
Associação
Agregação
Composição
JAVA
content_copy
Passo 2
Chave de respostaexpand_more
JAVA
content_copy
Cujo resultado da execução será:
rua X, 7
Passo 1
JAVA
content_copy
Passo 2
JAVA
content_copy
Passo 3
Execute o programa e veja se o resultado da execução desse código é:
JAVA
content_copy
JAVA
content_copy
Que significa que “a1” e “a2” são referências para os objetos criados, ou
seja, não é um caso de atribuição. Por isso que, ao modificarmos o
estado do objeto “a2”, também afetamos o estado do objeto “a1”.
a2 = a1;
Por
a1 = a2;
Chave de respostaexpand_more
Fim da Execução
2 - Herança e polimorfismo
Ao final deste módulo, você será capaz de descrever o mecanismo de herança e
polimorfismo em Java.
Herança: aspectos elementares
O termo herança em OO define um tipo de relação entre objetos e
classes, baseado em uma hierarquia. Dentro dessa relação hierárquica,
classes podem herdar características de outras classes situadas acima
ou transmitir suas características às classes subsequentes.
Na figura acima, vemos que "Empregado" é pai (superclasse) das classes "Professor", "Diretor",
"Coordenador" e "Secretario". Essas últimas são filhas (subclasses) da classe "Empregado".
Atenção!
JAVA
content_copy
looks_one
A classe “Professor” deve declarar “Empregado” como sua superclasse.
looks_two
O “Empregado” deve declarar “Pessoa” como sua superclasse.
Herança de interfaces
A sintaxe é análoga para o caso das interfaces, exceto que pode haver
mais de um identificador de superinterface. O código consecutivo
mostra um exemplo baseado no diagrama anterior, considerando que
“ProfessorComissionado”, “Professor” e “Diretor” sejam interfaces.
JAVA
content_copy
Resumindo
Atividade 1
Mecanismos de visibilidade
Inicialmente, precisamos compreender como os modificadores de
acesso operam. Já vimos que esses modificadores alteram a
acessibilidade de classes, métodos e atributos. Existem quatro níveis de
acesso em Java. Vamos conhecê-los!
keyboard_arrow_down Default
keyboard_arrow_down Privado
keyboard_arrow_down Protegido
adjust Público
Éd l d l d difi d “ bli ” Nã
É declarado pelo uso do modificador “public”. Não
há restrição de visibilidade.
looks_one
Permite organizar as classes pelas suas afinidades conceituais.
looks_two
Previne conflito de nomes.
Pacotes em Java
Em Java, um pacote é definido pela instrução “package” seguida do
nome do pacote inserida no arquivo de código-fonte. Todos os arquivos
que contiverem essa instrução terão suas classes agrupadas no pacote.
Isso significa que todas essas classes, isto é, classes do mesmo pacote,
terão acesso aos elementos que tiverem o modificador de
acessibilidade "default".
Subclasse
do
sim sim não sim
mesmo
pacote
default public private protected
Subclasse
de pacote não sim não sim
diferente
Classe
(não
derivada)
sim sim não sim
do
mesmo
pacote
Classe
(não
derivada) não sim não não
de pacote
diferente
looks_one
Métodos (e atributos) declarados públicos na superclasse devem ser
públicos nas subclasses.
looks_two
Métodos (e atributos) declarados protegidos na superclasse devem ser
protegidos ou públicos nas subclasses. Eles não podem ser privados.
Atividade 2
Roteiro de prática
O nosso objetivo aqui é implementar o modelo representado a seguir:
Diagrama de classes parcial de um sistema.
JAVA
content_copy
Também podemos observar que o código da classe “Pessoa” possui um
construtor não vazio. Assim, os construtores das classes derivadas
precisam passar para a superclasse os parâmetros exigidos na
assinatura do construtor. Isso é feito pela instrução “super”.
JAVA
content_copy
Devemos observar o uso da palavra-chave “super” no construtor da
classe “Pessoa” que significa que a classe Pessoa faz uso do construtor
da classe Aluno.
JAVA
content_copy
Semelhante à classe “Aluno”, devemos observar que o construtor da
classe “Empregado” utiliza o “super” e que, além disso, ela estabelece os
valores dos atributos “matrícula” e “data_admissao”.
JAVA
content_copy
Como observações finais, é importante estarmos atentos aos seguintes
itens:
Passo 5
Chave de respostaexpand_more
JAVA
content_copy
Basicamente, incluímos dois atributos na classe Principal –
no caso, aluno2 e endereco2 – e repetimos as chamadas
para os parâmetros dos métodos dos atributos com os
respectivos dados informados na questão. De fato,
poderíamos ter feito essa implementação de forma mais
eficiente, mas, por enquanto, obtivemos o resultado que
pretendíamos e isso está nos ajudando a entender melhor
como programar com o Java.
Polimorfismo
O polimorfismo é a propriedade de um mesmo método se comportar de
formas distintas para assinaturas de métodos diferentes. Ele pode se
expressar de diversas maneiras. A sobrecarga de função, assim como a
herança, é uma forma de dar ao objeto uma capacidade polimórfica. No
caso da herança, o polimorfismo surge justamente porque um objeto
pode se comportar também como definido na superclasse. Por exemplo,
vamos considerar um objeto do tipo “Aluno”.
Comentário
Como vimos, todo objeto do tipo “Aluno” é do tipo “Pessoa”. Logo, ele
pode se comportar como “Aluno” ou como “Pessoa”.
Roteiro de prática
Passo 1
JAVA
content_copy
Passo 2
Implemente a modificação na classe “Principal”, cujo código é dado por:
JAVA
content_copy
Passo 3
Passo 4
JAVA
content_copy
Nesse caso, a classe está preparada para tratar a chamada do método
“alterarMatricula” de duas formas. Veja!
JAVA
content_copy
Por outro lado, caso seja feita uma chamada como “alterarMatricula
(“M-202100-1000)”, o método chamado será:
JAVA
content_copy
A diferença entre qual dos dois métodos será chamado está na
passagem ou não do parâmetro.
Chave de respostaexpand_more
Agora, apresentamos uma solução para este problema.
JAVA
content_copy
Classes abstratas
Uma classe abstrata é uma classe que não pode ser instanciada
diretamente, mas serve como base para outras subclasses. Isso
significa que ela pode ter atributos e métodos que podem ser herdados
e estendidos por outras classes.
Roteiro de prática
Passo 1
JAVA
content_copy
Passo 2
Latir!
Zzzz...
Miar!
Zzzz...
Encapsulamento
Herança
Polimorfismo
Classe abstrata
Chave de respostaexpand_more
JAVA
content_copy
No qual a saída é:
Latir!
Zzzz...
Miar!
Zzzz...
Rugir!
É um animal Selvagem.
Zzzz...
3 - Agrupamento de objetos
Ao final deste módulo, você será capaz de descrever os mecanismos de
agrupamento de objetos em Java.
Agrupamento de objetos em
Java
O propósito do agrupamento é permitir que, a partir de um universo de
objetos, grupos de objetos afins sejam estabelecidos com base em
determinado critério. Esse é um dos motivos para o agrupamento nos
interessar: a interação com conjuntos de dados.
Neste vídeo, aprenderemos os fundamentos do agrupamento de objetos
em Java, abordando conceitos e práticas. Isso será útil para manipular
grandes conjuntos de dados no dia a dia do desenvolvedor Java.
F(U) = { [k1 , <lista agrupada>], [k2 , <lista agrupada>] , ..., [kn , <lista
agrupada>] }
JAVA
content_copy
Para executar o agrupamento, vamos implementar a classe “Escola”,
conforme este código:
JAVA
content_copy
Por fim, implementamos a classe “Principal” que é responsável pelo
gerenciamento do nosso sistema:
JAVA
content_copy
A I.
B II.
C
III.
D I e II.
E II e III.
Atenção!
Roteiro de prática
Passo 1: Uso da assinatura 1
JAVA
content_copy
Passo 2
JAVA
content_copy
JAVA
content_copy
A diferença sintática para a segunda assinatura é apenas a existência de
um terceiro parâmetro no método “groupingBy”: “TreeMap::new”. Esse
parâmetro vai instruir o uso do mecanismo “TreeMap” na instanciação
de “Map” (“agrupamento”).
Passo 5
Gomes(São Paulo)]
JAVA
content_copy
Nós queremos que o programa exiba o seguinte resultado:
Chave de respostaexpand_more
JAVA
content_copy
Ou seja, trocamos a expressão “???” por “x -> x * x” que
significa que a função recebe um valor e calcula o quadrado
dele.
Coleções em Java
Coleções, por vezes chamadas de containers, são objetos capazes de
agrupar múltiplos elementos em uma única unidade. Elas têm por
finalidade armazenar, manipular e comunicar dados agregados, de
acordo com o Oracle America Inc. (2021). Por causa da importância
dessas funcionalidades, vamos estudá-las sob o ponto de vista teórico e
prático.
Ainda de acordo com a Oracle America Inc. (2021), a API Java provê
uma interface de coleções chamada Collection Interface, que encapsula
diferentes tipos de coleção: “Set”, “List”, “Queue” e “Deque”. Há, ainda, as
coleções “SortedSet” e “SortedMap” que são, essencialmente, versões
ordenadas de “Set” e “Map”, respectivamente.
List expand_more
Queue expand_more
JAVA
content_copy
Colocamos comentários sobre as funcionalidades. Ao executar o
código, obtemos o seguinte resultado:
lista[0]= 10
lista[1]= 20
lista[2]= 30
lista[3]= 40
lista[4]= 50
lista[0]= 57
lista[1]= 30
lista[2]= 40
lista[3]= 50
Limpar o ArrayList.
Atividade 2
Comentário
Talvez um dos pontos mais interessantes seja a questão da
portabilidade. O C++ buscou alcançá-la por meio da padronização.
(STROUSTRUP, 2020)
Alguns aspectos de C
A comparação entre Java e a linguagem C é mais difícil do que a
comparação entre Java e C++. A linguagem C é conhecida por ter como
ponto forte sua interação com sistemas de baixo nível, sendo
amplamente utilizada em drivers de dispositivo. A diferença entre Java e
C é maior do que entre Java e C++. Vamos conferi-las!
CPP
content_copy
Realmente, podemos notar semelhanças com um código em Java, mas
a linguagem C++ ainda apresenta algumas características inseguras,
como o acesso à memória. No entanto, ela continua sendo amplamente
utilizada em aplicações que requerem alto desempenho, como no
desenvolvimento de jogos.
Atividade 1
PORQUE
Um interpretador Java
(java)
Um compilador (javac)
Um programa de
arquivamento (jar)
Um gerador de
documentação (javadoc)
Curiosidade
IDE Netbeans.
Atividade 2
JAVA
content_copy
Normalmente, é no corpo da função “main” que fazemos a instanciação
de classes, ou seja, criamos objetos.
Métodos de acesso
Não são comandos Java nem uma propriedade da linguagem, e sim
consequências do encapsulamento. Eles apareceram em alguns
códigos mostrados aqui. Os métodos de acesso são as mensagens
trocadas entre objetos para alterar seu estado. Eles, assim como os
demais métodos e atributos, estão sujeitos aos modificadores de
acesso.
looks_one
Um para obter seu valor (“get”).
looks_two
Outro para inseri-lo (“set”).
JAVA
content_copy
Comando switch
Um comando bastante útil no Java também é o “switch”, onde a sintaxe
é a seguinte:
JAVA
content_copy
No caso do comando “switch”, a expressão pode ser, por exemplo, uma
“String”, “byte”, “int”, “char” ou “short”. O valor da expressão será
comparado com os valores em cada cláusula “case” até que um
casamento seja encontrado. Então, o “bloco” correspondente ao “case”
coincidente é executado. Se nenhum valor coincidir com a expressão, é
executado o bloco da cláusula “default”.
JAVA
content_copy
Principalmente, em situações que precisamos fazer escolha entre
muitas alternativas, o comando “switch” é uma opção muita prática.
Atividade 3
Comandos iterativos
Outro grupo de comandos importantes da linguagem Java são as
estruturas de repetição. As três estruturas providas pela Java são
“while”, “do-while” e o laço “for”. Neste estudo, vamos analisar a sintaxe
e alguns exemplos práticos de como utilizá-las. O comando “break”,
visto na estrutura switch anteriormente, interrompe o laço/estrutura de
controle atual, como o “while”, “for”, “do ... while”.
Comando while
Semelhante a outras linguagens de programação, o Java possui o
comando iterativo “while”, cuja estrutura tem a seguinte sintaxe:
JAVA
content_copy
JAVA
content_copy
Para obter esse resultado, ele utiliza o valor da variável “controle” para
verificar se a condição de teste é válida. Caso seja, ele exibe o valor da
variável e, na sequência, incrementa.
JAVA
content_copy
Como vemos pela sintaxe, o primeiro “bloco” é executado e, apenas
depois disso, a expressão é avaliada. A repetição continua até que a
expressão seja falsa. A seguir, veremos um exemplo do comando “do-
while”:
JAVA
content_copy
Comando for
A última estrutura de repetição que veremos é o laço “for”, que possui a
seguinte sintaxe:
JAVA
content_copy
O parâmetro “inicialização” determina a condição inicial e é executado
assim que o laço se inicia. A “expressão” é avaliada em seguida. Se for
verdadeira, a repetição ocorre até que se torne falsa. Caso seja falsa no
início, o “bloco” não é executado nenhuma vez e a execução do
programa saltará para a próxima linha após o laço. O último item,
“iteração”, é executado após a execução do “bloco”. No caso de uma
“expressão” falsa, o item “iteração” não é executado. Veja um exemplo
do uso do comando “for”:
JAVA
content_copy
Por fim, observamos que, quando o “bloco” for formado por apenas uma
instrução, o uso das chaves ( “{ }” ) é opcional.
Atividade 4
Explore +
JAVA SE: Chapter 2 − The Structure of the Java Virtual Machine. Oracle
America Inc, 2015. Consultado na internet em: 26 maio 2023.
Download material
Relatar problema