Escolar Documentos
Profissional Documentos
Cultura Documentos
SEMANA 1
Orientada a Objetos
entender a diferença entre os paradigmas de programação estruturada, não estruturada e o paradigma
de programação orientada a objetos;
tratar de alguns frameworks de desenvolvimento para facilitar a criação de aplicações segundo o
paradigma de orientação a objetos.
Programação orientada a objetos, também conhecida por sua sigla POO, facilita a relação da máquina com
o mundo real. Isso porque qualquer coisa que pertence ao mundo físico pode ter um representante na
esfera digital: uma pessoa, um emprego, um objeto, enfim, são infinitas as possibilidades. Essas “coisas” são
o que chamamos de objetos na POO. O enfoque da modelagem de sistema por objetos procura
enxergar o mundo como um conjunto de objetos que interagem entre si e apresentam
características e comportamentos próprios representados por seus atributos e suas operações.
Os atributos estão relacionados aos dados, e as operações, aos processos que um objeto executa.
PARADIGMAS DE COMPUTAÇÃO
FUNCIONAL DECLARATIVA
Programadores abstraem o programa Programador modela o problema por meio
como uma sequência de funções de assertivas em relação aos objetos do
executadas de modo empilhado. Trata da universo em questão: Exemplo: SQL e
computação como uma avaliação de HTML.
funções matemáticas, evitando estados ou
dados mutáveis.
PROCEDURAL
POO É baseado no conceito de chamadas a
Programação Orientada a Objetos é um procedimentos, conhecidos como rotinas,
modelo de análise, projeto e programação sub-rotinas, métodos. Um conjunto de
de software, baseado na composição e passos computacionais a serem
interação entre várias unidades conhecidas executados. Procedimentos podem ser
como objetos. chamados a qualquer momento durante a
execução do programa, inclusive por outros
procedimentos.
A troca de mensagens ocorre entre objetos, que são organizados de maneira hierárquica - por
tipo, função, características, entre outros - para aproximar o máximo possível tanto a linguagem
como o funcionamento da computação do mundo real. Ou seja, a organização desse tipo de
programação é similar àquela “que as pessoas utilizam para descrever objetos do mundo real” .
Na POO, todos os componentes de um programa são considerados objetos e todos os objetos
possuem estado, identidade, comportamento.
Reduzir os programas em partes resulta em metas mais fáceis de se alcançar. Os programas são
basicamente interações entre objetos, o que faz com que surjam padrões comuns.
CONCEITOS ASSOCIADOS
ABSTRAÇÃO:
Escondemos detalhes não essenciais, embora mostramos o que é mais relevante .
ENCAPSULAMENTO:
É a capacidade de juntar um determinado tipo de programa em partes, ou seja, o software tem
pedaços isolados entre si, que podem ser acessados de modo independente. O resultado disso
é a garantia de mais flexibilidade e facilidade quando surgem modificações nos programas, por
exemplo. A parte interna de um código não fica acessível para outras partes, com o intuito de
proteger e manter a sua integridade. Todas as operações a serem feitas pelo usuários devem ser
feitas por uma interface bem definida. Apresenta diversas camadas de abstração, dependendo
do que é relevante.
Objetos correspondem a elementos da vida real e classes agrupam esses objetos. Assim, quando
falamos de carro, e só de carro, estamos falando de uma classe. Isso porque não especificamos as
características do veículo, então, várias características podem estar contidas - o que importa é que se trata
de um carro. Em cada classe, temos atributos, objetos que se referem a elas. Em relação aos métodos,
ou seja, o que o objeto reúne em termos de regras sobre seus atributos e operações. Ele diz ao objeto
como ele deve se comportar com o recebimento da mensagem. Os próprios métodos são objetos em si.
Portanto, a vantagem desse tipo de organização é permitir que o programa altere um objeto em si,
iidentificando-o dentro de uma classe e solicitando uma a lteração do método, a partir de uma
mensagem. “Os métodos podem ter parâmetros para fornecer informações adicionais para uma tarefa” .
Tome como exemplo os famosos métodos set e get. O primeiro sinaliza que uma informação está
sendo enviada. Já o segundo aponta uma informação sendo recebida. Getters e Setters são funções que
tornam possível OBTER e ALTERAR o atributo.
Generalização e Especialização:
Quando um objeto é identificado com atributos e operações semelhantes em nosso sistema, diz-se que
pode ser agrupado em uma classe. Este processo é chamado de generalização. Por outro lado, pode
ocorrer que um objeto, ao ser identificado, constitua-se, na verdade, de uma classe de objetos, visto que
dele podem se derivar outros objetos. Já esse processo é chamado de especialização.
Private: visível exclusivamente dentro da classe. Public: completamente visível dentro e fora da classe
Protected: visível apenas dentro da classe, pelos seus herdeiros e pelas classes no mesmo pacote
Padrão: visível apenas dentro da classe e pelas classes que estão no mesmo pacote.
descreve um conjunto de objetos semelhantes
CLASSE: é um molde para os objetos. As classes são moldes que permitem a criação de novos
objetos e descrevem as características comuns de vários objetos. Os objetos que pertencem a uma
classe. Eles são chamados de instâncias de classes
MÉTODO: operações que podem ser executadas pelos objetos e dão acesso aos VALORES
DOS ATRIBUTOS.
POLIMORFISMO ABSTRAÇÃO
É um princípio em que um organismo pode surgir de formas Ignora o que não é relevante e concentra-
distintas. Indivíduos da mesma espécie possuem se apenas nos aspectos principais do
características similares. Em POO, a mesma operação (método) problema. Classes são abstrações de
comporta-se de modo diferente nas diferentes classes de uma conceitos
hierarquia
ENCAPSULAMENTO
MENSAGENS Capacidade de implementar dados e
Quando um objeto emissor transmite uma
HERANÇA
procedimentos que se correlacionam numa
requisição para um objeto receptor para que este Caracteriza-se pela mesma entidade. A ideia é não depender
execute um comportamento (método) desejado. O hierarquização das do funcionamento interno, mas sim da sua
objeto receptor precisa já ter os métodos definidos. classes em um interface
Os métodos respondem a um retorno à chamada. sistema.
traz modularidade e ocultação da informação que indica a única parte do objeto que
ENCAPSULAMENTO
pode ser acessada pelo mundo externo, deve ser feita por meio de operações.
“Na programação orientada a objetos, os objetos
comunicam-se entre si através de mensagens. A Interface descreve como as partes do objeto se
única coisa que um objeto conhece sobre outro relacionam com o exterior.
objeto é a sua interface de comunicação. Os Implementação: dados e código que
dados e a lógica de cada objeto são mantidos implementam o comportamento dos objetos da
escondidos dos outros objetos. Em outras classe; esta parte não é visível externamente.
palavras, a interface encapsula o código e os
dados do objeto”
O encapsulamento é um conceito da POO em que os estados dos objetos (variáveis de classe) e seus
comportamentos (métodos da classe) são agrupados em conjunto segundo o seu grau de relação.
Ocorre através de dois métodos:
SETTERS: recebe como argumento uma informação que pode ser qualquer
tipo de dado suportado pela linguagem, o que evita acessos indevidos.
Servem para alterar a informação de uma propriedade de um objeto.
GETTERS: retorna o valor que lhe foi solicitado, mas não prejudica a
integridade do dado. Servem para retornar o valor dessa propriedade
EXEMPLO DE APLICAÇÃO
Classe Bola
Atributos
material → string
cor → string
tamanho → inteiro
cheia → boolean
Métodos
Bola(String material, String cor, int tamanho, boolean cheia) –> sobrecarga
pintar()
encher()
esvaziar()
Aprender a criar novas classes a partir de classes já existentes,
aproveitando-se das características existentes na classe a ser estendida;
Entender que o conceito de polimorfismo permite ao desenvolvedor usar o SEMANA 3
mesmo elemento de formas diferentes e que o conceito denota uma
situação na qual um objeto pode se comportar de maneiras diferentes ao
receber uma mensagem;
Compreender que interface é um recurso da linguagem Java que apresenta
inúmeras vantagens no sentido da modelagem e instanciação de objetos.
HERANÇA:
Uma nova classe de objetos pode ser criada por meio de herança - essa nova classe (chamada
de subclasse) começa com as características de uma classe existente (chamada superclasse)
através da sua personalização e adição de aspectos próprios. Em outras palavras, a herança é
uma maneira de reutilizar o código onde uma nova classe é criada absorvendo os membros
de uma classe já existente que são aprimoradas com novas ou melhores capacidades.
Construtores em subclasses: o papel do construtor é
chamar o construtor da superclasse direta, especificando
os elementos que você deseja que façam parte da classe
herança.
Membros protegidos:
Public: podem ser acessados de qualquer parte do programa que tenha uma referência ao objeto ou
subslasse de uma classe.
Private: só podem ser acessados dentro da própria classe a que eles pertencem. Por isto, eles não são
herdados por subclasses nem podem ser chamados por outros membros ligados a ela.
Protected: nível intermediário que oferece permissões médias sendo possível garantir que os
membros de uma superclasse possam ser acessados apenas por subclasses e outros membros ligados
a ela.
Generalização: quando várias subclasses utilizam os
mesmos atributos (elementos) de uma superclasse.
Especialização: ocorre quando subclasses ligadas a
uma mesma superclasse apresentam diferenças entre
si. Por isso, é preciso especificar essas diferenças em
linha de código.
Superclasses Abstratas: criadas apenas para
organizar a hierarquia das heranças que apesar de não
terem uma função ativa, ajudam a evitar a duplicação
do código.
Vantagens da Herança:
Permite o reuso de software;
Sem a necessidade de escrever o mesmo código novamente;
Pode especializar soluções gerais já existentes;
Todo objeto da subclasse é um objeto da superclasse (classe mãe).
A classe filha herda todos os membros da classe mãe.
Podemos declarar um campo na classe filha com o mesmo nome da classe mãe, mesmo que os tipos sejam
diferentes.
Também podemos declarar novos métodos e campos na classe filha, o que denomina-se de
especialização.
Podemos sobrescrever um método da classe mãe, declarando um método com a mesma assinatura, o que
chamamos de polimorfismo
POLIMORFISMO é a capacidade dos objetos responderem a uma mesma mensagem (chamada de
métodos) de modos distintos.
A JVM (Java Virtual Machine) procura a implementação mais especializada do método, seguindo a
hierarquia, ou seja, de baixo para cima. Da classe mais específica (filha) para a classe mais genérica (classe
mãe). Se o método não for definido na classe filha, procura-se pela implementação da classe mãe. •
Quando um método é sobrescrito na classe filha, ele passa a ter o comportamento padrão dessa classe,
embora seja possível acessar o método da superclasse.
Overriding: Quando isso ocorre, o método da classe mãe fica sobreposto.
public class Carro { SUPER: aproveitar o comportamento definido pela classe
private int velocidade; mãe, chamamos a implementação da classe mãe. É usado
public Carro(int velocidadeInicial) { para acessar campos e métodos da superclasse (Campos
velocidade = velocidadeInicial; ocultos, Métodos sobrescritos (polimorfismo) e Construtores
} da superclasse).
public void acelera() {
velocidade++; THIS: pode ser usada para referenciar o próprio objeto,
} permitindo distinguir variáveis locais e campos do objeto que
public void freia() { contém os mesmos nomes.
velocidade--;
} FINAL: Métodos final não podem ser sobrescritos. A palavra
} chave final ou o modificador final significa que o método
definido com ela não poderá ser sobrescrito em uma
public class CarroCorrida extends Carro { subclasse. Este modificador pode ser aplicado em classes,
public CarroCorrida(int velocidadeInicial) { métodos e atributos. Métodos privados são apenas acessíveis
super(velocidadeInicial); dentro da classe definida, não sendo possível sobrescrever
} um método private em uma subclasse, quando usamos o
modificador final.
public void acelera() {
velocidade+=5; }
}
CarroCorrida x = new CarroCorrida();
x.acelera();
INTERFACE:
São coleções de métodos relacionados que normalmente permitem informar aos objetos o
que fazer, mas não como fazer. Uma classe implementa zero ou mais interfaces (cada uma
pode ter um ou mais métodos). É a especificação de um nome ou de um conjunto de métodos
que não define nenhuma implementação para os métodos ligados a ela. Interfaces não
possuem construtores e possuem visibilidade pública.
O conceito principal de interface tem por objetivo criar um contrato em que a classe que a
implementa deve obrigatoriamente obedecer. Utilizamos a palavra reservada interface.
No contexto de interface, quando programamos um software não importa como a
implementação será feita, pois:
O importante é saber a definição do contrato
Garantir que o software desenvolvido por um grupo se comunica com o outro por meio
deste contrato.
As interfaces deixam também o código mais reutilizável, já
public interface MinhaPrimeiraInterface { que uma única classe pode trabalhar com várias outras por
public void metodo1(); meio de uma única interface. Em interfaces, qualquer
public int metodo2(); método sempre é public. Para classes que não têm relação
public String metodo3(String parametro1); entre si, ou seja, não há uma relação forte (herança), usa-se
} interfaces
Usamos classes abstratas quando desejamos definir uma classe mais geral,
CLASSES ABSTRATAS
representando objetos de modo mais genérico, porém, sem instanciá-los.
Outro ponto importante é que métodos abstratos também podem ser
definidos em uma classe. Para isso, a classe precisa ser abstrata. Ela só não
abstract class Conta {
private double saldo; pode ser instanciada. Se é preciso oferecer atributos, é melhor usar classes
public void setSaldo(double saldo) { abstratas, uma vez que com herança os atributos serão herdados.
this.saldo = saldo;
}
public double getSaldo() {
return saldo;
}
public abstract void imprimeExtrato();
COLEÇÕES: é uma estrutura de dados — na realidade, um objeto — que pode armazenar referências a
outros objetos. Normalmente, coleções contêm referências a objetos de qualquer tipo que tem o
relacionamento é um com o tipo armazenado na coleção. As interfaces de estrutura de coleções
declaram as operações a ser realizadas genericamente em vários tipos de coleções.
As classes e interfaces da
estrutura das coleções são
membros do pacote java.util.
Genéricas: para eliminar o
problema das referências
Object obtidas de uma
coleção coleção em geral precisam sofrer downcast em um tipo apropriado para permitirem que o
programa processe os objetos corretamente. O downcasting deve ser evitado. Coleções Genéricos
permitem especificar o tipo exato que será armazenado em uma coleção e fornecem os benefícios da
verificação de tipo em tempo de compilação — o compilador emite mensagens de erro se você usar
tipos inadequados nas coleções. Depois de especificar o tipo armazenado em uma coleção genérica,
qualquer referência que você recupera da coleção terá esse tipo. Isso elimina a necessidade de
coerções de tipo explícitas que podem lançar ClassCastExceptions se o objeto referenciado não for
do tipo apropriado. Além disso, as coleções genéricas são retrocompatíveis com o código Java que foi
escrito antes que genéricos tenham sido introduzidos.
Classes Empacotadoras: Essas classes chamam-se Boolean , Byte , Character , Double ,
Float , Integer , Long e Short . Elas permitem manipular valores detipo primitivo como objetos.
as classes empacotadoras de tipo são classes final , então não é possível estendê-las.
Autoboxing e auto-unboxing: convertem automaticamente entre valores de tipo primitivo e objetos
empacotadores de tipo. Uma conversão boxing converte um valor de um tipo primitivo em um objeto
da classe empacotadora de tipo correspondente. Uma conversão unboxing converte um objeto de
uma classe empacotadora de tipo em um valor do tipo primitivocorrespondente.
Interface Collection e classe Collections; a interface contém operações de volume (isto é,
operações realizadas na coleção inteira ) para operações como adicionar , limpar e comparar
objetos (ou elementos) em uma coleção. Uma Collection também poder ser convertida em um array.
Além disso, a interface Collection fornece um método que retorna um objeto Iterator , que permite
a um programa percorrer a coleção e remover elementos da coleção durante a iteração. A classe
Collections fornece métodos static que pesquisam, classificam e realizam outras operações sobre
as coleções.
Listas: é uma Collection ordenada que pode conter elementos duplicados. Comoos arrays, índices
de List são baseados em zero (isto é, o índice do primeiro elemento é zero). Além dos métodos
herdados de Collection , List fornece métodos para manipular elementos por meio de seus índices,
manipular um intervalo especificado deelementos, procurar elementos e obter um ListIterator para
acessar os elementos.A interface List é implementada por várias classes, inclusive as classes
ArrayList , LinkedList e Vector.
Método de Coleções:
Classe Stack: estende a classe Vector para implementar uma estrutura de dados de pilha.
Classe PriorityQueue e interface Queue: Lembre-se de que uma fila é uma coleção que representa
uma fila de espera — normalmente, inserções são feitas na parte de trás de uma fila e exclusões são
feitas a partir da frente. Na Seção 21.6, discutiremos e implementaremos uma estrutura de fila de
dados. Nesta seção, investigamos a interface Queue do Java e a classe PriorityQueue do pacote
java.util . A interface Queue estende a interface Collection e fornece operações adicionais para inserção,
remoção e inspeção de elementos em uma fila. PriorityQueue , que implementa a interface Queue ,
ordena elementos por sua ordem natural como especificado pelo método compareTo dos elementos
Comparable ou por um objeto Comparator que é fornecido pelo construtor.A classe PriorityQueue
fornece funcionalidades que permitem inserções na ordem de classificação na estrutura de dados
subjacente e exclusões a partir da frente da estrutura de dados subjacente. Ao adicionar elementos a
uma PriorityQueue , os elementos são inseridos na ordem de prioridade de tal modo que o elemento de
maior prioridade (isto é, o maior valor) será o primeiro elemento removido da PriorityQueue .As
operações PriorityQueue comuns são offer , para inserir um elemento na posição apropriada com base
na ordem de prioridade, poll para remover o elemento de mais alta prioridade da fila de prioridade (isto
é, a cabeça da fila), peek para obteruma referência ao elemento de mais alta prioridade da fila de
prioridade (sem remover esse elemento), clear para remover todos os elementos da fila de prioridade e
size , para obter o número de elementos da fila de prioridade.
EM SÍNTESE
Métodos genéricos e classes genéricas (e interfaces) permitem especificar, com uma única declaração de
método, um conjunto de métodos relacionados ou, com uma única declaração de classe, um conjunto de
tipos relacionados, respectivamente.
Iterator: Prover uma forma de seqüencialmente acessar os elementos de uma coleção sem expor sua
representação interna
Java Collections Framework: Arquitetura unificada para representar e manipular coleções,
de forma independente dos detalhes de sua representação.
As COLEÇÕES são objetos que agrupam vários elementos. Com as Collections utilizamos estruturas de
dados existentes, sem nos preocuparmos com a maneira como são implementadas. São dinâmicas, isto é,
podem crescer conforme a necessidade de expansão.
A interface Collection, terão obrigatoriamente que fazer a implementação de diversos métodos que
manipulam coleções de dados, tais como adicionar e remover elementos.
INTERFACE COLLECTION
A Collection é o topo da API Collections, sendo disponível no pacote java.util. As Collections podem ser
organizadas e/ou Ordenadas. Quando organizadas: garante que as coleções serão percorridas na mesma
ordem em que os elementos foram inseridos.
O padrão Generics é aceitar qualquer tipo de elemento, incluindo elementos distintos (String, Double,
Integer)
HashSet: Armazena elemento numa tabela Hash e sem garantias de ordem dos
elementos
LinkedHashSet: Utiliza a tabela hash como uma lista ligada. Mantém a ordem de
inserções dos elementos
For-each: Trata-se de um ciclo for, embora adaptado para ser utilizado em Collections. Server para
percorrer todos os elementos de qualquer Collection contida na API Collections.
Iterator: É uma interface presente no java.útil que permite percorrer coleções da API Collection, desde
que implementam a Collection. Fornece métodos como next(), hashnext(), remove().
A função de objetos do tipo Iterator é permitir percorrer e remover elementos de uma coleção. Toda
coleção possui um método que retorna um Iterator. Os métodos podem ser:
hasNext() • Retorna true se há elementos a serem lidos no iterador
next() • Retorna o próximo elemento do iterador
void remove() • Remove o último elemento obtido pela chamada de next() • Só é possível chamar uma
vez para cada chamada de next() • Se essa regra for desrespeitada, uma exceção é lançada
VANTAGENS: não depende do tipo de coleção • a Interface Collection provê método iterator() o
que permite criar uma solução genérica • Não são todas as coleções que têm um método de
remoção por índice como List e cada coleção possui uma maneira de percorrer os elementos
Considere agora que as necessidades da nossa lista de animais foram modificadas e que, precisamos, além
do nome do animal, o tipo e sua cor. Defina então uma classe denominada Animais e modifique a classe
ListaAnimais de maneira que a lista possa adicionar objetosAnimais ao invés de String. Ao final, exiba a lista
de animais.
GENERICS
Podemos reusar código para diferentes tipos e evita o uso de casting. Os tipos genéricos referem-se a uma
classe ou interface parametrizada sobre tipos. Em uma classe que não usa Generics, qualquer objeto pode
ser utilizado.
Declaração e Instanciação de um tipo genérico:
Deve especificar qual o tipo desejado • É parecido à chamada de um método ou construtor, para qual
passamos parâmetros • Mas em Generics, o parâmetro é um tipo (classe ou interface)
É importante frisar que quando utilizado em métodos, o tipo genérico pertence ao escopo daquele
método. Não é possível utilizar o tipo em outros métodos. Não é possível instanciar um tipo genérico
utilizando tipos primitivos
COLEÇÕES
O programador simplesmente utiliza as estruturas de dados sem se preocupar com a maneira como são
implementadas. Basicamente, são objetos capazes de armazenar conjuntos de referências para outros
objetos
INTERFACES: Definem métodos que podem ser usados para manipulação dos objetos nas
coleções
elementos; • Pesquisa de elementos; A lista fornece o método get() para O mapa não fornece o método get para
Set não fornece método get para obter
Os três grandes tipos de coleções
obter o elemento em um índice obter os elementos em um índice
os elementos em um índice especificado
especificado. especificado
são: • Lista ( também chamado de Se você precisa acessar os elementos Se você deseja criar uma coleção de Se você quiser armazenar os dados na
“sequência“); • Conjunto; • Mapa( com frequência usando o índice,
podemos usar a lista
elementos únicos, podemos usar o
conjunto
forma de par chave / valor, podemos
usar o mapa.
também chamado de “dicionário“).
Para percorrer os elementos da lista O iterador pode ser usado através dos Por meio do conjunto de chaves, valor
usando Listlterator. elementos definidos e conjunto de entrada.
ArrayList: implementa uma lista de objetos num vetor cujo tamanho pode variar dinamicamente (!). é mais
adequada em situações onde o acesso aleatório aos elementos é mais freqüente. A implementação do vetor
de ‘tamanho variável’ é cara.
LinkedList: implementa uma lista de objetos sob a forma de uma lista ligada, é mais adequada em casos
onde o acesso aleatório não é freqüente e o tamanho da lista pode variar muito.
Um conjunto funciona de forma análoga aos conjuntos da matemática
Trata-se de uma Collection que não permite elementos duplicados
CONJUNTOS:
A ordem em que os elementos são armazenados pode não ser a mesma ordem em que os
elementos foram inseridos no conjunto
Ao percorrer um conjunto a sua ordem não é conhecida
Velocidade na pesquisa de dados é mais rápida que um objeto do tipo List;
Não precisa especificar a posição para adicionar um elemento;
Não aceita valores duplicados. Se caso inserir um registro que já tenha no Set não será
adicionado.
HashSet: A classe HashSet que é implementada na estrutura de coleta é uma implementação inerente da
estrutura de dados da tabela de hash . Os objetos que inserimos no HashSet não garantem que sejam
inseridos na mesma ordem. Os objetos são inseridos com base em seu hashcode. Esta classe também
permite a inserção de elementos NULL. Vamos ver como criar um objeto definido usando esta classe.
LinkedSet: A classe LinkedHashSet que é implementada na estrutura de coleções é uma versão ordenada
de HashSet que mantém uma lista duplamente vinculada em todos os elementos. Quando a ordem de
iteração precisa ser mantida, essa classe é usada. Ao iterar por meio de um HashSet, a ordem é imprevisível,
enquanto um LinkedHashSet nos permite iterar através dos elementos na ordem em que foram inseridos.
Vamos ver como criar um objeto definido usando esta classe.
import java.util.HashSet;
import java.util.set;
Mapa é um tipo especial de coleção que armazena pares de objetos (chave + valor)
Principais métodos:
Object put(Object key, Object value): associa uma chave a um valor no mapa. Se a chave
já estiver presente o novo valor substitui o anterior e retorna o valor antigo ou null, caso
MAPS
Definição de Exceção: Uma exceção é um evento indesejado que interrompe o fluxo normal do
programa. Quando ela ocorre, a execução do programa é encerrada.
DIFERENÇA
ERRO EXCEÇÃO
indicam que algo grave o suficiente são eventos que ocorrem no código.
deu errado, o aplicativo deve travar Um programador pode lidar com
em vez de tentar lidar com o erro tais condições e tomar as ações
corretivas necessárias.
O tratamento de exceções se refere aos erros em tempo de execução
Sempre que um erro ocorre, uma exceção (objeto) é criada e lançada, a exceção (objeto) encapsula
as informações do erro. Essa exceção deve ser capturada em algum momento
O método utilizado no JAVA é o bloco try-catch, try-catch-finally
Processo: quando ocorre uma exceção, o método cria um objeto de exceção e passa para o sistema
de runtime do java (lança a exceção). A execução do programa congela naquele ponto e o runtime
procura o trecho de código mais próximo que seja capaz de capturar uma exceção daquele tipo. Se a
busca chegar ao main e não encontrar quem capture a exceção, o programa termina.
Tipos de Exceção
Todas as exceções, exceto Runtime Exceptions, são conhecidas como exceções
CHECKED
verificadas, pois o compilador as verifica durante a compilação para ver se o programador
as manipulou ou não. Se essas exceções não forem tratadas / declaradas no
programa, você obterá um erro de compilação. Exemplos: SQLException,
IOException, ClassNotFoundException etc. São criadas prevendo que determinada ação
possa falhar
As exceções de tempo de execução também são conhecidas como exceções não
UNCHECKED
verificadas. Essas exceções não são verificadas em tempo de compilação, então o
indicam um erro de
programa, prevendo
compilador não verifica se o programador as manipulou ou não, mas é responsabilidade
falhas que não do programador lidar com essas exceções e fornecer uma saída segura. Exemplos:
deveriam acontecer em
uma operação normal.
ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException. Todas as
subclasses da segunda categoria estão ligadas à classe-padrão RunTimeException.
Exception: Precisam ser tratadas, pois são
situações excepcionais em um programa que
podem ser contornadas.
RuntimeException: Representam erros
internos na aplicação, mas que em geral não
são tratáveis pelo programador (erros na
programação ou do API JAVA).
Error: Representam erros externos à aplicação,
que não são contornáveis pelo programador
(Falha na leitura de um arquivo por um
problema de hardware).
lly
na
/fi
tch
ca
t ry/
om
p loc
x em
E
REPASSAR EXCEÇÃO: Caso não
desejamos capturar e tratar
exceções, podemos repassá-las
na pilha de chamadas. Para isso,
o método precisa ser
explicitamente declarado que
lança um ou mais tipos de
exceções. Obrigatório
para o tipo checked.
STREAMS
Representam o fluxo contínuo de dados de entrada e saída. Baseiam-se no fluxo unidirecional de
dados, podendo ser de diferentes tipos (primitivos ou objetos).
STREAM DE BYTE: De baixo nível, STREAM DE CHAR: Descendem de Reader e
descendem de InputStream e OutputStream. Writer.
Stream de bytes faz a leitura e Stream de caracteres converte o dado que foi lido para caracteres. Não usam
buffer o que torna o processo mais lento.
usa buffers de memória
• Leitura: Requisitou dado pra ler, pega do buffer.• Escrita: Requisitou a escrita de um dado, escreva
Quando o buffer esvaziar, novos dados serão dados no buffer. Quando o buffer estiver cheio, os
carregados do arquivo para o buffer dados serão descarregados para o arquivo
BufferedInputStream (byte) STREAM DE OBJETO: objetos inteiros podem ser lidos ou
BufferedOutputStream (byte) escritos (gravados). Um objeto pode converter diversos
BufferedReader (caracteres) campos de tipos primitivos ou outros tipos objetos. Estes
BufferedWriter (caracteres) também podem conter outros objetos ObjectInputStream
STREAM DE API: introduzido no JAVA 8 e usado para • ObjectOutputStream
processar coleções de objetos
Streams não alteram a estrutura de dados original, eles apenas fornecem o resultado de acordo
com os métodos em pipeline.
Operações para Intermediação: map (usado para retornar um fluxo que consiste nos resultados da
aplicação da função dada aos elementos deste fluxo), filtro (usado para selecionar elementos de acordo
com o Predicado passado como argumento) e ordenado (usado para ordenar o fluxo).
Operações para lidar com Terminal: collect (usado para retornar o resultado das operações
intermediárias executadas no stream), forEach (itera em cada elemento do fluxo) e reduce (reduzir os
elementos de um fluxo a um único valor. O método de redução usa um BinaryOperator como parâmetro).
SERIALIZAÇÃO E DESSERIALIZAÇÃO
Utilizado para a leitura e gravação de objetos. O objeto serializado é representado como uma sequência de
bytes. Após a serialização, o objeto pode ser gravado utilizando o stream. Além disso é possível gravá-lo em
um arquivo, transportado por uma rede ou armazenado em um banco de dados.
Objetos serializados podem também serem desserializados, voltando a ser um objeto na memória.
A API de serialização Java fornece os recursos para realizar a serialização e desserialização.
Uma classe deve implementar a interface java.io.Serializable para ser elegível para serialização
A interface Serializable não possui métodos, sendo somente uma interface de marcação
Todos os tipos PRIMITIVOS são serializáveis.
A classe ObjectOutputStream é usada para serializar um objeto.
• O exemplo ExemploSerializacao instancia um objeto Funcionario e o objeto
é serializado em um arquivo.
• Após a execução do programa, ele cria um arquivo chamado
funcionario.ser.
• Este programa não tem saída, mas você pode ler o código para entender a
função de um programa.
• Importante: Quando um objeto é serializado para um arquivo, a convenção
do Java padrão é utilizar a extensão .ser
Permite que o sistema operacional consiga dividir as tarefas entre todos os processadores disponíveis
aumentando, assim, a eficiência do processo.
Simplifica a modelagem
No processamento assíncrono (segundo plano) é possível atender a mais de um cliente ao mesmo tempo
MÉTODOS
PROGRAMAÇÃO JAVA PARA REDES DE COMPUTADORES
A programação declarativa utiliza palavras-chave, também conhecidas como tags ou assertivas, e é muito
utilizada como linguagens de marcação e para a busca de dados em bancos de dados, como a linguagem
SQL. A programação funcional é organizada em funções e utiliza a lógica tradicional de programação, sem
usar assertivas. A programação orientada a objetos trabalha com classes que funcionam como moldes
para os objetos existentes no mundo real. Na programação procedural o foco está na execução de
procedimentos.
A afirmativa I é verdadeira, pois o método “main” é responsável por tornar uma classe Java executável que
tenha um identificador válido. A afirmativa II é falsa, pois o método “main” deve ser usado uma única vez,
dentro de uma classe Java. A alternativa III é verdadeira, pois o método “main” deve ser declarado dentro
de uma classe que tenha um identificador válido, é declarado de forma pública, para que seja visto pelo
comando de execução da classe, e deve ser declarado como estático. A alternativa IV é verdadeira, pois o
método “main(String[] args)” tem o parâmetro “args”, que é um vetor de strings.
A programação orientada a objetos tem importantes características, dentre elas, os pilares, que permitem
a criação de sistemas de complexidade, com menor esforço e maior assertividade. O encapsulamento é
um desses importantes pilares. Nesse sentido, analise as asserções a seguir e a relação proposta entre
elas. I. O encapsulamento de um objeto ocorre com a proteção dos atributos, por meio dos modificadores
de acesso private ou protected. Esses atributos são externalizados por meio de métodos de acesso. O
encapsulamento independe de classes derivadas.
Os objetos instanciados podem ter valores distintos em seus atributos, pois, apesar de serem baseados
na mesma classe, ocupam endereços distintos na memória. Uma classe é um modelo para a geração de
objetos que representam entidades do mundo real. Como podemos ter diversas instâncias na memória
de um objeto, podemos ter valores diferentes em seus atributos. Um objeto é uma instância de uma
classe, que é um molde para o objeto, por isso, classes e objetos não são sinônimos, em programação
orientada a objetos.
Na programação orientada a objetos, os principais conceitos são os de classes e objetos. As classes são o
molde do objeto que, ao ser criado, terá os mesmos atributos e métodos, mas poderão assumir diferentes
valores para seus atributos.
O método “main” é público, porém seu retorno é vazio. Além disso,
quem realiza o cálculo é o método “calculo”. O funcionamento dos
métodos “main” e “calculo” é independente do seu tipo de retorno;
nesse caso, o método “main” é vazio e o método “calculo” retorna
um valor inteiro. Os parâmetros utilizados por qualquer método
são considerados variáveis locais ao método. No caso do método
“calculo”, as variáveis são do tipo inteiro. No código apresentado,
as variáveis “a” e “b” não foram declaradas como atributos da
classe, mas como parâmetros do método “calculo”. A linguagem
Java é case-sensitive, ou seja, os identificadores “Calculo” e
“calculo” são interpretados como distintos pela linguagem.
A proposição I está correta, pois a palavra-chave “final” pode ser atribuída a classes (nesse caso, essa
classe não poderá ser herdada). A proposição II está correta, mas não justifica a primeira, pois o termo
“final” também pode ser empregado em métodos que não poderão ser sobrescritos em subclasses e ser
também aplicados aos atributos, transformando-os em constantes que não podem ter seus valores
originais substituídos.
Considerando a linguagem Java, com base na criação de uma subclasse “Onibus”, a partir de uma
superclasse “Transporte”, assinale a alternativa que apresenta o código correto.
public class Onibus extends Transporte
Na programação orientada a objetos, para que uma subclasse herde os atributos e métodos de uma
superclasse, é necessário utilizar o termo “extends”, que deve ser utilizado na definição da classe-filha:
public class Onibus extends Transporte. A classe que herda (filha) deve ser declarada antes da palavra
reservada “extends” e a superclasse deve ser declarada em seguida. Não se deve utilizar parênteses na
declaração de herança, pois não se trata de instanciação de um objeto. A palavra reservada “implements”
é utilizada para implementar métodos abstratos, ou seja, para outra finalidade, e não para herança.
A afirmativa I é verdadeira, pois um exemplo de polimorfismo ocorre quando um método da superclasse é
redefinido na subclasse ou quando um método tem o mesmo identificador, com parâmetros diferentes. A
afirmativa II é verdadeira, pois, se o método for sobrescrito na classe-filha, o compilador executará o
método da subclasse, porém, se não for sobrescrito, executará o método da superclasse. A afirmativa III é
falsa, pois, para que ocorra polimorfismo em classes herdadas, é necessário que os métodos tenham a
mesma assinatura. A afirmativa IV é verdadeira, pois um método pode ter a mesma assinatura na classe-
mãe e na filha e pode ter o comportamento diferente em ambas. No caso de ser um método sobrescrito
na classe-filha, esse será o novo comportamento do método.
A afirmativa I é verdadeira, pois, com o paradigma da herança, é possível declarar atributos com os
mesmos identificadores, porém com tipos diferentes; a linguagem interpreta o tipo de dado mais
especializado. A afirmativa II é verdadeira, pois, ainda com base nesse conceito, também é possível que
uma classe-filha sobrescreva um método definido na classe-mãe. A afirmativa III é verdadeira, pois a
classe-filha pode ter novos atributos ou métodos não presentes na classe-mãe. A afirmativa IV é
verdadeira, pois, ao herdar uma classe, a subclasse herda todos os atributos e métodos da classe-mãe.
A sentença 1 se enquadra no conceito III, pois os métodos “add” e “offer” são responsáveis por inserir um
elemento na fila ou lista. A sentença 2 se enquadra no conceito I, pois os métodos “remove” e “poll”
removem e retornam o elemento do início. A sentença 3 se enquadra no conceito II, pois os métodos
“element” e “peek” retornam, porém não removem, o elemento do início.
Na programação orientada a objetos, o uso de classes e
métodos genéricos pode reduzir o código de programação e
prevenir erros, como é o caso do código apresentado. Utiliza-
se a notação <TipoDeDados> com o “Generics”, em linguagem
Java.
Na programação orientada a objetos, é comum o uso de classes e métodos genéricos, visando reduzir a
quantidade de códigos de conversão de tipos de dados.
List<Carro> carros = new ArrayList<Carro>()
Com uso de “Generics”, a lista pode somente ter objetos do tipo “Carro”, não aceitando objetos de outro
tipo, assim, é possível assegurar qual tipo será retornado pela lista, caso contrário, o erro será percebido
somente em tempo de execução.
I. Uma das vantagens de usar iteradores é que eles não dependem do tipo de coleção.
II. Não são todas as coleções que têm um método de remoção por índice, como “List”, e cada coleção tem
uma maneira de percorrer os elementos.
A proposição I está correta, pois o uso de iteradores é uma grande vantagem, visto que todas as classes-
filhas de “Collection” implementam essa interface. A proposição II está correta, pois a classe “Collection”
tem algumas classes-filhas que não têm métodos de remoção por índice, como ocorre com a classe “List”
(uma das mais usadas em aplicações de sistemas de informação).