SlideShare uma empresa Scribd logo
Título da disciplina
Programação
orientada a objetos
em java
A aula começa em breve...
Introdução à
programação oo em
java
Vamos começar!
Classes e sua realização em Java
Em POO, uma classe define a estrutura e comportamento
dos objetos.
A classe especifica dados, métodos e mecanismo de
instanciação.
Os dados e métodos estabelecem o contrato entre o
desenvolvedor e o usuário da classe.
Classes públicas em Java devem estar em arquivos com o
mesmo nome da classe, com extensão "java".
Vamos começar!
Classes e sua realização em Java
O Código 1 mostra um exemplo de definição
de uma classe em Java.
Vamos começar!
Classes e sua realização em Java
A classe "Aluno" do Código 1 em Java possui um atributo "Nome" do tipo "String" e dois métodos:
"inserirNome" e "recuperarNome.“
As palavras reservadas "private" e "public" modificam a visibilidade dos métodos e atributos.
A declaração normal de classes em Java permite definir classes com diversos atributos e métodos,
oferecendo maior flexibilidade e capacidade de modelagem.
Vamos começar!
Classes e sua realização em Java
Forma normal:
[Modificador] class Identificador [TipoParâmetros] [Superclasse] [Superinterface] { [Corpo da Classe] }
Vamos começar!
Classes e sua realização em Java
A sintaxe de
declaração de
classes em Java
inclui elementos
opcionais em
colchetes.
Os símbolos não
entre colchetes são
obrigatórios, como
o "Identificador.“
A forma mais
simples possível de
se declarar uma
classe em Java é:
class Inutil { }.
Mesmo uma classe
vazia como "class
Inutil { }" é válida na
linguagem Java.
Vamos começar!
Classes e sua realização em Java
Os modificadores em Java podem incluir palavras como:
Annotation
Não é propriamente um elemento, mas sim uma definição. Sua semântica implementa o
conceito de anotações em Java e pode ser substituída por uma anotação padrão ou criada pelo
programador.
Public, Protected e Private
São os símbolos que veremos quando falarmos de encapsulamento; são modificadores de acesso.
Vamos começar!
Classes e sua realização em Java
Static
Este modificador afeta o ciclo de vida da instância da classe e só pode ser usado em classes
membro.
Abstract e Final
Já os modificadores abstract e final relacionam-se com a hierarquia de classes. Todos esses
modificadores serão vistos oportunamente.
Strictfp
Modificador que torna a implementação de cálculos de ponto flutuando independentes da
plataforma. Sem o uso desse modificador, as operações se tornam dependentes da plataforma
sobre a qual a máquina virtual é executada.
Vamos começar!
Classes e sua realização em Java
Modificadores podem ser
combinados; por exemplo, "public
abstract class.“
"TipoParâmetros" pertencem à
programação genérica e não serão
abordados.
Elementos opcionais incluem
"Superclasse" e "Superinterface"
para herança e implementação de
interfaces.
"Superclasse" usa "extends
IdentificadorClasse," enquanto
"Superinterface" usa "implements
IdentificadorInterface."
Vamos começar!
Classes e sua realização em Java
A sintaxe do elemento "Superinterface" é "implements IdentificadorInterface". A palavra reservada
"implements" indica que a classe implementa a interface "IdentificadorInterface". Exemplo:
Vamos começar!
Objetos: os produtos das classes
Classes servem
como modelos
para objetos.
Classes abstratas
não permitem
instância direta e
fornecem modelos
de comportamento
comum.
As classes que
permitem instâncias
são usadas para
criar objetos.
A instanciação de
uma classe abstrata
gera erros de
compilação.
Vamos começar!
Objetos: os produtos das classes
Instanciar uma classe significa criar um objeto a partir do modelo da classe. Envolve a declaração de uma
variável do tipo da classe e a criação do objeto com o nome da variável.
Primeiramente, uma variável é
declarada como sendo do tipo de
alguma classe.
A seguir, o compilador é instruído a
gerar um objeto a partir daquela
classe, que será rotulado com o
identificador que nomeia a
variável.
Vamos começar!
Objetos: os produtos das classes
A criação de objetos
inicia com alocação de
memória e execução
do código de
construção.
O código de
construção está no
método construtor da
classe, com mesmo
nome e sem tipo de
retorno.
O construtor é
automaticamente
chamado durante a
instanciação do
objeto.
A instrução "new"
seguida do construtor
cria o objeto e
inicializa a variável
com uma referência
para ele.
Vamos começar!
Objetos: os produtos das classes
Revendo a instanciação, identificamos que ela pode ser decomposta da seguinte forma:
Vamos começar!
Objetos: os produtos das classes
 O construtor contém o código a ser executado na criação do
objeto.
 Se o código for computacionalmente custoso, a criação do
objeto será afetada em termos de desempenho.
 Portanto, é importante otimizar o construtor para evitar
impactos negativos na instanciação do objeto.
Vamos começar!
Objetos: os produtos das classes
A clonagem de objetos cria cópias idênticas usando diferentes espaços de memória.
Cada objeto clonado tem um identificador único, mas seus atributos têm o mesmo conteúdo.
A clonagem é mais rápida do que a instanciação usando "new", que executa todos os procedimentos de
construção.
A clonagem é vantajosa quando se precisa criar muitos objetos do mesmo tipo.
O estado de um objeto é definido por seus atributos, enquanto seu comportamento é determinado por seus
métodos.
Vamos começar!
Objetos: os produtos das classes
Os objetos em Java têm estado
(atributos) e comportamento
(métodos).
A destruição de objetos na Java é
tratada pelo coletor de lixo (garbage
collector) de forma automática.
O programador não tem controle
direto sobre a destruição de objetos
em Java.
Não há um "destrutor" em Java, e a
coleta de lixo é solicitada pelo
método "gc()", mas sua execução
não é garantida imediatamente.
Classes e o encapsulamento de código
O encapsulamento na
POO esconde detalhes
internos da classe,
expondo apenas
métodos públicos.
Isso cria um contrato
entre a classe e o
código externo.
A visibilidade
("private,"
"protected," "public")
define quem pode
acessar atributos e
métodos.
"Private" restringe o
acesso à classe,
"public" permite
acesso externo.
Trabalhando com classes e objetos
Classes e objetos são produtos da
análise orientada a objetos e
interagem para formar sistemas.
Estabelecemos contratos (interfaces)
para permitir que outras classes ou
objetos interajam com uma classe ou
objeto derivado.
Exemplo disso é a invocação do
método "nextDouble()" da classe
"Random" no código, seguindo o
contrato da classe para consumir um
serviço.
No código, a classe "Aluno" possui
um atributo do tipo "Random,"
mostrando que um objeto "Aluno"
contém um objeto "Random."
Trabalhando com classes e objetos
O parágrafo anterior nos mostra uma relação entre objetos. Em OO há diferentes tipos de relações.
Associação
Associação na programação
orientada a objetos é uma
relação fraca onde objetos
consomem serviços de outros,
independente de
propriedade. Pode ter várias
cardinalidades.
Agregação
A Agregação é um
relacionamento onde um
objeto pai contém objetos
filhos, com cada um tendo seu
ciclo de vida independente.
Composição
Composição é uma relação
onde um objeto filho depende
do objeto pai; se o pai é
destruído, o filho também é
destruído.
Trabalhando com classes e objetos
Associação, Agregação e Composição são conceitos inter-relacionados na POO.
Herança
Herança: Aspectos elementares
Herança na POO é
uma relação
hierárquica entre
classes.
Superclasses (classe
base) têm
características
compartilhadas e as
propagam para
subclasses (classe
derivada).
Isso evita repetição
de código e
simplifica a
manutenção, pois
alterações na classe
pai são refletidas
nas subclasses.
Um exemplo é a
hierarquia de
herança com
"Empregado" como
superclasse e várias
subclasses.
Herança
Herança: Aspectos elementares
A imagem a seguir apresenta um diagrama UML que modela uma hierarquia de herança. Nela, vemos que
“Empregado” é pai (superclasse) das classes “Professor”, “Diretor”, “Coordenador” e “Secretario”. Essas
últimas são filhas (subclasses) da classe “Empregado”.
Herança
E quando há mais de uma superclasse?
 Herança múltipla é quando uma classe herda características de mais
de uma superclasse, mas Java não suporta herança múltipla de
classes.
 Java permite que uma classe implemente múltiplas interfaces, e
uma interface pode herdar de mais de uma interface pai.
 A genealogia das classes segue de generalização (classes mais gerais)
para especialização (classes mais específicas).
 A sintaxe para declarar uma superclasse já foi apresentada
anteriormente.
Herança
Herança e visibilidade
A classe "Pessoa" é
uma generalização
da classe
"Empregado,"
reunindo atributos e
comportamento que
podem ser aplicados
a outras subclasses.
Subclasses podem
especializar esse
comportamento,
sobrescrevendo
métodos da
superclasse.
Isso permite manter
a assinatura do
método, alterando
apenas o código que
o implementa.
Esse mecanismo é
fundamental para
compreender o
polimorfismo.
Herança
Herança e visibilidade
Existem quatro níveis de acesso em Java:
Default Privado
Protegido Público
Herança
Herança e visibilidade
Modificadores de
acessibilidade
controlam visibilidade
(public, protected,
default, private).
Pacotes organizam
classes por afinidade e
evitam conflitos de
nomes.
"Private" é o mais
restritivo, limitando o
acesso à própria
classe.
"Public" é o menos
restritivo, permitindo
acesso global a
entidades públicas.
Herança
Herança e visibilidade
As restrições dos modificadores de acessibilidade na herança são:
 Métodos (e atributos) públicos na superclasse devem ser públicos nas
subclasses.
 Métodos (e atributos) protegidos na superclasse devem ser protegidos
ou públicos nas subclasses; não podem ser privados.
 Métodos e atributos privados não são acessíveis às subclasses, e sua
acessibilidade não é afetada pela herança.
Herança
Herança e visibilidade
Diagrama de classes parcial de um sistema.
Polimorfismo
Polimorfismo em OO permite que
objetos tenham comportamentos
diferentes.
Pode ser expresso por sobrecarga de
função e herança.
Todo objeto em Java é polimórfico,
graças à herança indireta da classe
"Object".
Facilita a extensibilidade do software
ao permitir a adição de novas classes
derivadas de superclasses com
impacto mínimo.
Agrupamento de objetos em Java
 Agrupamento de objetos em Java é usado para organizar objetos com
base em critérios.
 Não é um conceito de OO, mas é comum em interações com bancos de
dados, semelhante à cláusula "GROUP BY" do SQL.
 A implementação requer atenção a detalhes como referências nulas
(NullPointerException) e estruturas de dados adequadas.
 A partir da Java 8, a API Java oferece um mecanismo simplificado para
agrupar objetos.
Agrupamento de objetos em Java
Implementando o agrupamento de objetos
O objetivo do
agrupamento de
objetos é criar pares
chave-valor, onde a
chave representa o
critério de
particionamento e o
valor é a lista de
objetos agrupados.
A Java API facilita
esse processo com
as estruturas "List"
para armazenar e
manipular objetos e
"Map" para mapear
chaves para listas de
objetos.
A estrutura "List"
oferece métodos de
inserção e remoção,
e pode ser ajustada
conforme
necessário.
O "Map" mapeia
chaves para valores,
garantindo que as
chaves sejam únicas.
Isso permite criar a
estrutura desejada
para o agrupamento
de objetos.
Agrupamento de objetos em Java
Implementando o agrupamento de objetos
Representação gráfica do agrupamento de objetos.
Agrupamento de objetos em Java
Agrupando objetos com a classe “collectors” da API Java
 A classe "Collectors" na API Java fornece métodos
úteis para operações de redução, como o
agrupamento de objetos em coleções.
 Em vez de percorrer manualmente uma lista de
objetos, podemos transformá-los em um fluxo
("stream") que será processado pela classe
"Collectors".
 O método "groupingBy" é usado para realizar a
operação de agrupamento, simplificando o processo
e retornando um mapeamento de objetos agrupados
com base em um critério específico.
Agrupamento de objetos em Java
Agrupando objetos com a classe “collectors” da API Java
A classe "Collectors" da API Java
realiza o agrupamento de objetos
usando uma função de classificação
que gera chaves de particionamento.
O método "groupingBy" recebe uma
função que mapeia objetos para
chaves de agrupamento, resultando
em pares chave-valor em uma
estrutura "Map".
A segunda assinatura do método
permite ao programador escolher a
estrutura de coleção, como "Set",
em vez de "List".
A terceira versão, a mais genérica,
permite escolher a estrutura de
coleção e o mecanismo de "Map"
para o mapeamento.
Agrupamento de objetos em Java
Coleções
Coleções (Containers) agrupam elementos para armazenar e
manipular dados.
A API Java oferece a Collection Interface com tipos como
Set, List, Queue, Deque, e Map.
Algumas coleções são versões ordenadas de outras, como
SortedSet e SortedMap.
As coleções podem ser especializadas para tipos específicos,
tornando-as genéricas.
Agrupamento de objetos em Java
Coleções
Cada coleção encapsulada possui um mecanismo de funcionamento:
SET LIST
QUEUE DEQUE
Java versus C/C++: um breve comparativo
Comparação entre
Java e C/C++ enfatiza
diferenças na
abordagem de
desenvolvimento.
Java foca em
segurança e
portabilidade,
enquanto C/C++
privilegia performance
e interação direta com
hardware.
A C++ busca
portabilidade por
meio de padrões
internacionais e a
Standard Template
Library.
Java, uma
"plataforma", é
executada pela
Máquina Virtual Java
(JVM), abstraindo o
hardware, tornando-a
portátil, mas com
considerações de
desempenho.
Java versus C/C++: um breve comparativo
Mas e a linguagem C?
 Comparar Java com C é comparar linguagens muito distintas,
com poucos pontos em comum.
 C é conhecido por sua interação de baixo nível e é usado em
drivers de dispositivos.
 A diferença entre Java e C é ainda maior do que a diferença
entre Java e C++.
Java versus C/C++: um breve comparativo
Mas e a linguagem C?
Java e C++ são linguagens OO
(Orientadas a Objeto).
A linguagem C é aderente ao
paradigma de programação
estruturado. Não possui conceito
de classes e objetos.
Ambientes de desenvolvimento Java
Conceitos
JVM é uma abstração que executa bytecodes Java em diferentes plataformas.
JRE é o ambiente de execução que inclui bibliotecas necessárias para rodar programas Java.
JDK é o ambiente de desenvolvimento que engloba o JRE e ferramentas para criar programas
Java.
O Oracle JDK e o OpenJDK são implementações populares do JDK.
Programação Java pode ser feita com um editor de texto e comandos como "javac" para
compilar o código.
Ambientes de desenvolvimento Java
Integrated development environment (IDE)
Um IDE (Integrated
Development
Environment) é um
software que facilita o
desenvolvimento de
programas, incluindo
um editor de código,
compilação e
depuração.
Exemplos de IDEs
incluem o Netbeans e
o Eclipse, ambos
suportando várias
linguagens.
O Eclipse Che é uma
variante do Eclipse
para DevOps,
oferecendo recursos
avançados, como
execução
multicontainer.
O Netbeans é mantido
pela Apache Software
Foundation e suporta
várias linguagens,
incluindo Java, HTML,
JavaScript, PHP, C/C++,
XML, JSP e Groovy.
Estrutura e principais comandos de um programa em Java
Na linguagem C/C++, o ponto de
entrada para a execução do
programa é a função “main”.
Na Java, o ponto de entrada não é
obrigatório para compilar o
programa.
Estrutura e principais comandos de um programa em Java
Métodos de acesso em Java são
mensagens trocadas entre objetos
para modificar seu estado e estão
relacionados ao encapsulamento.
São usados para obter ("get") ou
definir ("set") o valor de variáveis de
objeto.
Um atributo pode ter dois métodos
de acesso: um para obter seu valor e
outro para defini-lo.
Java usa o tipo "boolean" para
avaliar expressões booleanas e não
faz conversões automáticas de
números inteiros para "boolean".
Aprofundamento de
herança e polimorfismo
em java
Herança em Java
Herança e a instanciação de objeto em Java
Herança em programação orientada a objetos (POO) envolve a transmissão de métodos e atributos de
uma "entidade" para outra, semelhante à herança em Direito e Biologia.
Em Java, herança permite que uma classe derivada herde os métodos e atributos de uma classe base.
Isso significa que os métodos e atributos da classe base estarão presentes na classe derivada,
facilitando a reutilização de código e a criação de objetos.
Herança é um conceito central da POO, permitindo que classes compartilhem características e
comportamentos comuns.
Herança em Java
Herança e a instanciação de objeto em Java
Criação de um objeto em Java:
Quando definimos uma classe,
definimos um mecanismo de
criação de objetos.
Uma classe define um tipo de
dado, e cada objeto
instanciado pertence ao
conjunto formado pelos
objetos daquela classe.
Nesse conjunto, todos os
objetos são do tipo da classe
que lhes deu origem.
Herança em Java
Herança e a instanciação de objeto em Java
Criação de um objeto em Java:
Uma classe contém métodos e
atributos que modelam o
comportamento e o estado de
objetos.
Ao instanciar um objeto, a memória
é alocada para armazenar seus
métodos e atributos.
Objetos do mesmo tipo
compartilham métodos e atributos,
mas cada objeto tem sua própria
cópia.
A herança introduz um novo tipo de
relacionamento entre classes,
estabelecendo uma hierarquia onde
as classes acima generalizam as
classes abaixo ou vice-versa.
Herança em Java
Herança e a instanciação de objeto em Java
Hierarquia de classes:
Herança em Java
Explorando a hierarquia de herança
 Java não suporta herança múltipla para evitar ambiguidades
na invocação de métodos.
 Herança em Java é linear, o que significa que um método
especializado é invocado de forma clara em caso de
múltiplas classes superiores.
 Evitar ambiguidades é fundamental na criação de
hierarquias de classes em Java.
Diamante da morte.
Herança em Java
Explorando a hierarquia de herança
Linguagens que admitem herança múltipla deixam para o desenvolvedor a solução desse problema.
Em C++, por exemplo, a
desambiguação é feita
fazendo-se um cast explícito
para o tipo que se quer
invocar.
Entretanto, deixar a cargo do
programador é potencializar o
risco de erro, o que Java tem
como meta evitar.
Portanto, em Java, tal situação
é proibida, obrigando a se
criar uma solução de
modelagem distinta.
Herança em Java
Herança, subtipos e o princípio da substituição de Liskov
O princípio da substituição
de Liskov, parte do Projeto
por Contrato, enfatiza que os
métodos de uma classe
devem manter o mesmo
contrato ao serem
substituídos nas subclasses.
Os métodos herdados devem
ter a mesma assinatura,
parâmetros e
comportamento que o
método da superclasse.
Em um exemplo, o método
"atualizarID" da classe
"Aluno" tem uma assinatura
diferente, não aceitando
parâmetros, o que quebra o
contrato estabelecido pela
superclasse.
Herança em Java
Herança, subtipos e o princípio da substituição de Liskov
Subtipo e subclasse são conceitos distintos.
Uma subclasse é estabelecida
quando uma classe é derivada de
outra.
Um subtipo tem uma restrição
adicional.
Para que uma subclasse seja um subtipo da superclasse, todas as propriedades da superclasse devem ser
válidas na subclasse.
Hierarquia de coleção
 O Java Collections Framework consiste em classes e interfaces que
implementam estruturas de dados para agrupar elementos.
 As principais estruturas de dados incluem Set, List, Queue e Deque,
que são coleções.
 Além disso, a estrutura Map também é parte do framework, embora
não seja uma coleção.
 O framework possui duas árvores de hierarquia, uma para coleções e
outra para Map.
Hierarquia de coleção
Hierarquia de herança – Collections.
Hierarquia de coleção
Hierarquia de herança – Map.
Hierarquia de coleção
Hierarquia de herança – Map.
Hierarquia de coleção
A interface "Collection" é genérica, com 15 métodos, incluindo iteração e comportamentos genéricos.
add(Object e) addAll(Collection c) clear() contains(Object c)
containsAll(Collection c) equals(Object e) hashCode() isEmpty()
Iterator() remove(Object e) removeAll(Collection c) retainAll(Collection c)
size() toArray()
Objetct [ ] toArray
(Object e)
Hierarquia de coleção
As interfaces “Set”, “List”, “Queue” e “Deque” possuem comportamentos especializados, conforme as
seguintes particularidades de cada tipo:
Set
Representa conjuntos
e não admite
elementos
duplicados.
List
Implementa o
conceito de listas e
admite duplicidade
de elementos.
Queue
Trata-se de uma
coleção que
implementa algo mais
genérico do que uma
fila.
Deque
Implementa a
estrutura de dados
conhecida como
“Deque” (Double
Ended Queue)
Tipos estáticos e dinâmicos
Tipos estáticos e dinâmicos estão
relacionados à atribuição de tipos a
variáveis.
Tipagem estática é definida durante
a compilação, enquanto a tipagem
dinâmica ocorre em tempo de
execução.
A tipagem dinâmica é identificada
apenas durante a execução do
programa.
Exemplos de tipos estáticos incluem
tipos primitivos como "int" em
linguagens como Java.
Métodos
O método “toString”
 Gera uma representação textual de um objeto.
 Ele inclui o nome qualificado da classe e o código
hash do objeto.
 Pode ser personalizado para fornecer informações
específicas sobre o objeto.
 É herdado da classe "Object" e é útil para depuração
e apresentação de objetos.
Métodos
Os métodos “EQUALS” e “HASHCODE”
"equals" compara se dois objetos são iguais e retorna "true" ou "false".
É comum especializar esses métodos para fornecer semântica específica nas classes
criadas.
"hashCode" gera um valor inteiro que representa um objeto, usado em estruturas de
dados como tabelas hash.
Ambos são herdados da classe "Object" em Java e podem ser personalizados para
atender às necessidades da classe.
Métodos
Os métodos “EQUALS” e “HASHCODE”
Equals busca precisão, retornando true apenas se os objetos são idênticos, estabelecendo uma
relação de equivalência com S seguintes propriedades:
Reflexividade Simetria Transitividade Consistência
O operador “INSTANCEOF”
 "instanceof" compara um objeto com um tipo específico em Java.
 Sintaxe: "op1 instanceof op2", onde "op1" é o objeto e "op2" é o tipo.
 Retorna verdadeiro se "op1" for uma instância do tipo "op2".
 Útil para verificar a relação de herança entre um objeto e um tipo.
Entendendo o acesso protegido
 O acesso protegido restringe o acesso a atributos a pacotes e
subclasses.
 Subclasses têm acesso a métodos e atributos
públicos/protegidos da superclasse.
 Em pacotes distintos, importar a superclasse é necessário.
 Exemplo: Classe "Nota" no pacote "Matemática" para calcular
notas de alunos.
Classes e Polimorfismo em Java
Classes e Métodos Abstratos
Em Java, uma classe abstrata fornece
uma interface e comportamentos
comuns para subclasses.
O modificador "abstract" pode ser
aplicado à declaração da classe ou a
métodos.
Métodos abstratos não possuem
implementação e forçam a classe a
ser declarada abstrata.
Métodos concretos possuem
implementação e não necessitam de
especialização em subclasses.
Classes e Polimorfismo em Java
Métodos e classes “Final”
 O modificador "final" em Java pode ser aplicado a
classes e membros da classe.
 Classes "final" não podem ser estendidas (não
podem ter subclasses).
 Métodos "final" não podem ser redefinidos nas
subclasses, garantindo sua imutabilidade.
 Variáveis "final" devem ser inicializadas e não
podem ser modificadas após a inicialização,
evitando erros de compilação.
Atribuições permitidas entre variáveis de superclasse e
subclasse
Variáveis "private" são
inacessíveis para
classes derivadas.
Variáveis públicas ou
protegidas são
acessíveis entre classes
pai e filha.
Para acessar membros
da classe filha na
classe pai, é necessário
fazer downcasting.
Downcasting
interpreta a referência
como sendo da
subclasse, enquanto
upcasting faz o oposto.
Atribuições permitidas entre variáveis de superclasse e
subclasse
Reinterpretação de referência.
A entidade “Interface”
Interfaces são elementos que conectam sistemas distintos que não se
conectam diretamente.
Em programação orientada a objetos, interfaces modelam interações
entre entidades virtuais.
Exemplificando com um mouse, a interface define as possíveis
interações com o dispositivo, mas não o comportamento específico.
Interfaces em programação estabelecem um contrato padrão de
interação, isolando detalhes de implementação.
A entidade “Interface”
Particularidades da “Interface”
Em Java, interfaces não possuem
atributos, apenas constantes e
métodos.
Elas declaram métodos a serem
implementados por classes.
Herança com interfaces só é possível
entre interfaces.
Classes que implementam interfaces
usam "implements" e podem
implementar várias interfaces.
A entidade “Interface”
Diferença entre Classe Abstrata e Interface
Classe abstrata define um tipo de dado com comportamento padrão para
classes que a herdam, permitindo atributos e métodos.
Interface especifica um contrato que define capacidades, sem atributos nem
comportamentos ocultos, permitindo herança múltipla.
Use interfaces quando desejar especificar capacidades a serem disponibilizadas.
Use classes abstratas quando buscar generalização de comportamento e
compartilhamento de código e atributos comuns.
Implementação de
tratamento de exceções
em java
Visão geral
Conceitos
Uma exceção em Java é um erro em
tempo de execução que interrompe
o fluxo normal do programa.
Quando ocorre uma exceção, é
criado um objeto chamado
"exception object" que contém
informações sobre o erro.
O "exception object" é entregue ao
sistema de execução da Máquina
Virtual Java (MVJ) no processo
chamado de lançamento de exceção.
O sistema de execução busca na
pilha de chamadas por um
"exception handler" (tratador de
exceções) adequado para tratar a
exceção.
Visão geral
Conceitos
O uso de exceções
separa o código de
tratamento de erros
do código funcional,
melhorando a
organização e
facilitando a
depuração.
As exceções
permitem propagar
erros para métodos
superiores na pilha
de chamadas,
entregando o objeto
de exceção
diretamente ao
método interessado.
Exceções permitem
agrupar e
diferenciar tipos de
erros, seguindo a
hierarquia de
classes.
Erros mais
específicos são
definidos em classes
mais baixas na
hierarquia.
Tipos de exceções
Subtipos Error e Exception
Exceções em Java são divididas em Error e Exception.
Error agrupa erros catastróficos relacionados ao ambiente de
execução.
Exception engloba exceções que os programas devem
capturar e permite exceções personalizadas.
RuntimeException, uma subclasse de Exception, representa
exceções como divisão por zero e acesso a índice inválido.
Tipos de exceções
Exceções implícitas
Exceções explícitas
são aquelas que não
são implícitas, sendo
consideradas
incontornáveis.
Métodos que usam
exceções explícitas
devem lançá-las com a
instrução "throw".
O programador pode
optar por capturar a
exceção localmente
ou propagá-la para os
chamadores usando
"throws" na assinatura
do método.
Chamadores precisam
tratar ou propagar
exceções explícitas.
Tipos de exceções
Exceções explícitas
Exceções implícitas
são definidas nos
subtipos Error e
RuntimeException e
suas derivadas.
Elas podem ocorrer
em qualquer parte do
programa, geralmente
não são causadas
diretamente pelo
programador e não
precisam ser lançadas
manualmente.
Exemplos incluem
ArithmeticException,
OutOfMemoryError,
NullPointerException
e
IndexOutOfBoundsExc
eption.
Java runtime lança
essas exceções
automaticamente, e
um bloco try-catch
pode ser usado para
capturá-las.
Criação de novas classes de exceções
Para criar uma classe de exceção deve-se, obrigatoriamente,
estender-se uma classe de exceção existente, pois isso irá legar
à nova classe o mecanismo de manipulação de exceções.
Criação de novas classes de exceções
Uma classe de exceção não possui qualquer membro a não ser os 4 construtores:
Um que não
recebe argumentos
e passa uma String
Mensagem de erro
padrão ‒ para o
construtor da
superclasse.
Um que recebe
uma String
Mensagem de erro
personalizada – e a
passa para o
construtor da
superclasse.
Um que recebe
uma String
Mensagem de erro
personalizada – e um
objeto Throwable –
para encadeamento de
exceções – e os passa
para o construtor da
superclasse.
Um que recebe um
objeto Throwable
Para encadeamento
de exceções – e o
passa para o
construtor da
superclasse.
Visão geral
Conceitos
Três cláusulas se destacam quando se busca compreender o mecanismo de tratamento de exceções de
Java:
Finally
A instrução finally oferece
uma maneira de lidar com
certos problemas gerados
pelo desvio indesejado no
fluxo do programa.
Throw
A instrução throw é básica,
por meio dela podemos lançar
as exceções explícitas e,
manualmente, as implícitas.
Throws
A instrução throws pode ser
conjugada para alterar a
abordagem no tratamento das
exceções lançadas.
Tipos de comando
Comando finally
O bloco "finally" é usado para
garantir que um conjunto de
instruções seja executado,
independentemente de uma
exceção ser lançada ou não em um
bloco "try".
O "finally" é útil para liberar
recursos, como memória ou
conexões, evitando vazamentos de
recursos.
Mesmo se houver instruções
"return", "break" ou "continue" no
bloco "try", o "finally" será
executado.
Se uma exceção for lançada, o
bloco "catch" correspondente será
executado antes do "finally".
O "finally" é executado mesmo se
uma exceção não for capturada.
Tipos de comando
Comando throw
O comando "throw"
em Java lança
exceções
manualmente.
É usado para lançar
exceções explícitas.
A exceção lançada
deve ser uma
instância da classe
Throwable ou de
suas subclasses.
A execução do
programa é
desviada após uma
cláusula "throw," e
nenhuma instrução
subsequente é
executada.
Tipos de comando
Comando throw
Tipos de comando
Comando throws
O comando "throws" é usado na assinatura de um método para declarar exceções
explícitas que o método pode lançar, mas não vai tratar.
A cláusula "throws" permite que os chamadores se preparem para lidar com
exceções que podem ocorrer durante a chamada do método.
Deve listar todas as exceções explícitas não tratadas separadas por vírgula.
Exceções implícitas (da classe Error e RuntimeException e suas subclasses) não
precisam ser listadas na cláusula "throws."
Encadeamento de exceções
Quando um método responde a uma exceção lançando outra
exceção distinta, as informações sobre a causa original do erro
se perdem, tornando a depuração mais difícil.
Encadeamento de exceções
Mecanismo de encadeamento de exceções
 Isso ajuda a manter informações sobre a causa original
do erro.
 Pode ser feito por meio de construtores que aceitam
um objeto Throwable como parâmetro.
 Também é possível usar os métodos getCause() e
initCause() da classe Throwable para criar essa
associação.
O encadeamento de exceção em Java
permite associar uma exceção com a
exceção corrente.
Visão geral
Conceitos
O tratamento de exceções em Java
lida com anormalidades e erros que
ocorrem durante a execução do
software.
O tratamento de exceções tem
impacto no desempenho do
programa, impedindo otimizações do
compilador em certos casos.
O mecanismo de sinalização de
exceções é o processo de criação de
uma instância de exceção, que pode
ser chamado de lançamento de
exceção.
O tratamento de exceções é
composto por processos de
notificação de exceção, lançamento
de exceção, relançamento de
exceção e tratamento de exceção.
Tratamento de exceções
Notificação de exceção
A notificação é o
processo pelo
qual um método
avisa ao
chamador sobre
as exceções que
pode lançar.
A cláusula throws
é usada na
assinatura do
método para
notificar as
exceções que
podem ser
lançadas.
As exceções
explícitas exigem
notificação,
enquanto as
implícitas não a
exigem.
As exceções
podem ser
propagadas até o
tratador padrão
Java se forem
passadas até o
método "main()"
e notificadas lá.
Tratamento de exceções
Lançamento e relançamento de exceções
Lançamento de exceção:
Exceções podem ser lançadas de
forma implícita ou explícita.
O lançamento de exceções fora de
blocos "try-catch" deve ser feito com
cuidado, garantindo que o código
abaixo da instrução "throw" seja
acessível.
Erros de compilação ocorrerão se o
código abaixo da instrução "throw"
não for alcançável.
Tratar exceções é fundamental para
lidar com desvios indesejados no
fluxo de execução do programa.
Tratamento de exceções
Lançamento e relançamento de exceções
Relançamento de exceção
O relançamento de exceção ocorre quando uma exceção capturada não é completamente
tratada ou quando parte do tratamento deve ser adiado.
Essa ação permite que a exceção seja relançada para buscar um novo bloco catch
adequado em um bloco try externo.
A exceção é relançada usando a instrução "throw" dentro do bloco catch, seguida pela
referência ao objeto da exceção capturada.
O processo de busca de blocos catch adequados é reiniciado para lidar com a exceção
após o relançamento.
Tratamento de exceções
Captura de exceção
A instrução "catch" é usada para
capturar exceções em Java e define o
tipo de exceção que um bloco pode
tratar.
Quando uma exceção é lançada, a
busca por um bloco "catch"
adequado ocorre do bloco "try" local
para o mais externo.
Uma vez que um bloco "catch"
adequado é encontrado, a exceção é
capturada por ele, passando a
referência para o objeto de exceção
lançado.
Blocos "catch" não podem ocorrer
independentemente no código e
devem sempre estar associados a
um bloco "try". Eles não podem ser
aninhados.
Programação paralela
em Java: threads
Visão geral
Conceitos
 No início, conhecimento profundo do hardware era
essencial para programadores.
 Compiladores modernos otimizam código, gerando
eficiência em CPUs avançadas.
 Tecnologia atual permite multitarefa, graças a CPUs
multinúcleo e sistemas operacionais.
 Threads são sequências de instruções que
possibilitam execução simultânea em sistemas
multinúcleo.
Visão geral
Execução de software por um computador teórico
Em sistemas com CPU de núcleo
único, a multitarefa é uma ilusão
criada pela preempção.
Sistemas utilizam um escalonador de
processos para alternar entre
diferentes programas.
O tempo da CPU é dividido entre os
processos, causando interrupções e
trocas de contexto.
A execução de muitos programas
simultaneamente pode resultar em
lentidão perceptível.
Visão geral
Execução de software por um computador teórico
Escalonador de processos
Visão geral
Execução de software por um computador teórico
Configuração: CPU multinúcleo
Em sistemas com CPU
multinúcleo, cada núcleo é
independente e possui seus
próprios registradores.
Threads são linhas de
execução de programa
dentro de processos,
compartilhando o espaço de
memória.
Threads são mais rápidas
para criar, finalizar e trocar
de contexto do que
processos.
Compartilhar memória
facilita a troca de dados e
reduz a latência na
comunicação entre threads.
Threads em Java
 Java é uma linguagem multithread que suporta a implementação de
múltiplos caminhos de execução em uma aplicação.
 Threads são gerenciadas pelo sistema operacional, que decide a
alocação da CPU com base em suas prioridades.
 Threads com maior prioridade têm preferência na execução, mas isso
não garante um comportamento determinístico, uma vez que o
escalonador decide quando cada thread será agendada.
Threads em Java
Em Java, há dois tipos de threads:
Deamon
Daemon threads em segundo
plano servem às user threads
e dependem delas; o GC é um
exemplo, sem controle sobre
execução.
User
User threads são criadas e
finalizadas pela aplicação, não
forçadas pela MVJ, executam
em primeiro plano, requerem
sincronização.
Threads em Java
Ciclo de vida de thread em Java
 O ciclo de vida de threads em Java começa com uma thread principal.
 A execução continua até a saída ou a morte de threads não daemon.
 Threads são criadas subclasse Thread ou implementando a interface
Runnable.
 Cada thread tem um nome, que pode ser gerado automaticamente.
Threads em Java
Ciclo de vida de thread em Java
Há duas maneiras de se criar uma thread em Java:
Declarar a classe como
subclasse da classe Thread.
Declarar uma classe que
implementa a interface
Runnable.
Threads em Java
Ciclo de vida de thread em Java
Uma thread pode existir em seis estados:
New Runnable Blocked
Timed_waiting Waiting Terminated
Threads em Java
Ciclo de vida de thread em Java
Escalonador de processos.
Threads em Java
Criando uma thread
Mecanismo de herança
Utilizar o mecanismo de herança
com o único objetivo de criar uma
thread pode não ser a abordagem
mais interessante. Mas, se houver
a intenção de se acrescentar ou
modificar métodos da classe
Thread, então a extensão dessa
classe se molda melhor, do ponto
de vista conceitual.
Implementação de “Runnable”
A implementação do método run ()
da interface Runnable parece se
adequar melhor à criação de uma
thread. Além disso, como Java não
aceita herança múltipla, estender a
classe Thread pode complicar
desnecessariamente o modelo de
classes, caso não haja a
necessidade de se alterar o seu
comportamento.
Visão geral
Conceitos
Para realizar uma busca textual eficiente em um grande documento, a abordagem ideal é usar threads. No
entanto, surgem desafios:
Comunicação entre
Threads
É importante estabelecer um
mecanismo de comunicação
entre as threads para
compartilhar informações
sobre os resultados ou
coordenar tarefas.
Coordenação das Threads
Coordenar a execução das
threads é essencial para
dividir o trabalho de maneira
eficiente e garantir que as
tarefas sejam concluídas no
momento certo.
Visão geral
Questões acerca do emprego de threads
Threads compartilham memória,
levando a problemas de concorrência.
Colisões na escrita podem causar
resultados incorretos.
Coordenação entre threads é
necessária para evitar problemas.
Java oferece mecanismos como
Semáforos e Monitores para lidar
com concorrência.
Comunicação entre threads: semáforos e monitores
Semáforos
Semáforos são mecanismos
para controlar acesso a
recursos compartilhados
em processos ou threads.
Podem ser usados para
evitar condições de corrida
e sinalização entre threads.
Utilizam uma variável de
controle e métodos para
solicitar e liberar acesso a
recursos.
São essenciais para lidar
com problemas de
concorrência na
programação Java.
Comunicação entre threads: semáforos e monitores
Semáforos
Os processos acontece da seguinte forma:
Solicitação de acesso ao
recurso
Quando uma thread deseja
acesso a um recurso
compartilhado, ela invoca o
método de solicitação de
acesso. O número máximo de
acessos ao recurso é dado
pela variável de controle.
Controle de acessos
Quando uma solicitação de
acesso é feita, se o número de
acessos que já foi concedido
for menor do que o valor da
variável de controle, o acesso
é permitido e a variável é
decrementada. Se o acesso
for negado, a thread é
colocada em espera numa fila.
Liberação do recurso
obtido
Quando uma thread termina
de usar o recurso obtido, ela
invoca o método que o libera
e a variável de controle é
incrementada. Nesse
momento, a próxima thread
da fila é despertada para
acessar o recurso.
Comunicação entre threads: semáforos e monitores
Semáforos
Desde a versão 5, Java oferece uma implementação de semáforo por meio da classe Semaphore. Métodos
para acesso e liberação de recursos:
Acquire ()
Método que solicita acesso a
um recurso ou uma região
crítica, realizando o bloqueio
até que uma permissão de
acesso esteja disponível ou a
thread seja interrompida.
Release ()
Método responsável pela
liberação do recurso pela
thread.
Comunicação entre threads: semáforos e monitores
Semáforos
Semáforos e
mutexes são
mecanismos de
exclusão mútua.
Semáforos não
verificam a origem
da liberação,
enquanto mutexes
fazem essa
verificação.
Semáforos podem
ser usados para
enviar sinais entre
threads.
Comunicação entre threads: semáforos e monitores
Monitores
Monitores garantem exclusão mútua entre threads, tornando operações
indivisíveis.
Permitem cooperação entre threads, permitindo que uma thread espere por
uma condição.
Monitores em Java são implementados com a palavra-chave "synchronized".
Regiões de código monitoradas com "synchronized" são consideradas
thread-safe.
Comunicação entre threads: semáforos e monitores
Monitores
Em Java, todo objeto possui um wait-set associado que implementa o conceito de conjunto de threads. Essa
estrutura é utilizada para permitir a cooperação entre as threads, fornecendo os seguintes métodos:
Wait ()
Adiciona a thread ao conjunto
wait-set, liberando a trava que
aquela thread possui e
suspendendo sua execução
Notify ()
Acorda a próxima thread que
está aguardando na fila e
garante o acesso exclusivo à
thread despertada.
Notifiall ()
Faz basicamente o mesmo
que o método notify (), mas
acordando e removendo
todas as threads da estrutura
de espera
Objetos imutáveis
Objetos imutáveis não
podem ter seu estado
modificado após a
criação.
Java oferece classes
imutáveis, como o tipo
String, e classes
mutáveis, como
StringBuffer e
StringBuilder.
Vantagens dos objetos
imutáveis incluem
segurança,
simplicidade na coleta
de lixo e thread-safety.
Para criar objetos
imutáveis, evite
métodos "set",
declare campos
privados e finais, e
marque a classe como
final ou o construtor
como privado.
Implementação de threads
A classe Thread é essencial para
programação paralela em Java.
Ela possui campos para definir
prioridades de threads.
Contém métodos importantes, como
start() para iniciar a thread, run()
para definir o código a ser executado
e sleep() para pausar a thread
temporariamente.
A implementação de threads em Java
envolve a criação de equipes de
threads e o uso de semáforos e
CountDownLatch para controle.
Considerações gerais
Programação paralela em Java é desafiadora, pois envolve múltiplas linhas de
execução e a possível ocorrência de condições de corrida.
Java oferece mecanismos de sincronização de threads, mas seu uso correto é
crucial, o que pode ser complicado em programas maiores e com muitas
threads.
Erros em programação paralela são difíceis de localizar, tornando a depuração
mais complexa devido à natureza do sistema.
A mentalidade sequencial pode não ser adequada, já que a execução paralela
requer uma abordagem diferente.
Considerações gerais
Há algumas práticas simples que podem auxiliar o programador a evitar os erros, como:
Escolha da IDE Uso da UML Atenção aos detalhes
Integração com banco
de dados em Java
Conceitos
Front-end e back-end
 Front-end se concentra na interface do usuário e utiliza
linguagens de programação, como Java, para criar essa
interação.
 Back-end engloba tecnologias, como bancos de dados e
sistemas de mensageria, que fornecem recursos
específicos, não visíveis ao usuário.
Conceitos
Middleware
Middleware é uma camada de software intermediária que conecta front-end e back-
end em sistemas com diversidade de componentes e modelos de programação.
No contexto Java, o JDBC é um exemplo de middleware que permite acessar vários
tipos de bancos de dados sem alterar o código, usando SQL padronizado.
Manter a sintaxe padronizada pela SQL ANSI ao usar o JDBC evita a necessidade de
modificar o front-end ao trocar fornecedores de back-end.
Middleware facilita a integração e promove a flexibilidade ao permitir mudanças de
fornecedor com poucas ou nenhuma modificação de código.
Conceitos
Banco de dados Derby
 Derby (Java DB) é um banco de dados relacional em
Java distribuído com o JDK, adequado para
aplicativos Java e transações online.
 No NetBeans, é fácil criar e gerenciar bancos de
dados Derby, com instâncias configuráveis, tabelas e
registros.
 O NetBeans oferece uma interface para visualmente
inserir dados em tabelas, tornando o processo mais
acessível.
 Derby é uma opção eficiente para aplicativos Java
que exigem um banco de dados embutido e leve.
Java database connectivity (JDBC)
Componentes do JDBC
JDBC (Java Database Connectivity)
oferece componentes essenciais
para acessar bancos de dados a
partir de aplicativos Java.
Os principais componentes do JDBC
incluem DriverManager, Connection,
Statement, PreparedStatement e
ResultSet.
Existem quatro tipos de drivers
JDBC: JDBC-ODBC Bridge, JDBC-
Native API, JDBC-Net e Pure Java.
O uso do JDBC envolve quatro etapas
simples: instanciar o driver, obter
uma conexão, criar um executor SQL
e executar comandos DML para
interagir com o banco de dados.
Orientação a objetos e o modelo relacional
Bancos de dados seguem o
modelo relacional, eficaz
para consultas, mas não
para programação orientada
a objetos.
Para integração, criamos
classes de entidade que
mapeiam tabelas e seus
registros em objetos.
Isso é chamado de
mapeamento objeto-
relacional.
Permite manipular dados
como objetos, facilitando a
programação orientada a
objetos.
Data Acess Object (DAO)
Banco de Dados Derby é um sistema
relacional em Java, útil para
aplicativos Java.
A conversão de bancos de dados
relacionais para programação
orientada a objetos envolve o
mapeamento objeto-relacional.
Mapear tabelas para classes de
entidade torna possível lidar com
dados de maneira orientada a
objetos.
O padrão DAO (Data Access Object)
concentra operações SQL em classes,
facilitando a organização e
reutilização de comandos de banco
de dados.
Java Persistence Architecture (JPA)
 Java Persistence Architecture (JPA) é uma arquitetura Java para mapear
objetos em bancos de dados relacionais.
 Frameworks de persistência, como Hibernate e Entity Framework,
automatizam tarefas de persistência de dados.
 JPA é a arquitetura padrão de persistência em Java, permitindo
mapeamento objeto-relacional e consultas em JPQL.
 Anotações, como @Entity e @Table, simplificam o mapeamento entre
classes Java e tabelas do banco de dados.
Sistema cadastral simples
 A classe AlunoDAO pode ser usada para criar um
sistema de cadastro simples em modo texto.
 O método exibirTodos usa notação lambda para
percorrer a coleção e exibir suas informações.
 O método main permite ao usuário escolher as opções
de operação, ativando os métodos correspondentes.
Gerenciamento de transações
Gerenciamento de transações I
 O controle transacional garante a consistência em conjuntos de
operações.
 Uma transação envolve operações seguidas por uma
confirmação (commit) ou reversão (rollback).
 O uso de transações simplifica o processo de desfazer
operações após um erro, garantindo a integridade dos dados no
banco de dados.
Gerenciamento de transações
Gerenciamento de transações II
 O uso de transações pode ser implementado para garantir a
consistência e a reversão de operações no banco de dados.
 Em JDBC, o controle transacional envolve desativar a
confirmação automática (autoCommit), usar commit e
rollback.
 No JPA, o controle transacional segue princípios
semelhantes, com begin, commit, rollback, e close,
simplificando o processo em comparação com o JDBC puro.
Sistema com JPA no NetBeans
 O NetBeans oferece ferramentas de produtividade,
como um gerador automático de entidades JPA.
 Para usá-lo, você pode criar um projeto Java e
seguir etapas, como escolher as tabelas de
interesse, definir um pacote e gerar a entidade JPA.
 Além disso, o NetBeans permite gerar um DAO
automaticamente para as entidades, simplificando a
manipulação dos dados.
 As operações de manipulação de dados são
realizadas a partir do EntityManager, com métodos
correspondentes aos comandos SQL (insert, update,
delete).

Mais conteúdo relacionado

PDF
Orientação a Objetos no Delphi - Por onde começar (I)
PPTX
Programação orientada a objetos
PDF
Aula orientação a objetos
PPT
Java aula 2
PDF
Conceitos Básicos de Orientação o Objetos aplicdo ao VBA - Classes em vba
PPT
Mini aula-java
PPT
Poo slides01
Orientação a Objetos no Delphi - Por onde começar (I)
Programação orientada a objetos
Aula orientação a objetos
Java aula 2
Conceitos Básicos de Orientação o Objetos aplicdo ao VBA - Classes em vba
Mini aula-java
Poo slides01

Semelhante a AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx (20)

PPTX
Curso de java - Antonio Alves - aula 04
PDF
Java - Aula 4 - Sobrecarga de construtores, UML e Herança
PPTX
Orientação a Objetos
ODP
Java 09 Heranca Reescrita Polimorfismo
PPTX
PPTX
3- POO
PPTX
Orientação a objetos com PHP
PPTX
Introdução a poo
PDF
Script c
ODP
Construção de Frameworks com Annotation e Reflection API em Java
PDF
Programacao II Aula 7 Heranca-Diagrama Classe [Autosaved].pdf
ODP
Java 00 Poo
PDF
Orientação a Objetos para Desenvolvedores Android
PPTX
Interface
PPT
Aula 1 - Linguagem III
PDF
ebook-completo c# o melhor para começar no c#
PDF
Poo padadigmas
PDF
03 - Orientação a objetos e classes em C# v1.0
Curso de java - Antonio Alves - aula 04
Java - Aula 4 - Sobrecarga de construtores, UML e Herança
Orientação a Objetos
Java 09 Heranca Reescrita Polimorfismo
3- POO
Orientação a objetos com PHP
Introdução a poo
Script c
Construção de Frameworks com Annotation e Reflection API em Java
Programacao II Aula 7 Heranca-Diagrama Classe [Autosaved].pdf
Java 00 Poo
Orientação a Objetos para Desenvolvedores Android
Interface
Aula 1 - Linguagem III
ebook-completo c# o melhor para começar no c#
Poo padadigmas
03 - Orientação a objetos e classes em C# v1.0
Anúncio

Mais de AurelcioOliveira (6)

PPTX
palestra-familia-cristc3a3ECCespiritual.pptx
PPT
ecc-afamlianaconstruodomundo-140727231713-phpapp01.ppt
PPTX
slide modelo plano de gestao escolar.pptx
PPTX
APRESENTACAO DO PROJETO HOLOFOTES para o lançamento.pptx
PPSX
TRABALHO - TOTEN engenharia da usabilidade
PPTX
Comunidade de aprendizagem NA PRÁTICA.pptx
palestra-familia-cristc3a3ECCespiritual.pptx
ecc-afamlianaconstruodomundo-140727231713-phpapp01.ppt
slide modelo plano de gestao escolar.pptx
APRESENTACAO DO PROJETO HOLOFOTES para o lançamento.pptx
TRABALHO - TOTEN engenharia da usabilidade
Comunidade de aprendizagem NA PRÁTICA.pptx
Anúncio

Último (20)

PPTX
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
PPTX
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
PDF
Processos na gestão de transportes, TM100 Col18
PDF
Custos e liquidação no SAP Transportation Management, TM130 Col18
PDF
COBITxITIL-Entenda as diferença em uso governança TI
PPTX
Curso de Java 9 - (Threads) Multitarefas.pptx
PPTX
Aula sobre desenvolvimento de aplicativos
PDF
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
PDF
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
PDF
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
PPTX
Émile Durkheim slide elaborado muito bom
PPTX
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
PPTX
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
PPTX
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
PDF
Apple Pippin Uma breve introdução. - David Glotz
PPTX
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
PPTX
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
PDF
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
PDF
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
PPTX
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx
Curso de Java 10 - (IO Manipulação de Arquivos).pptx
Curso de Java 11 - (Serializable (Serialização de Objetos)).pptx
Processos na gestão de transportes, TM100 Col18
Custos e liquidação no SAP Transportation Management, TM130 Col18
COBITxITIL-Entenda as diferença em uso governança TI
Curso de Java 9 - (Threads) Multitarefas.pptx
Aula sobre desenvolvimento de aplicativos
Fundamentos de gerenciamento de ordens e planejamento no SAP TransportationMa...
20250805_ServiceNow e a Arquitetura Orientada a Serviços (SOA) A Base para Ap...
Fullfilment AI - Forum ecommerce 2025 // Distrito e Total Express
Émile Durkheim slide elaborado muito bom
Curso de Java 13 - (JavaEE (JSP e Servlets)).pptx
Aula16ManipulaçãoDadosssssssssssssssssssssssssssss
BANCO DE DADOS - AULAS INICIAIS-sgbd.pptx
Apple Pippin Uma breve introdução. - David Glotz
Curso de Java 15 - (Uso de Servlets (Entendendo a Estrutura)).pptx
Curso de Java 17 - (JEE (Sessões e Cookies)).pptx
Mergulho profundo técnico para gestão de transportes no SAP S/4HANA, S4TM6 Col14
Custos e faturamento no SAP S/4HANA Transportation Management, S4TM3 Col26
Curso de Java 12 - (JDBC, Transation, Commit e Rollback).pptx

AULA DIA 22-2024 - PROGRAMACAO ORIENTADA A OBJETOS EM JAVA.pptx

  • 1. Título da disciplina Programação orientada a objetos em java A aula começa em breve...
  • 3. Vamos começar! Classes e sua realização em Java Em POO, uma classe define a estrutura e comportamento dos objetos. A classe especifica dados, métodos e mecanismo de instanciação. Os dados e métodos estabelecem o contrato entre o desenvolvedor e o usuário da classe. Classes públicas em Java devem estar em arquivos com o mesmo nome da classe, com extensão "java".
  • 4. Vamos começar! Classes e sua realização em Java O Código 1 mostra um exemplo de definição de uma classe em Java.
  • 5. Vamos começar! Classes e sua realização em Java A classe "Aluno" do Código 1 em Java possui um atributo "Nome" do tipo "String" e dois métodos: "inserirNome" e "recuperarNome.“ As palavras reservadas "private" e "public" modificam a visibilidade dos métodos e atributos. A declaração normal de classes em Java permite definir classes com diversos atributos e métodos, oferecendo maior flexibilidade e capacidade de modelagem.
  • 6. Vamos começar! Classes e sua realização em Java Forma normal: [Modificador] class Identificador [TipoParâmetros] [Superclasse] [Superinterface] { [Corpo da Classe] }
  • 7. Vamos começar! Classes e sua realização em Java A sintaxe de declaração de classes em Java inclui elementos opcionais em colchetes. Os símbolos não entre colchetes são obrigatórios, como o "Identificador.“ A forma mais simples possível de se declarar uma classe em Java é: class Inutil { }. Mesmo uma classe vazia como "class Inutil { }" é válida na linguagem Java.
  • 8. Vamos começar! Classes e sua realização em Java Os modificadores em Java podem incluir palavras como: Annotation Não é propriamente um elemento, mas sim uma definição. Sua semântica implementa o conceito de anotações em Java e pode ser substituída por uma anotação padrão ou criada pelo programador. Public, Protected e Private São os símbolos que veremos quando falarmos de encapsulamento; são modificadores de acesso.
  • 9. Vamos começar! Classes e sua realização em Java Static Este modificador afeta o ciclo de vida da instância da classe e só pode ser usado em classes membro. Abstract e Final Já os modificadores abstract e final relacionam-se com a hierarquia de classes. Todos esses modificadores serão vistos oportunamente. Strictfp Modificador que torna a implementação de cálculos de ponto flutuando independentes da plataforma. Sem o uso desse modificador, as operações se tornam dependentes da plataforma sobre a qual a máquina virtual é executada.
  • 10. Vamos começar! Classes e sua realização em Java Modificadores podem ser combinados; por exemplo, "public abstract class.“ "TipoParâmetros" pertencem à programação genérica e não serão abordados. Elementos opcionais incluem "Superclasse" e "Superinterface" para herança e implementação de interfaces. "Superclasse" usa "extends IdentificadorClasse," enquanto "Superinterface" usa "implements IdentificadorInterface."
  • 11. Vamos começar! Classes e sua realização em Java A sintaxe do elemento "Superinterface" é "implements IdentificadorInterface". A palavra reservada "implements" indica que a classe implementa a interface "IdentificadorInterface". Exemplo:
  • 12. Vamos começar! Objetos: os produtos das classes Classes servem como modelos para objetos. Classes abstratas não permitem instância direta e fornecem modelos de comportamento comum. As classes que permitem instâncias são usadas para criar objetos. A instanciação de uma classe abstrata gera erros de compilação.
  • 13. Vamos começar! Objetos: os produtos das classes Instanciar uma classe significa criar um objeto a partir do modelo da classe. Envolve a declaração de uma variável do tipo da classe e a criação do objeto com o nome da variável. Primeiramente, uma variável é declarada como sendo do tipo de alguma classe. A seguir, o compilador é instruído a gerar um objeto a partir daquela classe, que será rotulado com o identificador que nomeia a variável.
  • 14. Vamos começar! Objetos: os produtos das classes A criação de objetos inicia com alocação de memória e execução do código de construção. O código de construção está no método construtor da classe, com mesmo nome e sem tipo de retorno. O construtor é automaticamente chamado durante a instanciação do objeto. A instrução "new" seguida do construtor cria o objeto e inicializa a variável com uma referência para ele.
  • 15. Vamos começar! Objetos: os produtos das classes Revendo a instanciação, identificamos que ela pode ser decomposta da seguinte forma:
  • 16. Vamos começar! Objetos: os produtos das classes  O construtor contém o código a ser executado na criação do objeto.  Se o código for computacionalmente custoso, a criação do objeto será afetada em termos de desempenho.  Portanto, é importante otimizar o construtor para evitar impactos negativos na instanciação do objeto.
  • 17. Vamos começar! Objetos: os produtos das classes A clonagem de objetos cria cópias idênticas usando diferentes espaços de memória. Cada objeto clonado tem um identificador único, mas seus atributos têm o mesmo conteúdo. A clonagem é mais rápida do que a instanciação usando "new", que executa todos os procedimentos de construção. A clonagem é vantajosa quando se precisa criar muitos objetos do mesmo tipo. O estado de um objeto é definido por seus atributos, enquanto seu comportamento é determinado por seus métodos.
  • 18. Vamos começar! Objetos: os produtos das classes Os objetos em Java têm estado (atributos) e comportamento (métodos). A destruição de objetos na Java é tratada pelo coletor de lixo (garbage collector) de forma automática. O programador não tem controle direto sobre a destruição de objetos em Java. Não há um "destrutor" em Java, e a coleta de lixo é solicitada pelo método "gc()", mas sua execução não é garantida imediatamente.
  • 19. Classes e o encapsulamento de código O encapsulamento na POO esconde detalhes internos da classe, expondo apenas métodos públicos. Isso cria um contrato entre a classe e o código externo. A visibilidade ("private," "protected," "public") define quem pode acessar atributos e métodos. "Private" restringe o acesso à classe, "public" permite acesso externo.
  • 20. Trabalhando com classes e objetos Classes e objetos são produtos da análise orientada a objetos e interagem para formar sistemas. Estabelecemos contratos (interfaces) para permitir que outras classes ou objetos interajam com uma classe ou objeto derivado. Exemplo disso é a invocação do método "nextDouble()" da classe "Random" no código, seguindo o contrato da classe para consumir um serviço. No código, a classe "Aluno" possui um atributo do tipo "Random," mostrando que um objeto "Aluno" contém um objeto "Random."
  • 21. Trabalhando com classes e objetos O parágrafo anterior nos mostra uma relação entre objetos. Em OO há diferentes tipos de relações. Associação Associação na programação orientada a objetos é uma relação fraca onde objetos consomem serviços de outros, independente de propriedade. Pode ter várias cardinalidades. Agregação A Agregação é um relacionamento onde um objeto pai contém objetos filhos, com cada um tendo seu ciclo de vida independente. Composição Composição é uma relação onde um objeto filho depende do objeto pai; se o pai é destruído, o filho também é destruído.
  • 22. Trabalhando com classes e objetos Associação, Agregação e Composição são conceitos inter-relacionados na POO.
  • 23. Herança Herança: Aspectos elementares Herança na POO é uma relação hierárquica entre classes. Superclasses (classe base) têm características compartilhadas e as propagam para subclasses (classe derivada). Isso evita repetição de código e simplifica a manutenção, pois alterações na classe pai são refletidas nas subclasses. Um exemplo é a hierarquia de herança com "Empregado" como superclasse e várias subclasses.
  • 24. Herança Herança: Aspectos elementares A imagem a seguir apresenta um diagrama UML que modela uma hierarquia de herança. Nela, vemos que “Empregado” é pai (superclasse) das classes “Professor”, “Diretor”, “Coordenador” e “Secretario”. Essas últimas são filhas (subclasses) da classe “Empregado”.
  • 25. Herança E quando há mais de uma superclasse?  Herança múltipla é quando uma classe herda características de mais de uma superclasse, mas Java não suporta herança múltipla de classes.  Java permite que uma classe implemente múltiplas interfaces, e uma interface pode herdar de mais de uma interface pai.  A genealogia das classes segue de generalização (classes mais gerais) para especialização (classes mais específicas).  A sintaxe para declarar uma superclasse já foi apresentada anteriormente.
  • 26. Herança Herança e visibilidade A classe "Pessoa" é uma generalização da classe "Empregado," reunindo atributos e comportamento que podem ser aplicados a outras subclasses. Subclasses podem especializar esse comportamento, sobrescrevendo métodos da superclasse. Isso permite manter a assinatura do método, alterando apenas o código que o implementa. Esse mecanismo é fundamental para compreender o polimorfismo.
  • 27. Herança Herança e visibilidade Existem quatro níveis de acesso em Java: Default Privado Protegido Público
  • 28. Herança Herança e visibilidade Modificadores de acessibilidade controlam visibilidade (public, protected, default, private). Pacotes organizam classes por afinidade e evitam conflitos de nomes. "Private" é o mais restritivo, limitando o acesso à própria classe. "Public" é o menos restritivo, permitindo acesso global a entidades públicas.
  • 29. Herança Herança e visibilidade As restrições dos modificadores de acessibilidade na herança são:  Métodos (e atributos) públicos na superclasse devem ser públicos nas subclasses.  Métodos (e atributos) protegidos na superclasse devem ser protegidos ou públicos nas subclasses; não podem ser privados.  Métodos e atributos privados não são acessíveis às subclasses, e sua acessibilidade não é afetada pela herança.
  • 30. Herança Herança e visibilidade Diagrama de classes parcial de um sistema.
  • 31. Polimorfismo Polimorfismo em OO permite que objetos tenham comportamentos diferentes. Pode ser expresso por sobrecarga de função e herança. Todo objeto em Java é polimórfico, graças à herança indireta da classe "Object". Facilita a extensibilidade do software ao permitir a adição de novas classes derivadas de superclasses com impacto mínimo.
  • 32. Agrupamento de objetos em Java  Agrupamento de objetos em Java é usado para organizar objetos com base em critérios.  Não é um conceito de OO, mas é comum em interações com bancos de dados, semelhante à cláusula "GROUP BY" do SQL.  A implementação requer atenção a detalhes como referências nulas (NullPointerException) e estruturas de dados adequadas.  A partir da Java 8, a API Java oferece um mecanismo simplificado para agrupar objetos.
  • 33. Agrupamento de objetos em Java Implementando o agrupamento de objetos O objetivo do agrupamento de objetos é criar pares chave-valor, onde a chave representa o critério de particionamento e o valor é a lista de objetos agrupados. A Java API facilita esse processo com as estruturas "List" para armazenar e manipular objetos e "Map" para mapear chaves para listas de objetos. A estrutura "List" oferece métodos de inserção e remoção, e pode ser ajustada conforme necessário. O "Map" mapeia chaves para valores, garantindo que as chaves sejam únicas. Isso permite criar a estrutura desejada para o agrupamento de objetos.
  • 34. Agrupamento de objetos em Java Implementando o agrupamento de objetos Representação gráfica do agrupamento de objetos.
  • 35. Agrupamento de objetos em Java Agrupando objetos com a classe “collectors” da API Java  A classe "Collectors" na API Java fornece métodos úteis para operações de redução, como o agrupamento de objetos em coleções.  Em vez de percorrer manualmente uma lista de objetos, podemos transformá-los em um fluxo ("stream") que será processado pela classe "Collectors".  O método "groupingBy" é usado para realizar a operação de agrupamento, simplificando o processo e retornando um mapeamento de objetos agrupados com base em um critério específico.
  • 36. Agrupamento de objetos em Java Agrupando objetos com a classe “collectors” da API Java A classe "Collectors" da API Java realiza o agrupamento de objetos usando uma função de classificação que gera chaves de particionamento. O método "groupingBy" recebe uma função que mapeia objetos para chaves de agrupamento, resultando em pares chave-valor em uma estrutura "Map". A segunda assinatura do método permite ao programador escolher a estrutura de coleção, como "Set", em vez de "List". A terceira versão, a mais genérica, permite escolher a estrutura de coleção e o mecanismo de "Map" para o mapeamento.
  • 37. Agrupamento de objetos em Java Coleções Coleções (Containers) agrupam elementos para armazenar e manipular dados. A API Java oferece a Collection Interface com tipos como Set, List, Queue, Deque, e Map. Algumas coleções são versões ordenadas de outras, como SortedSet e SortedMap. As coleções podem ser especializadas para tipos específicos, tornando-as genéricas.
  • 38. Agrupamento de objetos em Java Coleções Cada coleção encapsulada possui um mecanismo de funcionamento: SET LIST QUEUE DEQUE
  • 39. Java versus C/C++: um breve comparativo Comparação entre Java e C/C++ enfatiza diferenças na abordagem de desenvolvimento. Java foca em segurança e portabilidade, enquanto C/C++ privilegia performance e interação direta com hardware. A C++ busca portabilidade por meio de padrões internacionais e a Standard Template Library. Java, uma "plataforma", é executada pela Máquina Virtual Java (JVM), abstraindo o hardware, tornando-a portátil, mas com considerações de desempenho.
  • 40. Java versus C/C++: um breve comparativo Mas e a linguagem C?  Comparar Java com C é comparar linguagens muito distintas, com poucos pontos em comum.  C é conhecido por sua interação de baixo nível e é usado em drivers de dispositivos.  A diferença entre Java e C é ainda maior do que a diferença entre Java e C++.
  • 41. Java versus C/C++: um breve comparativo Mas e a linguagem C? Java e C++ são linguagens OO (Orientadas a Objeto). A linguagem C é aderente ao paradigma de programação estruturado. Não possui conceito de classes e objetos.
  • 42. Ambientes de desenvolvimento Java Conceitos JVM é uma abstração que executa bytecodes Java em diferentes plataformas. JRE é o ambiente de execução que inclui bibliotecas necessárias para rodar programas Java. JDK é o ambiente de desenvolvimento que engloba o JRE e ferramentas para criar programas Java. O Oracle JDK e o OpenJDK são implementações populares do JDK. Programação Java pode ser feita com um editor de texto e comandos como "javac" para compilar o código.
  • 43. Ambientes de desenvolvimento Java Integrated development environment (IDE) Um IDE (Integrated Development Environment) é um software que facilita o desenvolvimento de programas, incluindo um editor de código, compilação e depuração. Exemplos de IDEs incluem o Netbeans e o Eclipse, ambos suportando várias linguagens. O Eclipse Che é uma variante do Eclipse para DevOps, oferecendo recursos avançados, como execução multicontainer. O Netbeans é mantido pela Apache Software Foundation e suporta várias linguagens, incluindo Java, HTML, JavaScript, PHP, C/C++, XML, JSP e Groovy.
  • 44. Estrutura e principais comandos de um programa em Java Na linguagem C/C++, o ponto de entrada para a execução do programa é a função “main”. Na Java, o ponto de entrada não é obrigatório para compilar o programa.
  • 45. Estrutura e principais comandos de um programa em Java Métodos de acesso em Java são mensagens trocadas entre objetos para modificar seu estado e estão relacionados ao encapsulamento. São usados para obter ("get") ou definir ("set") o valor de variáveis de objeto. Um atributo pode ter dois métodos de acesso: um para obter seu valor e outro para defini-lo. Java usa o tipo "boolean" para avaliar expressões booleanas e não faz conversões automáticas de números inteiros para "boolean".
  • 46. Aprofundamento de herança e polimorfismo em java
  • 47. Herança em Java Herança e a instanciação de objeto em Java Herança em programação orientada a objetos (POO) envolve a transmissão de métodos e atributos de uma "entidade" para outra, semelhante à herança em Direito e Biologia. Em Java, herança permite que uma classe derivada herde os métodos e atributos de uma classe base. Isso significa que os métodos e atributos da classe base estarão presentes na classe derivada, facilitando a reutilização de código e a criação de objetos. Herança é um conceito central da POO, permitindo que classes compartilhem características e comportamentos comuns.
  • 48. Herança em Java Herança e a instanciação de objeto em Java Criação de um objeto em Java: Quando definimos uma classe, definimos um mecanismo de criação de objetos. Uma classe define um tipo de dado, e cada objeto instanciado pertence ao conjunto formado pelos objetos daquela classe. Nesse conjunto, todos os objetos são do tipo da classe que lhes deu origem.
  • 49. Herança em Java Herança e a instanciação de objeto em Java Criação de um objeto em Java: Uma classe contém métodos e atributos que modelam o comportamento e o estado de objetos. Ao instanciar um objeto, a memória é alocada para armazenar seus métodos e atributos. Objetos do mesmo tipo compartilham métodos e atributos, mas cada objeto tem sua própria cópia. A herança introduz um novo tipo de relacionamento entre classes, estabelecendo uma hierarquia onde as classes acima generalizam as classes abaixo ou vice-versa.
  • 50. Herança em Java Herança e a instanciação de objeto em Java Hierarquia de classes:
  • 51. Herança em Java Explorando a hierarquia de herança  Java não suporta herança múltipla para evitar ambiguidades na invocação de métodos.  Herança em Java é linear, o que significa que um método especializado é invocado de forma clara em caso de múltiplas classes superiores.  Evitar ambiguidades é fundamental na criação de hierarquias de classes em Java. Diamante da morte.
  • 52. Herança em Java Explorando a hierarquia de herança Linguagens que admitem herança múltipla deixam para o desenvolvedor a solução desse problema. Em C++, por exemplo, a desambiguação é feita fazendo-se um cast explícito para o tipo que se quer invocar. Entretanto, deixar a cargo do programador é potencializar o risco de erro, o que Java tem como meta evitar. Portanto, em Java, tal situação é proibida, obrigando a se criar uma solução de modelagem distinta.
  • 53. Herança em Java Herança, subtipos e o princípio da substituição de Liskov O princípio da substituição de Liskov, parte do Projeto por Contrato, enfatiza que os métodos de uma classe devem manter o mesmo contrato ao serem substituídos nas subclasses. Os métodos herdados devem ter a mesma assinatura, parâmetros e comportamento que o método da superclasse. Em um exemplo, o método "atualizarID" da classe "Aluno" tem uma assinatura diferente, não aceitando parâmetros, o que quebra o contrato estabelecido pela superclasse.
  • 54. Herança em Java Herança, subtipos e o princípio da substituição de Liskov Subtipo e subclasse são conceitos distintos. Uma subclasse é estabelecida quando uma classe é derivada de outra. Um subtipo tem uma restrição adicional. Para que uma subclasse seja um subtipo da superclasse, todas as propriedades da superclasse devem ser válidas na subclasse.
  • 55. Hierarquia de coleção  O Java Collections Framework consiste em classes e interfaces que implementam estruturas de dados para agrupar elementos.  As principais estruturas de dados incluem Set, List, Queue e Deque, que são coleções.  Além disso, a estrutura Map também é parte do framework, embora não seja uma coleção.  O framework possui duas árvores de hierarquia, uma para coleções e outra para Map.
  • 56. Hierarquia de coleção Hierarquia de herança – Collections.
  • 57. Hierarquia de coleção Hierarquia de herança – Map.
  • 58. Hierarquia de coleção Hierarquia de herança – Map.
  • 59. Hierarquia de coleção A interface "Collection" é genérica, com 15 métodos, incluindo iteração e comportamentos genéricos. add(Object e) addAll(Collection c) clear() contains(Object c) containsAll(Collection c) equals(Object e) hashCode() isEmpty() Iterator() remove(Object e) removeAll(Collection c) retainAll(Collection c) size() toArray() Objetct [ ] toArray (Object e)
  • 60. Hierarquia de coleção As interfaces “Set”, “List”, “Queue” e “Deque” possuem comportamentos especializados, conforme as seguintes particularidades de cada tipo: Set Representa conjuntos e não admite elementos duplicados. List Implementa o conceito de listas e admite duplicidade de elementos. Queue Trata-se de uma coleção que implementa algo mais genérico do que uma fila. Deque Implementa a estrutura de dados conhecida como “Deque” (Double Ended Queue)
  • 61. Tipos estáticos e dinâmicos Tipos estáticos e dinâmicos estão relacionados à atribuição de tipos a variáveis. Tipagem estática é definida durante a compilação, enquanto a tipagem dinâmica ocorre em tempo de execução. A tipagem dinâmica é identificada apenas durante a execução do programa. Exemplos de tipos estáticos incluem tipos primitivos como "int" em linguagens como Java.
  • 62. Métodos O método “toString”  Gera uma representação textual de um objeto.  Ele inclui o nome qualificado da classe e o código hash do objeto.  Pode ser personalizado para fornecer informações específicas sobre o objeto.  É herdado da classe "Object" e é útil para depuração e apresentação de objetos.
  • 63. Métodos Os métodos “EQUALS” e “HASHCODE” "equals" compara se dois objetos são iguais e retorna "true" ou "false". É comum especializar esses métodos para fornecer semântica específica nas classes criadas. "hashCode" gera um valor inteiro que representa um objeto, usado em estruturas de dados como tabelas hash. Ambos são herdados da classe "Object" em Java e podem ser personalizados para atender às necessidades da classe.
  • 64. Métodos Os métodos “EQUALS” e “HASHCODE” Equals busca precisão, retornando true apenas se os objetos são idênticos, estabelecendo uma relação de equivalência com S seguintes propriedades: Reflexividade Simetria Transitividade Consistência
  • 65. O operador “INSTANCEOF”  "instanceof" compara um objeto com um tipo específico em Java.  Sintaxe: "op1 instanceof op2", onde "op1" é o objeto e "op2" é o tipo.  Retorna verdadeiro se "op1" for uma instância do tipo "op2".  Útil para verificar a relação de herança entre um objeto e um tipo.
  • 66. Entendendo o acesso protegido  O acesso protegido restringe o acesso a atributos a pacotes e subclasses.  Subclasses têm acesso a métodos e atributos públicos/protegidos da superclasse.  Em pacotes distintos, importar a superclasse é necessário.  Exemplo: Classe "Nota" no pacote "Matemática" para calcular notas de alunos.
  • 67. Classes e Polimorfismo em Java Classes e Métodos Abstratos Em Java, uma classe abstrata fornece uma interface e comportamentos comuns para subclasses. O modificador "abstract" pode ser aplicado à declaração da classe ou a métodos. Métodos abstratos não possuem implementação e forçam a classe a ser declarada abstrata. Métodos concretos possuem implementação e não necessitam de especialização em subclasses.
  • 68. Classes e Polimorfismo em Java Métodos e classes “Final”  O modificador "final" em Java pode ser aplicado a classes e membros da classe.  Classes "final" não podem ser estendidas (não podem ter subclasses).  Métodos "final" não podem ser redefinidos nas subclasses, garantindo sua imutabilidade.  Variáveis "final" devem ser inicializadas e não podem ser modificadas após a inicialização, evitando erros de compilação.
  • 69. Atribuições permitidas entre variáveis de superclasse e subclasse Variáveis "private" são inacessíveis para classes derivadas. Variáveis públicas ou protegidas são acessíveis entre classes pai e filha. Para acessar membros da classe filha na classe pai, é necessário fazer downcasting. Downcasting interpreta a referência como sendo da subclasse, enquanto upcasting faz o oposto.
  • 70. Atribuições permitidas entre variáveis de superclasse e subclasse Reinterpretação de referência.
  • 71. A entidade “Interface” Interfaces são elementos que conectam sistemas distintos que não se conectam diretamente. Em programação orientada a objetos, interfaces modelam interações entre entidades virtuais. Exemplificando com um mouse, a interface define as possíveis interações com o dispositivo, mas não o comportamento específico. Interfaces em programação estabelecem um contrato padrão de interação, isolando detalhes de implementação.
  • 72. A entidade “Interface” Particularidades da “Interface” Em Java, interfaces não possuem atributos, apenas constantes e métodos. Elas declaram métodos a serem implementados por classes. Herança com interfaces só é possível entre interfaces. Classes que implementam interfaces usam "implements" e podem implementar várias interfaces.
  • 73. A entidade “Interface” Diferença entre Classe Abstrata e Interface Classe abstrata define um tipo de dado com comportamento padrão para classes que a herdam, permitindo atributos e métodos. Interface especifica um contrato que define capacidades, sem atributos nem comportamentos ocultos, permitindo herança múltipla. Use interfaces quando desejar especificar capacidades a serem disponibilizadas. Use classes abstratas quando buscar generalização de comportamento e compartilhamento de código e atributos comuns.
  • 74. Implementação de tratamento de exceções em java
  • 75. Visão geral Conceitos Uma exceção em Java é um erro em tempo de execução que interrompe o fluxo normal do programa. Quando ocorre uma exceção, é criado um objeto chamado "exception object" que contém informações sobre o erro. O "exception object" é entregue ao sistema de execução da Máquina Virtual Java (MVJ) no processo chamado de lançamento de exceção. O sistema de execução busca na pilha de chamadas por um "exception handler" (tratador de exceções) adequado para tratar a exceção.
  • 76. Visão geral Conceitos O uso de exceções separa o código de tratamento de erros do código funcional, melhorando a organização e facilitando a depuração. As exceções permitem propagar erros para métodos superiores na pilha de chamadas, entregando o objeto de exceção diretamente ao método interessado. Exceções permitem agrupar e diferenciar tipos de erros, seguindo a hierarquia de classes. Erros mais específicos são definidos em classes mais baixas na hierarquia.
  • 77. Tipos de exceções Subtipos Error e Exception Exceções em Java são divididas em Error e Exception. Error agrupa erros catastróficos relacionados ao ambiente de execução. Exception engloba exceções que os programas devem capturar e permite exceções personalizadas. RuntimeException, uma subclasse de Exception, representa exceções como divisão por zero e acesso a índice inválido.
  • 78. Tipos de exceções Exceções implícitas Exceções explícitas são aquelas que não são implícitas, sendo consideradas incontornáveis. Métodos que usam exceções explícitas devem lançá-las com a instrução "throw". O programador pode optar por capturar a exceção localmente ou propagá-la para os chamadores usando "throws" na assinatura do método. Chamadores precisam tratar ou propagar exceções explícitas.
  • 79. Tipos de exceções Exceções explícitas Exceções implícitas são definidas nos subtipos Error e RuntimeException e suas derivadas. Elas podem ocorrer em qualquer parte do programa, geralmente não são causadas diretamente pelo programador e não precisam ser lançadas manualmente. Exemplos incluem ArithmeticException, OutOfMemoryError, NullPointerException e IndexOutOfBoundsExc eption. Java runtime lança essas exceções automaticamente, e um bloco try-catch pode ser usado para capturá-las.
  • 80. Criação de novas classes de exceções Para criar uma classe de exceção deve-se, obrigatoriamente, estender-se uma classe de exceção existente, pois isso irá legar à nova classe o mecanismo de manipulação de exceções.
  • 81. Criação de novas classes de exceções Uma classe de exceção não possui qualquer membro a não ser os 4 construtores: Um que não recebe argumentos e passa uma String Mensagem de erro padrão ‒ para o construtor da superclasse. Um que recebe uma String Mensagem de erro personalizada – e a passa para o construtor da superclasse. Um que recebe uma String Mensagem de erro personalizada – e um objeto Throwable – para encadeamento de exceções – e os passa para o construtor da superclasse. Um que recebe um objeto Throwable Para encadeamento de exceções – e o passa para o construtor da superclasse.
  • 82. Visão geral Conceitos Três cláusulas se destacam quando se busca compreender o mecanismo de tratamento de exceções de Java: Finally A instrução finally oferece uma maneira de lidar com certos problemas gerados pelo desvio indesejado no fluxo do programa. Throw A instrução throw é básica, por meio dela podemos lançar as exceções explícitas e, manualmente, as implícitas. Throws A instrução throws pode ser conjugada para alterar a abordagem no tratamento das exceções lançadas.
  • 83. Tipos de comando Comando finally O bloco "finally" é usado para garantir que um conjunto de instruções seja executado, independentemente de uma exceção ser lançada ou não em um bloco "try". O "finally" é útil para liberar recursos, como memória ou conexões, evitando vazamentos de recursos. Mesmo se houver instruções "return", "break" ou "continue" no bloco "try", o "finally" será executado. Se uma exceção for lançada, o bloco "catch" correspondente será executado antes do "finally". O "finally" é executado mesmo se uma exceção não for capturada.
  • 84. Tipos de comando Comando throw O comando "throw" em Java lança exceções manualmente. É usado para lançar exceções explícitas. A exceção lançada deve ser uma instância da classe Throwable ou de suas subclasses. A execução do programa é desviada após uma cláusula "throw," e nenhuma instrução subsequente é executada.
  • 86. Tipos de comando Comando throws O comando "throws" é usado na assinatura de um método para declarar exceções explícitas que o método pode lançar, mas não vai tratar. A cláusula "throws" permite que os chamadores se preparem para lidar com exceções que podem ocorrer durante a chamada do método. Deve listar todas as exceções explícitas não tratadas separadas por vírgula. Exceções implícitas (da classe Error e RuntimeException e suas subclasses) não precisam ser listadas na cláusula "throws."
  • 87. Encadeamento de exceções Quando um método responde a uma exceção lançando outra exceção distinta, as informações sobre a causa original do erro se perdem, tornando a depuração mais difícil.
  • 88. Encadeamento de exceções Mecanismo de encadeamento de exceções  Isso ajuda a manter informações sobre a causa original do erro.  Pode ser feito por meio de construtores que aceitam um objeto Throwable como parâmetro.  Também é possível usar os métodos getCause() e initCause() da classe Throwable para criar essa associação. O encadeamento de exceção em Java permite associar uma exceção com a exceção corrente.
  • 89. Visão geral Conceitos O tratamento de exceções em Java lida com anormalidades e erros que ocorrem durante a execução do software. O tratamento de exceções tem impacto no desempenho do programa, impedindo otimizações do compilador em certos casos. O mecanismo de sinalização de exceções é o processo de criação de uma instância de exceção, que pode ser chamado de lançamento de exceção. O tratamento de exceções é composto por processos de notificação de exceção, lançamento de exceção, relançamento de exceção e tratamento de exceção.
  • 90. Tratamento de exceções Notificação de exceção A notificação é o processo pelo qual um método avisa ao chamador sobre as exceções que pode lançar. A cláusula throws é usada na assinatura do método para notificar as exceções que podem ser lançadas. As exceções explícitas exigem notificação, enquanto as implícitas não a exigem. As exceções podem ser propagadas até o tratador padrão Java se forem passadas até o método "main()" e notificadas lá.
  • 91. Tratamento de exceções Lançamento e relançamento de exceções Lançamento de exceção: Exceções podem ser lançadas de forma implícita ou explícita. O lançamento de exceções fora de blocos "try-catch" deve ser feito com cuidado, garantindo que o código abaixo da instrução "throw" seja acessível. Erros de compilação ocorrerão se o código abaixo da instrução "throw" não for alcançável. Tratar exceções é fundamental para lidar com desvios indesejados no fluxo de execução do programa.
  • 92. Tratamento de exceções Lançamento e relançamento de exceções Relançamento de exceção O relançamento de exceção ocorre quando uma exceção capturada não é completamente tratada ou quando parte do tratamento deve ser adiado. Essa ação permite que a exceção seja relançada para buscar um novo bloco catch adequado em um bloco try externo. A exceção é relançada usando a instrução "throw" dentro do bloco catch, seguida pela referência ao objeto da exceção capturada. O processo de busca de blocos catch adequados é reiniciado para lidar com a exceção após o relançamento.
  • 93. Tratamento de exceções Captura de exceção A instrução "catch" é usada para capturar exceções em Java e define o tipo de exceção que um bloco pode tratar. Quando uma exceção é lançada, a busca por um bloco "catch" adequado ocorre do bloco "try" local para o mais externo. Uma vez que um bloco "catch" adequado é encontrado, a exceção é capturada por ele, passando a referência para o objeto de exceção lançado. Blocos "catch" não podem ocorrer independentemente no código e devem sempre estar associados a um bloco "try". Eles não podem ser aninhados.
  • 95. Visão geral Conceitos  No início, conhecimento profundo do hardware era essencial para programadores.  Compiladores modernos otimizam código, gerando eficiência em CPUs avançadas.  Tecnologia atual permite multitarefa, graças a CPUs multinúcleo e sistemas operacionais.  Threads são sequências de instruções que possibilitam execução simultânea em sistemas multinúcleo.
  • 96. Visão geral Execução de software por um computador teórico Em sistemas com CPU de núcleo único, a multitarefa é uma ilusão criada pela preempção. Sistemas utilizam um escalonador de processos para alternar entre diferentes programas. O tempo da CPU é dividido entre os processos, causando interrupções e trocas de contexto. A execução de muitos programas simultaneamente pode resultar em lentidão perceptível.
  • 97. Visão geral Execução de software por um computador teórico Escalonador de processos
  • 98. Visão geral Execução de software por um computador teórico Configuração: CPU multinúcleo Em sistemas com CPU multinúcleo, cada núcleo é independente e possui seus próprios registradores. Threads são linhas de execução de programa dentro de processos, compartilhando o espaço de memória. Threads são mais rápidas para criar, finalizar e trocar de contexto do que processos. Compartilhar memória facilita a troca de dados e reduz a latência na comunicação entre threads.
  • 99. Threads em Java  Java é uma linguagem multithread que suporta a implementação de múltiplos caminhos de execução em uma aplicação.  Threads são gerenciadas pelo sistema operacional, que decide a alocação da CPU com base em suas prioridades.  Threads com maior prioridade têm preferência na execução, mas isso não garante um comportamento determinístico, uma vez que o escalonador decide quando cada thread será agendada.
  • 100. Threads em Java Em Java, há dois tipos de threads: Deamon Daemon threads em segundo plano servem às user threads e dependem delas; o GC é um exemplo, sem controle sobre execução. User User threads são criadas e finalizadas pela aplicação, não forçadas pela MVJ, executam em primeiro plano, requerem sincronização.
  • 101. Threads em Java Ciclo de vida de thread em Java  O ciclo de vida de threads em Java começa com uma thread principal.  A execução continua até a saída ou a morte de threads não daemon.  Threads são criadas subclasse Thread ou implementando a interface Runnable.  Cada thread tem um nome, que pode ser gerado automaticamente.
  • 102. Threads em Java Ciclo de vida de thread em Java Há duas maneiras de se criar uma thread em Java: Declarar a classe como subclasse da classe Thread. Declarar uma classe que implementa a interface Runnable.
  • 103. Threads em Java Ciclo de vida de thread em Java Uma thread pode existir em seis estados: New Runnable Blocked Timed_waiting Waiting Terminated
  • 104. Threads em Java Ciclo de vida de thread em Java Escalonador de processos.
  • 105. Threads em Java Criando uma thread Mecanismo de herança Utilizar o mecanismo de herança com o único objetivo de criar uma thread pode não ser a abordagem mais interessante. Mas, se houver a intenção de se acrescentar ou modificar métodos da classe Thread, então a extensão dessa classe se molda melhor, do ponto de vista conceitual. Implementação de “Runnable” A implementação do método run () da interface Runnable parece se adequar melhor à criação de uma thread. Além disso, como Java não aceita herança múltipla, estender a classe Thread pode complicar desnecessariamente o modelo de classes, caso não haja a necessidade de se alterar o seu comportamento.
  • 106. Visão geral Conceitos Para realizar uma busca textual eficiente em um grande documento, a abordagem ideal é usar threads. No entanto, surgem desafios: Comunicação entre Threads É importante estabelecer um mecanismo de comunicação entre as threads para compartilhar informações sobre os resultados ou coordenar tarefas. Coordenação das Threads Coordenar a execução das threads é essencial para dividir o trabalho de maneira eficiente e garantir que as tarefas sejam concluídas no momento certo.
  • 107. Visão geral Questões acerca do emprego de threads Threads compartilham memória, levando a problemas de concorrência. Colisões na escrita podem causar resultados incorretos. Coordenação entre threads é necessária para evitar problemas. Java oferece mecanismos como Semáforos e Monitores para lidar com concorrência.
  • 108. Comunicação entre threads: semáforos e monitores Semáforos Semáforos são mecanismos para controlar acesso a recursos compartilhados em processos ou threads. Podem ser usados para evitar condições de corrida e sinalização entre threads. Utilizam uma variável de controle e métodos para solicitar e liberar acesso a recursos. São essenciais para lidar com problemas de concorrência na programação Java.
  • 109. Comunicação entre threads: semáforos e monitores Semáforos Os processos acontece da seguinte forma: Solicitação de acesso ao recurso Quando uma thread deseja acesso a um recurso compartilhado, ela invoca o método de solicitação de acesso. O número máximo de acessos ao recurso é dado pela variável de controle. Controle de acessos Quando uma solicitação de acesso é feita, se o número de acessos que já foi concedido for menor do que o valor da variável de controle, o acesso é permitido e a variável é decrementada. Se o acesso for negado, a thread é colocada em espera numa fila. Liberação do recurso obtido Quando uma thread termina de usar o recurso obtido, ela invoca o método que o libera e a variável de controle é incrementada. Nesse momento, a próxima thread da fila é despertada para acessar o recurso.
  • 110. Comunicação entre threads: semáforos e monitores Semáforos Desde a versão 5, Java oferece uma implementação de semáforo por meio da classe Semaphore. Métodos para acesso e liberação de recursos: Acquire () Método que solicita acesso a um recurso ou uma região crítica, realizando o bloqueio até que uma permissão de acesso esteja disponível ou a thread seja interrompida. Release () Método responsável pela liberação do recurso pela thread.
  • 111. Comunicação entre threads: semáforos e monitores Semáforos Semáforos e mutexes são mecanismos de exclusão mútua. Semáforos não verificam a origem da liberação, enquanto mutexes fazem essa verificação. Semáforos podem ser usados para enviar sinais entre threads.
  • 112. Comunicação entre threads: semáforos e monitores Monitores Monitores garantem exclusão mútua entre threads, tornando operações indivisíveis. Permitem cooperação entre threads, permitindo que uma thread espere por uma condição. Monitores em Java são implementados com a palavra-chave "synchronized". Regiões de código monitoradas com "synchronized" são consideradas thread-safe.
  • 113. Comunicação entre threads: semáforos e monitores Monitores Em Java, todo objeto possui um wait-set associado que implementa o conceito de conjunto de threads. Essa estrutura é utilizada para permitir a cooperação entre as threads, fornecendo os seguintes métodos: Wait () Adiciona a thread ao conjunto wait-set, liberando a trava que aquela thread possui e suspendendo sua execução Notify () Acorda a próxima thread que está aguardando na fila e garante o acesso exclusivo à thread despertada. Notifiall () Faz basicamente o mesmo que o método notify (), mas acordando e removendo todas as threads da estrutura de espera
  • 114. Objetos imutáveis Objetos imutáveis não podem ter seu estado modificado após a criação. Java oferece classes imutáveis, como o tipo String, e classes mutáveis, como StringBuffer e StringBuilder. Vantagens dos objetos imutáveis incluem segurança, simplicidade na coleta de lixo e thread-safety. Para criar objetos imutáveis, evite métodos "set", declare campos privados e finais, e marque a classe como final ou o construtor como privado.
  • 115. Implementação de threads A classe Thread é essencial para programação paralela em Java. Ela possui campos para definir prioridades de threads. Contém métodos importantes, como start() para iniciar a thread, run() para definir o código a ser executado e sleep() para pausar a thread temporariamente. A implementação de threads em Java envolve a criação de equipes de threads e o uso de semáforos e CountDownLatch para controle.
  • 116. Considerações gerais Programação paralela em Java é desafiadora, pois envolve múltiplas linhas de execução e a possível ocorrência de condições de corrida. Java oferece mecanismos de sincronização de threads, mas seu uso correto é crucial, o que pode ser complicado em programas maiores e com muitas threads. Erros em programação paralela são difíceis de localizar, tornando a depuração mais complexa devido à natureza do sistema. A mentalidade sequencial pode não ser adequada, já que a execução paralela requer uma abordagem diferente.
  • 117. Considerações gerais Há algumas práticas simples que podem auxiliar o programador a evitar os erros, como: Escolha da IDE Uso da UML Atenção aos detalhes
  • 118. Integração com banco de dados em Java
  • 119. Conceitos Front-end e back-end  Front-end se concentra na interface do usuário e utiliza linguagens de programação, como Java, para criar essa interação.  Back-end engloba tecnologias, como bancos de dados e sistemas de mensageria, que fornecem recursos específicos, não visíveis ao usuário.
  • 120. Conceitos Middleware Middleware é uma camada de software intermediária que conecta front-end e back- end em sistemas com diversidade de componentes e modelos de programação. No contexto Java, o JDBC é um exemplo de middleware que permite acessar vários tipos de bancos de dados sem alterar o código, usando SQL padronizado. Manter a sintaxe padronizada pela SQL ANSI ao usar o JDBC evita a necessidade de modificar o front-end ao trocar fornecedores de back-end. Middleware facilita a integração e promove a flexibilidade ao permitir mudanças de fornecedor com poucas ou nenhuma modificação de código.
  • 121. Conceitos Banco de dados Derby  Derby (Java DB) é um banco de dados relacional em Java distribuído com o JDK, adequado para aplicativos Java e transações online.  No NetBeans, é fácil criar e gerenciar bancos de dados Derby, com instâncias configuráveis, tabelas e registros.  O NetBeans oferece uma interface para visualmente inserir dados em tabelas, tornando o processo mais acessível.  Derby é uma opção eficiente para aplicativos Java que exigem um banco de dados embutido e leve.
  • 122. Java database connectivity (JDBC) Componentes do JDBC JDBC (Java Database Connectivity) oferece componentes essenciais para acessar bancos de dados a partir de aplicativos Java. Os principais componentes do JDBC incluem DriverManager, Connection, Statement, PreparedStatement e ResultSet. Existem quatro tipos de drivers JDBC: JDBC-ODBC Bridge, JDBC- Native API, JDBC-Net e Pure Java. O uso do JDBC envolve quatro etapas simples: instanciar o driver, obter uma conexão, criar um executor SQL e executar comandos DML para interagir com o banco de dados.
  • 123. Orientação a objetos e o modelo relacional Bancos de dados seguem o modelo relacional, eficaz para consultas, mas não para programação orientada a objetos. Para integração, criamos classes de entidade que mapeiam tabelas e seus registros em objetos. Isso é chamado de mapeamento objeto- relacional. Permite manipular dados como objetos, facilitando a programação orientada a objetos.
  • 124. Data Acess Object (DAO) Banco de Dados Derby é um sistema relacional em Java, útil para aplicativos Java. A conversão de bancos de dados relacionais para programação orientada a objetos envolve o mapeamento objeto-relacional. Mapear tabelas para classes de entidade torna possível lidar com dados de maneira orientada a objetos. O padrão DAO (Data Access Object) concentra operações SQL em classes, facilitando a organização e reutilização de comandos de banco de dados.
  • 125. Java Persistence Architecture (JPA)  Java Persistence Architecture (JPA) é uma arquitetura Java para mapear objetos em bancos de dados relacionais.  Frameworks de persistência, como Hibernate e Entity Framework, automatizam tarefas de persistência de dados.  JPA é a arquitetura padrão de persistência em Java, permitindo mapeamento objeto-relacional e consultas em JPQL.  Anotações, como @Entity e @Table, simplificam o mapeamento entre classes Java e tabelas do banco de dados.
  • 126. Sistema cadastral simples  A classe AlunoDAO pode ser usada para criar um sistema de cadastro simples em modo texto.  O método exibirTodos usa notação lambda para percorrer a coleção e exibir suas informações.  O método main permite ao usuário escolher as opções de operação, ativando os métodos correspondentes.
  • 127. Gerenciamento de transações Gerenciamento de transações I  O controle transacional garante a consistência em conjuntos de operações.  Uma transação envolve operações seguidas por uma confirmação (commit) ou reversão (rollback).  O uso de transações simplifica o processo de desfazer operações após um erro, garantindo a integridade dos dados no banco de dados.
  • 128. Gerenciamento de transações Gerenciamento de transações II  O uso de transações pode ser implementado para garantir a consistência e a reversão de operações no banco de dados.  Em JDBC, o controle transacional envolve desativar a confirmação automática (autoCommit), usar commit e rollback.  No JPA, o controle transacional segue princípios semelhantes, com begin, commit, rollback, e close, simplificando o processo em comparação com o JDBC puro.
  • 129. Sistema com JPA no NetBeans  O NetBeans oferece ferramentas de produtividade, como um gerador automático de entidades JPA.  Para usá-lo, você pode criar um projeto Java e seguir etapas, como escolher as tabelas de interesse, definir um pacote e gerar a entidade JPA.  Além disso, o NetBeans permite gerar um DAO automaticamente para as entidades, simplificando a manipulação dos dados.  As operações de manipulação de dados são realizadas a partir do EntityManager, com métodos correspondentes aos comandos SQL (insert, update, delete).