Академический Документы
Профессиональный Документы
Культура Документы
Programação de
Computadores II
Jouberto Uchôa de Mendonça
Reitor
Amélia Maria Cerqueira Uchôa
Vice-Reitora
Jouberto Uchôa de Mendonça Junior
Junior
Pró-Reitoria Administrativa - PROAD
Ihanmarck Damasceno dos Santos
Pró-Reitoria Acadêmica - PROAC
Domingos Sávio Alcântara Machado
Pró-Reitoria Adjunta de Graduação - PAGR
Temisson José dos Santos
Pró-Reitoria Adjunta de Pós-Graduação
e Pesquisa - PAPGP
Gilton Kennedy Sousa Fraga
Pró-Reitoria Adjunta de Assuntos
Comunitários e Extensão - PAACE
Jane Luci Ornelas Freire
Freire
Gerente do Núcleo de Educação a Distância - Nead
Andrea Karla Ferreira Nunes
Coordenadora Pedagógica de Projetos - Nead
Lucas Cerqueira do
d o Vale
Coordenador de Tecnologias Educacionais - Nead
Equipe de Elaboração e
Produção de Conteúdos Midiáticos:
Alexandre Meneses Chagas - Supervisor
Ancéjo Santana Resende - Corretor
Andira Maltas dos Santos – Diagramadora
Claudivan da Silva Santana - Diagramador
Edilberto Marcelino da Gama Neto – Diagramador
Edivan Santos Guimarães - Diagramador
Fábio de Rezende Cardoso - Webdesigner
Geová da Silva Borges Junior - Ilustrador
Márcia Maria da Silva Santos - Corretora
Marina Santana Menezes - Webdesigner
Matheus Oliveira dos Santos - Ilustrador
Pedro Antonio Dantas P. Nou - Webdesigner
Rebecca Wanderley N. Agra Silva - Designer
Rodrigo Otávio Sales Pereira Guedes - Webdesigner
Rodrigo Sangiovanni Lima - Assessor
Walmir Oliveira Santos Júnior - Ilustrador
História
A tecnologia Java foi criada em 1991, a partir de um projeto
desenvolvido pela empresa Sun Microsystems (este projeto foi lide-
rado por James Gosling), e, poucos anos depois, em 1995, ganhou
notoriedade mundial. Isto aconteceu a partir do momento em que a
linguagem de programação passou a ser o foco principal da empresa.
A plataforma Java, desde o momento inicial, quando foi anunciada pela
Sun, é composta pela Máquina Virtual Java (JVM) e pela API JAVA; logo
em seguida, esta plataforma passou a ser incorporada ao navegador
Netscape Navigator (principal navegador da época). Esse fato impulsio-
nou a grande aceitação no uso da plataforma Java, fato verificado nos
anos seguintes.
Características
Vejamos a seguir algumas características que propiciaram o
crescimento e a grande aceitação da linguagem Java no cenário de
desenvolvimento web.
Figura 01 - A portabilidade permite que o seu código seja executado em qualquer sistema operacional.
Figura 02 - Após ser compilado, o arquivo fonte (*.java) se transforma em um arquivo binário (*.class) e em
seguida pode ser interpretado (podendo antes disso ainda ser verificado).
Objetivo
O principal objetivo da programação orientada a objeto é faci-
litar o desenvolvimento de software através da reutilização de obje-
tivos anteriormente desenvolvidos. Esta prática faz com que os sis-
temas sejam desenvolvidos mais rápido, de maneira mais confiável
e ainda com custos mais baixos. Este objetivo é conseguido através
diversas características de programação, sendo possível utilizar recur-
sos como instanciação, polimorfismo, herança, interface, entre outros.
Conceitos básicos
Assim como
c omo no paradigma procedural as funções fazem o papel
papel
principal, no paradigma OO, o conceito de objeto é o núcleo principal.
Um objeto pode ser entendido como uma representação codificada
de qualquer entidade do mundo real, onde este objeto é transferido
para linhas de código inclusive com suas características e seus com-
portamentos.
A programação orientada a objetos parte do princípio que os sis-
temas são construídos se espelhando ao máximo nos próprios objetos
da vida real. Antes de fazermos
fazermos um aprofundamento
aprofundamento em cada um dos
pilares da orientação a objetos, devemos ver de maneira simplificada
alguns dos conceitos principais.
Como acabamos de citar,
citar, fica evidente que o elemento conside-
rado ponto de partida para o entendimento do conceito OO é o próprio
objeto. Entendemos um objeto do mundo real como algo concreto (ex:
um livro) ou como algo conceitual (ex: uma viagem). Definimos que um
objeto possui duas características: o seu estado e o seu comportamen-
to. Portanto, podemos entender
entender o objeto como qualquer entidade real
26 Programação de Computadores II
Conceitos fundamentais
Iremos explorar mais profundamente nos conteúdos posteriores
os pilares da programação OO – encapsulamento, herança e polimor-
polimor-
fismo – faremos, neste momento, uma breve apresentação sobre cada
um deles:
PARA REFLETIR
Classe
Uma classe pode ser entendida como um modelo, uma espécie
de forma (ou ainda de gabarito) para a definição de objetos. Quando
nos voltamos para o mundo dos softwares, usamos o conceito de
classes para agrupar estes objetos que possuem uma relação entre si
(características que os objetos têm em comum). A premissa da OO é
30 Programação de Computadores II
Objetos
Como não poderia deixar de ser, o conceito de objeto é de
grande importância para a Programação Orientada a Objetos. É uti-
lizado em praticamente todo processamento de uma aplicação. É o
elemento utilizado para representar qualquer coisa, seja ela real (ex:
carro) ou mesmo abstrata (ex: viagem). Objetos são simplesmente
instâncias de uma classe previamente definida.
A partir do momento que temos uma classe chamada Pessoa
com os atributos nome, idade e telefone, podemos criar uma ins-
tância desta classe que representa um objeto real, ou seja, teremos
um objeto pessoa com o nome João, idade igual a 25 anos e com o
telefone 9876-1234.
Tema 1 | Introdução à orientação a objetos 37
PARA REFLETIR
Se os tipos primitivos foram construídos para oferecerem uma melhor
performance, qual a vantagem no uso das classes Wrappers (que
emulam os tipos primitivos)?
Neste momento, é preciso que você faça uma reflexão sobre a preocu-
pação com o desempenho na tecnologia Java. Faça uma ponderação
sobre o fato dos tipos primitivos permanecerem presentes na espe-
cificação da linguagem Java e também sobre a existência das classes
Wrappers (que emulam os tipos primitivos).
Introdução
Antes de começarmos a falar sobre atributos e métodos, deve-
mos lembrar inicialmente do conceito de Classe. Conforme podemos
retirar da definição feita no conteúdo anterior, temos que uma classe é
composta por duas partes: atributos e comportamentos. Comentare-
mos cada uma destas partes separadamente nos próximos parágrafos.
Atributos
Também chamados de membros de uma classe, os atributos
38 Programação de Computadores II
PARA REFLETIR
DEITEL, P.J.; DEITEL, H. M.. Java Como Programar . 8. ed. São Paulo:
Pearson Education do Brasil, 2010.
Uma produtiva leitura pode ser feita nas páginas 95 a 101, onde po-
dem ser encontradas mais informações sobre os principais métodos
da Super Classe Object como equals (responsável por testes de igual-
dade), hasCode e toString.
PARA REFLETIR
Parte 2
3 Polimorfismo
Introdução
Polimorfismo é uma palavra de origem grega que quer dizer
várias formas. Isto é, mais de uma maneira de fazermos a mesma
coisa. Como estamos falando de uma linguagem de programação,
temos que, o que pode ser feito de diferentes maneiras, concentra-se
especificamente em um ponto, em como fazemos as chamadas aos
métodos. Podemos definir então o polimorfismo como um mecanis-
mo que permite que duas ou mais classes derivadas de uma mesma
classe ancestral possuam métodos com a mesma assinatura, porém
com comportamentos distintos, havendo uma especificidade para
cada classe derivada. Esta importante característica presente nas
linguagens OO permite que uma mesma mensagem enviada a um
objeto tenha comportamento distinto, variando de acordo com o tipo
de objeto instanciado.
Aperfeiçoando nossos conhecimentos de herança (que foi as-
sunto do conteúdo 2.3), percebemos que um objeto de qualquer
subclasse pode ser manipulado como sendo um objeto da sua super-
classe. Este comportamento faz com que objetos sejam tratados de
forma genérica, mas para isto acontecer, deve haver uma hierarquia
de classes. Existe também uma operação conhecida como typecast ,
que consiste em realizar uma conversão explicita de um objeto de
uma classe para outra. Para isto, basta colocar entre parênteses e
antes do objeto o tipo da classe a ser convertido, como no exemplo:
(ClasseDestino) meuObjeto;
Funcionamento
Como vimos, o polimorfismo consiste em várias maneiras de
se fazer a mesma coisa, então podemos entender que temos a pos-
sibilidade de escrever um método de mesmo nome com diferentes
Tema 3 | Polimorfismo 81
Veiculo meuVeiculo;
if (...) {
meuVeiculo = new Carro();
} else {
meuVeiculo = new Lancha();
}
meuVeiculo.abastecer(); //método polimórfico
Modificador Final
A palavra reservada
reservada final é utilizada
utili zada tanto para modificar o com-
portamento de uma variável, de um método, de uma classe ou de
uma interface.
Variável
Variável final
Uma variável final só pode ter o seu valor atribuído uma única
vez. Uma vez recebido o seu valor inicial, tal valor não não pode mais
ser alterado.
alterado. Esta característica
característica acaba transformando funcionalmente
funcionalmente
tal variável em uma constante. Inclusive uma variável
variável com o modi-
ficador final, quando é do tipo primitivo ou ainda do tipo String, é
formalmente chamada de variável constante. Acontece um erro de
compilação ao tentar alterar o valor de uma variável final.
Conforme exemplo abaixo, a palavra reservada final deve prece-
der o tipo e nome da variável.
Método final
Um método que utiliza a palavra reservada final faz com que
este não possa ser redefinido nas subclasses que herdam da super-
classe a qual
qual este método pertence. O seu propósito
propósito é prevenir
prevenir com-
portamentos inesperados de uma subclasse alterando um método
que pode ser de uma importância fundamental para o funcionamento
e/ou consistência da classe.
classe. É gerado um erro
erro de compilação quando
quando
se tenta redefinir um método final.
No caso dos construtores de uma classe, como eles nunca são
herdados, não faz sentido pensar um utilizar o modificador final neles.
Na sequência, veremos um exemplo de um método com o mo-
dificador final.
Classe final
Uma classe final não pode ser herdada por nenhuma outra
classe. Um motivo para isso é garantir uma maior segurança para a
classe e incrementar a sua eficiência. Quando se utiliza o modificador
final em uma classe, entende-se que ela está totalmente completa e
não é necessário (sequer possível) haver subclasses herdando de uma
classe final. É gerado um erro de compilação caso, em qualquer clas-
se, seja usada a palavra reservada extends seguida do nome de uma
classe que seja final.
Outra situação em que também acontece erro de compilação
é quando uma classe é declarada ao mesmo tempo como sendo
abstrata e final. Neste caso, haveria uma contradição, o modificador
abstract estaria indicando que esta classe não está completa (que
existiria um método abstrato e que este método precisaria ser imple-
mentado pela sua subclasse); enquanto que a presença concomitante
do modificador final estaria informando exatamente o contrário, que
a classe agora estaria completa e não poderia haver nenhuma sub-
classe herdando dela. Por isso, acontece o erro em tempo de compi-
lação, para que seja evitada uma situação de conflito impossível de
ser resolvida.
Quando uma classe é definida como final, todos os métodos
contidos são implicitamente final. Isso implica que nenhum método
pertencente a esta classe final possa ser redefinido. O que parece
ser condizente, afinal de contas a própria classe não pode mesmo ser
herdada por nenhuma outra classe, então não haveria condições de
fato de nenhum método ser mesmo redefinido em subclasses.
Muitas classes da própria API Java são final, como java.lang.
String e java.lang.System. A seguir, veremos um simples exemplo de
uma classe final.
PARA REFLETIR
3.3 Interfaces
Definição
Antes de começarmos a falar de Interfaces, devemos relembrar
algumas informações a respeito de classes abstratas. Já sabemos
que uma classe abstrata não pode ser instanciada, ou seja, não se
pode construir objetos a partir da sua definição. Devemos lembrar
também o conceito de método abstrato (aquele que não possui im-
plementação) e que uma classe abstrata deve possuir ao menos um
método abstrato.
Desta forma, estamos prontos para entender o conceito de Inter-
face. Inicialmente podemos fazer uma aproximação de interface com
uma classe abstrata pura. Lembrando que para ser pura, uma classe
abstrata precisa possuir exclusivamente métodos abstratos, ou seja,
não possui nenhum método implementado. Uma característica impor-
tante de uma interface é exatamente esta, nenhum método implemen-
tado, todos os métodos têm obrigatoriamente que ser abstratos.
O papel da interface é simplesmente descrever o que outras
classes devem fazer, porém não especificam como elas devem fazer.
Temos então somente as assinaturas dos métodos (nome, parâme-
tros e tipo de retorno), sem nenhuma implementação. Como todos
os métodos são abstratos, podemos tornar implícitas as palavras
modificadoras public e abstract , simplesmente para evitar a repeti-
ção (a presença destas palavras não implica em erro, apenas geram
redundância).
Interfaces servem como especificações de padrões de compor-
tamentos para as classes. A sua utilização permite um projeto de
software mais bem elaborado, contendo funcionalidades mais orga-
nizadas.
Pode haver “atributos” na interface, porém estes seriam (tam-
bém implicitamente) public , static e final (tornando-os constantes).
Repete-se a informação anterior, ou seja, a presença destas palavras
é perfeitamente dispensável, porém não ocasionam nenhum tipo de
erro. O que não pode acontecer é o uso da palavra-chave final em
um método, pois isto impediria que ele fosse implementado pela
classe que a implementa. Entenderemos melhor esta situação após
98 Programação de Computadores II
Por fim, veremos agora uma classe que herda da classe Figura
Geometrica e ao mesmo tempo implementa a interface Imprímivel
acima:
public class MediaPonderada {
main(String[]
public static void args) {
try {
// ler a nota da primeira prova
System.out.print(“Digite a nota1: ”)
double nota1 = ler.nextDouble();
// Imprimir o resultado
System.out.println(“Média Ponderada:” + media);
} catch (InputMismatchException ime) {
System.err
.println(“ERRO: A nota deve ser do tipo
real”);
} finally {
System.out.println(“O finally foi executado.”);
}
}
}
118 Programação de Computadores II
DEITEL, P.J. Java Como Programar . 8. ed. São Paulo: Editora Pearson 2010.
PARA REFLETIR
REFL ETIR
Criando exceções
Para criar uma nova exceção é necessário definir uma classe que
herde, direta ou indiretamente, da classe Exception. Este processo de
criação segue os conceitos de herança que estudamos anteriormente.
A seguir, veja a sintaxe da criação de uma nova exceção.
Lançando exceções
Uma exceção é lançada por meio da cláusula throw e uma ins-
tância da classe de exceção que se deseja lançar. Quando o Java
executa a cláusula throw, o fluxo de execução natural do método é
modificado, retornando ao método que o invocou. Logo, é importante
ter em mente que a cláusula throw retorna à exceção que ocorreu e
não ao resultado do processamento do método.
Ao lançar uma exceção, nós devemos informar ao método que
ele pode lançar esta exceção. Para isso, utilizamos a palavra reser-
vada throws na assinatura do método, juntamente com a classe de
exceção. A cláusula throws é obrigatória para exceções verificadas,
mas é facultativa para exceções não verificadas.
É importante ficar atento à diferença entre as palavras reser-
vadas throw e throws. A cláusula throw retorna uma exceção do tipo
informado, ou seja, lança a exceção. Já a palavra reservada throws,
informa que o método pode lançar uma exceção do tipo definido na
sua assinatura. O código a seguir descreve um exemplo de sintaxe do
lançamento de exceções.
valor do saque deve sempre ser maior do que zero. O Java possui,
na hierarquia de classes, uma classe com objetivo de lançar exceções
para informar que o valor do parâmetro informado é ilegal, a classe
IllegalArgumentException . Portanto, nós devemos lançar uma exceção
deste tipo e informar no seu construtor uma mensagem amigável
para o usuário: “O valor do saque deve ser maior que 0.”. O trecho
de código a seguir descreve o método sacar da classe Conta para
solucionar a situação 1.
public class Conta {
. . . // Código omitido
public void sacar(double valor) {
if (valor < 0)
throw new IllegalArgumentException(“O valor
do saque deve ser maior que zero.”);
saldo = saldo - valor;
}
. . . // Código omitido
}
public class Conta {
// Código omitido
sacar(double valor) throws SaldoInsufi-
public void
cienteException {
if (valor < 0)
throw new IllegalArgumentException (“O valor
do saque deve ser maior que zero.”);
if (valor > this.saldo)
throw new SaldoInsuficienteException();
saldo = saldo - valor;
}
// Código omitido
136 Programação de Computadores II
PARA REFLETIR
Fluxo de Dados
Um fluxo de dados ou stream representa uma sequência orde-
nada de dados que podem ser transmitidos para ou de diferentes
dispositivos como, por exemplo, discos rígidos, discos ópticos, fitas
magnéticas, conexão remota via socket de rede, uma entrada ou sa-
ída padrão (normalmente teclado e mouse) ou, até mesmo, outros
Tema 4 | Exceções, coleções e fluxos 137
Anotações
Programação de Computadores II 149
Anotações
150 Programação de Computadores II
Anotações
Programação de Computadores II 151
Anotações
152 Programação de Computadores II
Anotações