Escolar Documentos
Profissional Documentos
Cultura Documentos
modelagem de problemas
APRESENTAÇÃO
O paradigma de programação orientada a objetos foi originalmente criado por Alan Kay, autor
da linguagem de programação Smalltalk. Embora seja um paradigma de programação mais novo
no que diz respeito ao seu emprego pelas linguagens de programação, algumas delas já haviam
implementado as suas ideias, sendo a Simula 67, criada em 1967, a primeira linguagem a
realmente utilizar a programação orientada a objetos.
A programação orientada a objetos trouxe uma nova maneira de se pensar projetos de softwares,
sendo que sua aplicação deixa bem clara as etapas de análise, projeto e codificação de softwares.
Seu conceito básico está em abstrair que tudo pode ser classificado como um objeto, cada objeto
implementando atributos e métodos e se relacionando a outros objetos, daí advém seu nome
“programa orientado aos objetos”. Conhecer e entender esse paradigma de programação é
fundamental, já que, atualmente, ele é implementado por muitas linguagens.
Nesta Unidade de Aprendizagem, você vai entender o que é programação orientada a objetos,
bem como vai conhecer algumas linguagens que o implementam e como são aplicados os seus
conceitos.
Bons estudos.
DESAFIO
O principal conceito da programação orientada a objetos é que todo programa é uma coleção de
objetos que se relacionam e apresentam comportamentos e atributos únicos.
1
Uma empresa contratou você para desenvolver um programa simples em uma linguagem
orientada a objetos. O escopo desse programa é controlar os pedidos feitos em uma lanchonete.
A seguir, no Desafio, veja como os pedidos são feitos atualmente e como eles deverão ser
realizados após o desenvolvimento do programa:
Com base nos requisitos que você viu, elabore uma descrição das possíveis classes, métodos e
2
atributos que seu programa deve apresentar para contemplar o escopo desse cenário. Agora, os
atributos e os métodos não precisam ser definidos, apenas identificados.
INFOGRÁFICO
3
4
CONTEÚDO DO LIVRO
Boa leitura.
5
Programação orientada
a objetos: modelagem
de problemas
Objetivos de aprendizagem
Ao final deste texto, você deverá apresentar os seguintes aprendizados:
Introdução
A programação orientada a objetos (POO) surgiu como um paradigma
que apresentava uma disciplina para novos projetos de desenvolvimento
de software. Etapas com análise e projeto de software que, em outros
paradigmas, acabavam sendo minimizados na POO, se tornam requisitos
fundamentais.
Não é difícil imaginar que a POO acabou se tornando um padrão con-
sumido pela engenharia de software e que possibilitou avanços significati-
vos na programação de computadores. Seu uso permitiu que reutilização
de código se tornasse algo praticamente comum em desenvolvimento
de software, servindo como base para novos conceitos, como os serviços.
Neste capítulo, você entenderá o conceito de POO, conhecerá al-
gumas linguagens que implementam esse paradigma e exemplos de
aplicação em projetos de programas de computador.
6
Programação orientada a objetos: modelagem de problemas
7
Programação orientada a objetos: modelagem de problemas
...
...
Método
Procedimento
Dados objeto ...
Método
8
Programação orientada a objetos: modelagem de problemas
9
Programação orientada a objetos: modelagem de problemas
void pular{
if(altura>=80){
System.out.println("Seu Cachorro pula alto");
}
}
}
10
Programação orientada a objetos: modelagem de problemas
Você pode perceber que, assim como em Java, C# possui uma estrutura
semelhante com a declaração dos atributos da classe logo no início e depois em
seus métodos, além de uma semelhança na sintaxe entre as duas linguagens,
o que é explicado devido ao embasamento do C# na linguagem Java.
11
Programação orientada a objetos: modelagem de problemas
class Pessoa:
def _ init _ (self, nome, idade):
self.nome = nome
self.idade = idade
12
Programação orientada a objetos: modelagem de problemas
def getNome(self):
return self.nome
def getIdade(self):
return self.idade
classes;
heranças.
13
Programação orientada a objetos: modelagem de problemas
nome;
cpf;
data_nascimento.
14
Programação orientada a objetos: modelagem de problemas
15
Programação orientada a objetos: modelagem de problemas
Leituras recomendadas
EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação: com exemplos em Pascal e C.
Porto Alegre: Bookman, 2014. 476 p. (Série Livros Didáticos Informática UFRGS).
MILETTO, E. M.; BERTAGNOLLI, S. C. Desenvolvimento de software II: introdução ao de-
senvolvimento web com HTML, CSS, JavaScript e PHP. Porto Alegre: Bookman, 2014.
276 p. (Série Tekne; Eixo Informação e Comunicação).
NICOLETTI, M. C. A cartilha Prolog. São Carlos: Edufscar, 2003. 124 p. (Série Apontamentos).
OKUYAMA, F. Y.; MILETTO, E. M.; NICOLAO, M. Desenvolvimento de software I: conceitos bá-
sicos. Porto Alegre: Bookman, 2014. 236 p. (Série Tekne; Eixo Informação e Comunicação).
PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão
ISO / IEC 9899. Porto Alegre: Bookman, 2012. 548 p.
16
DICA DO PROFESSOR
Todo paradigma de programação tem vantagens e desvantagens, mas saber equilibrar os pontos
positivos e negativos, entendendo qual é o melhor para determinada situação, é o desafio de um
profissional de desenvolvimento de software.
EXERCÍCIOS
A) Estados e atributos.
B) Métodos e colunas.
C) Tabelas e variáveis.
D) Atributos e métodos.
E) Estado e métodos.
17
um deles está relacionado ao conhecimento sobre a implementação interna da classe,
o qual é desnecessário do ponto de vista do objeto. Assinale a alternativa correta
quanto ao seu nome:
A) Relacionamentos.
B) Encapsulamento.
C) Classes.
D) Abstração.
E) Herança.
A) Atributos.
B) Herança.
C) Classes.
D) Abstração.
E) Polimorfismo.
18
reutilização de código e sua organização. Com relação às vantagens da reutilização de
código na programação orientada a objetos, assinale a alternativa correta:
19
A) Cor, tamanho e cheia são métodos da classe bola.
NA PRÁTICA
20
21
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Quando se faz uma programação em Java, existe a necessidade de se trabalhar com várias
classes. Isso se explica pelo fato de que, na maioria das vezes, classes diferentes apresentam
características comuns e, assim, ao invés de criar outra classe com essas características, é
possível usar as características de um objeto ou classe já existente. Essa é a herança. Confira, no
vídeo a seguir, a aplicação do conceito de herança em JAVA.
22
Introdução a classes, objetos e métodos
APRESENTAÇÃO
Os métodos são pedaços de código ou sub-rotinas, que tratam os dados definidos por uma
classe. Objetos são instâncias de uma classe, são compostos por estado e comportamento e se
comunicam através de mensagens.
Bons estudos.
DESAFIO
Você trabalha no setor de informática em uma escola que ainda não possui uma gestão
informatizada, e foi encarregado de criar o cadastro de alunos.
23
O resultado a ser entregue será um arquivo zipado do projeto, o qual poderá ser construído em
qualquer IDE (NetBeans, eclipse, etc.).
INFOGRÁFICO
24
CONTEÚDO DO LIVRO
Acompanhe um trecho da obra Java para iniciantes, livro que serve de base teórica para esta
Unidade de Aprendizagem e traz uma abordagem sobre classes, atributos e métodos. O domínio
destes conceitos é vital para o desenvolvimento de softwares. Inicie o estudo pelo tópico
Fundamentos das classes e finalize em Como os objetos são criados.
Boa leitura.
25
Atualizado para JAVA SE 8 (JDK 8)
Java
para iniciantes
Herbert Schildt
26
O autor
O autor de best-sellers Herbert Schildt escreve incansavelmente sobre programação
há quase três décadas e é uma das principais autoridades na linguagem Java. Seus
livros de programação venderam milhões de cópias no mundo inteiro e foram tra-
duzidos para diversos idiomas. É autor de vários livros sobre Java, incluindo Java:
The Complete Reference, Herb Schildt’s Java Programming Cookbook e Swing: A
Beginner’s Guide. Ele também escreveu sobre C, C++ e C#. Embora tenha interesse
em todas as áreas da computação, seu foco principal são as linguagens de progra-
mação, incluindo compiladores, interpretadores e linguagens de controle robótico.
Também tem grande interesse na padronização de linguagens. Schildt tem gradua-
ção e pós-graduação pela Universidade de Illinois. Seu site é www.HerbSchildt.com.
O editor técnico
Dr. Danny Coward trabalhou em todas as edições da plataforma Java. Ele conduziu
a definição dos Java Servlets para a primeira versão da plataforma Java EE e para
além dela, os serviços web para a plataforma Java ME, e a estratégia e planejamento
de Java SE 7. Fundou a tecnologia JavaFX e, mais recentemente, projetou o maior
acréscimo feito ao padrão Java EE 7, a API Java WebSocket. Da codificação em Java
ao projeto de APIs com especialistas da indústria e ao trabalho por vários anos como
executivo do Java Community Process, ele adquiriu uma perspectiva singularmente
ampla de vários aspectos da tecnologia Java. Além disso, é autor de JavaWebSo-
cket Programming e de um livro ainda a ser publicado sobre Java EE. Dr. Coward
tem graduação, mestrado e doutorado em Matemática pela Universidade de Oxford.
CDU 004.438Java
27
Capítulo 4 Introdução a classes, objetos e métodos
.....................................................................................................................................
A ntes de poder se adiantar mais em seu estudo de Java, você precisa conhecer a
classe. Classe é a essência de Java. Ela é a fundação na qual toda a linguagem
Java se estrutura, porque define a natureza de um objeto. Como tal, ela forma a base
da programação orientada a objetos em Java. Dentro de uma classe, são definidos
dados e o código que age sobre eles. O código fica contido em métodos. Já que as
classes, objetos e métodos são fundamentais para Java, eles serão introduzidos neste
capítulo. Ter um entendimento básico desses recursos permitirá que você escreva
programas mais sofisticados e compreenda melhor certos elementos-chave de Java
descritos no próximo capítulo.
28
Java para Iniciantes
que especifica como construir um objeto. É importante deixar uma coisa bem clara:
uma classe é uma abstração lógica. Só quando um objeto dessa classe é criado é que
existe uma representação física dela na memória.
Outro ponto: lembre-se de que os métodos e variáveis que compõem uma clas-
se são chamados de membros da classe. Os membros de dados também são chama-
dos de variáveis de instância.
// declara métodos
tipo método1(parâmetros) {
// corpo do método
}
tipo método2(parâmetros) {
// corpo do método
}
// ...
tipo métodoN(parâmetros) {
// corpo do método
}
}
Embora não haja essa regra sintática, uma classe bem projetada deve definir
apenas uma entidade lógica. Por exemplo, normalmente, uma classe que armazena
nomes e números de telefone não armazena também informações sobre o mercado
de ações, a média pluviométrica, os ciclos das manchas solares ou outros dados não
relacionados. Ou seja, uma classe bem projetada deve agrupar informações logi-
camente conectadas. A inserção de informações não relacionadas na mesma classe
desestruturará rapidamente seu código!
Até o momento, as classes que usamos tinham apenas um método: main( ).
Você verá como criar outros em breve. No entanto, observe que a forma geral de uma
classe não especifica um método main( ). O método main( ) só é necessário quando
a classe é o ponto de partida do programa. Alguns tipos de aplicativos Java, como os
applets, também precisam de um método main( ).
29
Capítulo 4 Introdução a classes, objetos e métodos
Uma definição class cria um novo tipo de dado. Nesse caso, ele se chama Vehi-
cle. Você usará esse nome para declarar objetos de tipo Vehicle. Lembre-se de que
uma declaração class é só uma descrição de tipo; ela não cria um objeto real. Logo, o
código anterior não faz nenhum objeto de tipo Vehicle passar a existir.
Para criar realmente um objeto Vehicle, você usará uma instrução como a mos-
trada abaixo:
Vehicle minivan = new Vehicle(); // cria um objeto Vehicle chamado minivan
Após essa instrução ser executada, minivan será uma instância de Vehicle. Portanto,
terá realidade “física”. Por enquanto, não se preocupe com os detalhes da instrução.
Sempre que você criar uma instância de uma classe, estará criando um objeto
contendo sua própria cópia de cada variável de instância definida pela classe. Logo,
todos os objetos Vehicle conterão suas próprias cópias das variáveis de instância
passengers, fuelcap e mpg. Para acessar essas variáveis, você usará o operador pon-
to (.). O operador ponto vincula o nome de um objeto ao nome de um membro. A
forma geral do operador ponto é mostrada aqui:
objeto.membro
Portanto, o objeto é especificado à esquerda e o membro é inserido à direita. Por
exemplo, para atribuir o valor 16 à variável fuelcap de minivan, use a instrução a
seguir:
minivan.fuelcap = 16;
Em geral, podemos usar o operador ponto para acessar tanto variáveis de instância
quanto métodos.
Este é um programa completo que usa a classe Vehicle:
/* Um programa que usa a classe Vehicle.
30
Java para Iniciantes
Antes de avançar, examinemos um princípio básico: cada objeto tem suas pró-
prias cópias das variáveis de instância definidas por sua classe. Logo, o conteúdo das
variáveis de um objeto pode diferir do conteúdo das variáveis de outro. Não há co-
nexão entre os dois objetos exceto pelo fato de serem do mesmo tipo. Por exemplo,
se você tiver dois objetos Vehicle, cada um terá sua própria cópia de passengers,
fuelcap e mpg, e o conteúdo dessas variáveis será diferente entre os dois objetos. O
programa abaixo demonstra esse fato. (Observe que a classe que tem main( ) agora
se chama TwoVehicles.)
// Este programa cria dois objetos Vehicle.
class Vehicle {
int passengers; // número de passageiros
int fuelcap; // capacidade de armazenamento de combustível em galões
31
Capítulo 4 Introdução a classes, objetos e métodos
Como você pode ver, os dados de minivan são totalmente diferentes dos contidos em
sportscar. A ilustração a seguir mostra essa situação.
passengers 7
minivan
fuelcap 16
mpg 21
passengers 2
sportscar
fuelcap 14
mpg 12
32
Java para Iniciantes
Essa declaração faz duas coisas. Em primeiro lugar, ela declara uma variável chamada
minivan da classe Vehicle. Essa variável não define um objeto. Em vez disso, ela pode
apenas referenciar um objeto. Em segundo lugar, a declaração cria uma cópia física do
objeto e atribui à minivan uma referência a ele. Isso é feito com o uso do operador new.
O operador new aloca dinamicamente (isto é, aloca no tempo de execução)
memória para um objeto e retorna uma referência a ele. Essa referência é, mais ou
menos, o endereço do objeto na memória alocado por new. A referência é então
armazenada em uma variável. Logo, em Java, todos os objetos de uma classe devem
ser alocados dinamicamente.
As duas etapas da instrução anterior podem ser reescritas desta forma para
mostrarmos cada etapa individualmente:
Vehicle minivan; // declara uma referência ao objeto
minivan = new Vehicle(); // aloca um objeto Vehicle
A primeira linha declara minivan como referência a um objeto de tipo Vehicle. Por-
tanto, minivan é uma variável que pode referenciar um objeto, mas não é um objeto.
Por enquanto, minivan não referencia um objeto. A próxima linha cria um novo ob-
jeto Vehicle e atribui à minivan uma referência a ele. Agora, minivan está vinculada
a um objeto.
33
DICA DO PROFESSOR
Projetar um software é como projetar uma casa. Tanto a engenharia civil quanto a de software
possuem um esquema ou desenho.
Agora, faremos uma aplicação prática, em que interpretaremos o desenho de uma classe e
implementaremos seu código.
Os objetivos são :
- Implementar uma classe chamada Media, definindo atributos e métodos para calcular a média
aritmética entre duas notas.
- Utilizar uma caixa de mensagens para mostrar o resultado na tela; para isso, importaremos a
classe JOptionPane do pacote swing do java.
A aplicação consiste em receber duas notas e calcular a média aritmética. Para o desenho, foi
utilizada a ferramenta Astah Community que utiliza as notações UML (linguagem unificada de
modelagem).
EXERCÍCIOS
34
A) Classes possuem um papel irrelevante na programação orientada a objetos.
35
C) Para criarmos uma classe, é necessário seguirmos a especificação de um objeto.
D) Considere o seguinte código: “Cliente cli = new Cliente();” a palavra “new” é o método
construtor da classe.
return placa;
return cor;
this.cor = cor;
36
}
return anoFabricacao;
this.anoFabricacao = anoFabricacao;
D) As variáveis de instância da classe veículo poderão ser visualizadas por qualquer outra
classe da aplicação.
E) O código está incorreto, pois métodos e variáveis de instância não são elementos de uma
classe.
A) Classes.
37
B) Objetos.
C) Atributos.
D) Métodos.
E) Comentários.
NA PRÁTICA
Todo objeto é composto por características e seus valores. A essas características e valores, dá-
se o nome de estado do objeto, é o que o unifica em relação a outros objetos, por exemplo: um
objeto pessoa pode ter como característica o seu nome, e esse nome pode ter o valor "João",
"Paulo", etc. Todo objeto possui um comportamento, isto é, uma ação; a pessoa, pode falar,
comer; o carro pode acelerar, frear... Esses comportamentos do objeto são chamados de métodos
.
38
As classes têm uma característica importante, pois, além de classificar objetos com atributos
semelhantes, elas modelam a criação destes objetos.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Aprenda como criar uma Classe, com seus atributos e métodos, e a instanciar novos objetos a
partir dessa classe inicial
39
Projetando classes
APRESENTAÇÃO
Nesta Unidade de Aprendizagem você verá os conceitos de coesão e acoplamento, que são
importantes para formar uma estrutura de classes consistente e, por fim, pacotes, que são uma
forma de organizar as classes do nosso projeto.
Bons estudos.
DESAFIO
Projetar uma classe pode ser um bom desafio, mas quando seguimos algumas regras e padrões,
nosso trabalho se torna menos árduo.
40
No pacote modelo, coloque as classes modelo e, no pacote controle, coloque a classe que
conterá o método main. Você pode colocar o nome da classe como Principal, e a mesma servirá
para instanciar as classes modelo e iniciar o programa. Use uma linguagem de programação
orientada a objetos para executar a tarefa, crie um projeto e, depois de concluídas as atividades,
exporte o projeto no formato zip e envie o arquivo.
INFOGRÁFICO
Veja, no infográfico, uma descrição sobre escolha de classes, coesão, acoplamento e pacotes.
CONTEÚDO DO LIVRO
Escolher, nomear e estruturar bem as classes de uma aplicação, assim como organizá-las em
pacotes, é de extrema importância no paradigma de orientação a objetos. Portanto, o domínio
destes conceitos torna-se vital para o desenvolvimento de softwares.
Acompanhe um trecho do livro Conceitos de computação com Java; este livro serve de base
teórica para esta Unidade de Aprendizagem. Inicie sua leitura pelo tópico Escolhendo classes e
vá até o final do tópico Coesão e acoplamento.
41
CAY HORSTMANN
CONCEITOS DE
C O M P U TA Ç Ã O C O M
Compatível com
Java 5 & 6
Java
5a Edição
42
Conceitos de Computação com Java
• CashRegister
43
CAPÍTULO 8 䊏 Projetando Classes
Para essas classes, as propriedades de um objeto típico são fáceis de entender. Um objeto
Rectangle tem uma largura e uma altura. Dado um objeto BankAccount, você pode depo-
sitar e sacar dinheiro. Geralmente, conceitos da parte do universo compreendida pelo
programa, como ciências, negócios ou um jogo, fazem boas classes. O nome para essa
classe deve ser um substantivo que descreve o conceito. Alguns nomes de classes padrão
em Java são um pouco estranhos, como Ellipse2D.Double, mas você pode escolher no-
mes mais apropriados para suas classes.
Uma outra categoria útil de classe pode ser descrita como atores. Objetos de uma
classe de atores realizam alguns trabalhos para você. Exemplos de atores são a classe
Scanner do Capítulo 4 e a classe Random no Capítulo 6. Um objeto Scanner varre um fluxo
de dados em busca de números e strings. Um objeto Random gera números aleatórios. Se
utilizar a língua inglesa para atribuir nomes, uma boa idéia é escolher nomes de classes
para os atores que terminem em “er” ou “or”. (Um nome melhor para a classe Random
poderia ser RandomNumberGenerator.)
Ocasionalmente, uma classe não tem nenhum objeto, mas contém uma coleção de
constantes e métodos estáticos relacionados. A classe Math é um exemplo típico. Uma
classe assim é chamada de classe utilitária.
Por fim, você viu classes com somente um método main. O único propósito dessas
classes é iniciar um programa. Da perspectiva de projeto, estes são exemplos mais ou
menos degenerados de classes.
O que não poderia ser uma boa classe? Se você não pode afirmar a partir do nome da
classe o que um objeto da classe supostamente deve fazer, provavelmente você não está
no caminho certo. Por exemplo, sua lição de casa poderia solicitar para você escrever
um programa que imprima cheques de pagamento. Suponha que inicialmente você tente
projetar uma classe PaycheckProgram. O que um objeto dessa classe faria? Um objeto des-
sa classe teria que fazer tudo o que a lição de casa exige fazer. Isso não simplifica nada.
Uma classe melhor seria Paycheck. Seu programa pode então manipular um ou mais
objetos da classe Paycheck.
Um outro equívoco comum, especialmente de estudantes habituados a escrever
programas que consistem em funções, é transformar uma ação em uma classe. Por
exemplo, se sua lição de casa fosse calcular um cheque de pagamento, você poderia
considerar escrever uma classe ComputePaycheck. Mas você consegue visualizar um ob-
jeto do tipo ComputePaycheck? O fato de que ComputePaycheck não é um substantivo
leva você a achar que está no caminho errado. Por outro lado, uma classe Paycheck tem
um sentido intuitivo. O termo “cheque de pagamento” (ou Paycheck) é um substantivo.
Você pode visualizar um objeto de cheque de pagamento. Então você pode pensar em
métodos úteis para a classe Paycheck, como computeTaxes, que o ajudarão a resolver a
lição de casa.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
1. Qual é a regra geral para escolher classes?
2. Seu trabalho é escrever um programa de xadrez. A classe ChessBoard (Tabuleiro)
poderia ser uma classe apropriada? Que tal MovePiece?
44
Conceitos de Computação com Java
Na verdade há dois conceitos aqui: uma caixa registradora que armazena moedas e cal-
cula o total e os valores das moedas individuais. (Por simplicidade, supomos que a caixa
registradora só contém moedas, não cédulas. O Exercício P8.1 discute uma solução mais
geral.)
Faz sentido ter uma classe Coin separada e tornar as moedas responsáveis pelos seus
valores.
public class Coin
{
public Coin(double aValue, String aName) { . . . }
public double getValue() { . . . }
. . .
}
CashRegister
Figura 1 Coin
Relacionamento de dependência
entre as classes CashRegister e Coin.
45
CAPÍTULO 8 䊏 Projetando Classes
46
Conceitos de Computação com Java
Uma boa prática é Por que o acoplamento é importante? Se a classe Coin muda na
minimizar o acoplamento próxima distribuição do programa, todas as classes que dependem
(isto é, a dependência) entre dela podem ser afetadas. Se a alteração for drástica, todas as clas-
classes. ses associadas devem ser atualizadas. Além disso, se quisermos
utilizar uma classe em outro programa, teremos que levar junto
todas as classes das quais ela depende. Portanto, queremos remo-
ver o acoplamento desnecessário entre as classes.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
3. Por que a classe CashRegister do Capítulo 4 não é coesa?
4. Por que a classe Coin não depende da classe CashRegister?
5. Por que o acoplamento deve ser minimizado entre as classes?
Consistência
Nesta seção você aprendeu dois critérios para analisar a qualidade da interface pública
de uma classe. Você deve maximizar a coesão e eliminar o acoplamento desnecessá-
rio. Há um outro critério que gostaríamos que você prestasse atenção – consistência.
Quando você tem vários métodos, siga um esquema consistente para os nomes e parâ-
metros desses métodos. Isso é simplesmente um sinal de bom estilo.
Infelizmente, você pode localizar várias inconsistências na biblioteca padrão. Eis
um exemplo. Para mostrar uma caixa de diálogo de entrada, você chama
JOptionPane.showInputDialog(promptString)
47
DICA DO PROFESSOR
EXERCÍCIOS
A) Identificando os atributos.
B) Identificando os métodos.
A) Nomeamos uma classe utilizando um verbo que define o objetivo dessa classe.
B) Uma classe deve ser criada para representar vários conceitos do domínio do problema.
C) Se você não pode afirmar, a partir do nome da classe, o que um objeto da classe
supostamente deve fazer, provavelmente você não está no caminho certo.
48
D) Uma categoria útil de classes pode ser descrita como atores. Essas classes servem para
iniciar um programa.
A) Uma classe coesa representa uma solução bem estruturada no que se refere à criação do
objeto.
C) Quando a interface pública de uma classe referencia vários conceitos, é um bom sinal de
que pode ser hora de utilizar classes separadas.
E) Se muitas classes de um programa dependerem umas das outras, dizemos, então, que o
acoplamento entre as classes é baixo.
4) O que é um pacote?
B) É um modificador de acesso.
49
D) Criamos objetos a partir das definições de um pacote.
/*
package media;
public class calcularMedia {
}
*/
NA PRÁTICA
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
51
Classes com tipos genéricos
APRESENTAÇÃO
Tipos genéricos são muito usados nas APIs da linguagem java. Como exemplo, podemos citar
as coleções, as quais também podem ser implementadas em nossas aplicações.
Nesta Unidade de Aprendizagem veremos alguns conceitos sobre classes com tipos genéricos.
Trabalharemos um escopo básico, já que este assunto é muito extenso, mas é necessário que
todos os programadores tenham um conhecimento básico.
Bons estudos.
DESAFIO
Classes genéricas podem ter mais de um parâmetro de tipo, isto é, mais uma das facilidades que
os tipos genéricos nos proporcionam.
Você é analista/programador em uma fábrica de software e seu trabalho é entregar uma
aplicação de cadastro de clientes. Para isso, deve criar uma classe modelo e uma de controle
para instanciar a modelo, no entanto, deve utilizar as técnicas de tipos genéricos. O cadastro de
cliente deverá conter nome, sobrenome, idade, endereço e e-mail.
Para executar o desafio, utilize uma linguagem de programação orientada a objetos, um IDE
para auxiliar na organização do projeto (sugerido: netBeans ou Eclipse).
Crie um projeto com o nome de cadastro; dentro, crie um pacote com o mesmo nome, e, dentro
do pacote, crie as classes necessárias.
Observação: a classe controle, além de instanciar a classe modelo e inserir os valores, deverá
52
invocar um método para impressão do objeto na tela.
INFOGRÁFICO
CONTEÚDO DO LIVRO
Boa leitura.
53
Capítulo 13 Tipos genéricos
.....................................................................................................................................
D esde sua versão original, muitos recursos novos foram adicionados a Java.
Todos melhoraram e expandiram seu escopo, mas o que teve impacto parti-
cularmente profundo e extenso foi o tipo genérico, porque seus efeitos foram sen-
tidos em toda a linguagem. Por exemplo, os genéricos adicionaram um elemento
de sintaxe totalmente novo e causaram mudanças em muitas das classes e métodos
da API principal. Não é exagero dizer que sua inclusão basicamente reformulou a
natureza de Java.
O tópico “genéricos” é muito extenso e parte dele é avançado demais para
entrar no escopo deste livro. No entanto, um conhecimento básico dos genéricos é
necessário a todos os programadores Java. À primeira vista, a sintaxe dos genéricos
pode parecer um pouco complicada, mas não se preocupe, os genéricos são muito
fáceis de usar. Quando você terminar este capítulo, terá uma noção dos conceitos-
-chave que estão por trás dos genéricos e terá conhecimento suficiente para usá-los
de maneira eficaz em seus próprios programas.
54
Java para Iniciantes
Pergunte ao especialista
P: Ouvi dizer que os genéricos Java são semelhantes aos templates de C++. É isso
mesmo?
R: Sim, os genéricos Java são semelhantes aos templates de C++. O que Java chama de
tipo parametrizado, C++ chama de template. No entanto, os genéricos Java e os tem-
plates C++ não são iguais e há algumas diferenças básicas entre as duas abordagens
de tipos genéricos. Geralmente, a abordagem Java é mais fácil de usar.
Uma advertência: se você tiver experiência em C++, é importante não tirar con-
clusões precipitadas sobre como os genéricos funcionam em Java. As duas abordagens
de código genérico diferem de maneiras sutis, mas básicas.
faces e métodos em que o tipo de dado usado é especificado como parâmetro. Uma
classe, interface ou método que opera sobre um parâmetro de tipo é chamado de
genérico, como em classe genérica ou método genérico.
Uma vantagem importante do código genérico é que ele funciona automatica-
mente com o tipo de dado passado para seu parâmetro de tipo. Muitos algoritmos são
logicamente iguais, não importando o tipo de dado ao qual estão sendo aplicados.
Por exemplo, uma classificação rápida é igual classificando itens de tipo Integer,
String, Object ou Thread. Com os genéricos, você pode definir um algoritmo uma
única vez, independentemente do tipo de dado, e então aplicá-lo a uma ampla varie-
dade de tipos de dados sem nenhum esforço adicional.
É importante entender que Java sempre permitiu a criação de classes, interfaces
e métodos generalizados usando referências de tipo Object. Já que Object é a super-
classe de todas as outras classes, uma referência Object pode referenciar qualquer
tipo de objeto. Logo, em códigos anteriores aos genéricos, classes, interfaces e méto-
dos generalizados usavam referências Object para operar com vários tipos de dados.
O problema é que eles não faziam isso com segurança de tipos, já que coerções
eram necessárias para converter explicitamente Object no tipo de dado que estava
sendo tratado. Portanto, era possível gerar acidentalmente discrepâncias de tipo. Os
genéricos adicionam a segurança de tipos que estava faltando, porque tornam essas
coerções automáticas e implícitas. Resumindo, eles expandem nossa habilidade de
reutilizar código e nos permitem fazê-lo de maneira segura e confiável.
55
Capítulo 13 Tipos genéricos
// Retorna ob.
T getob() {
return ob;
}
// Exibe o tipo de T.
void showType() {
System.out.println("Type of T is " +
ob.getClass().getName());
}
}
56
Java para Iniciantes
Type of T is java.lang.String
value: Generics Test
Examinemos esse programa com detalhes. Primeiro, observe como Gen é de-
clarada pela linha a seguir:
class Gen<T> {
Aqui, T é o nome de um parâmetro de tipo. Esse nome é usado como espaço reser-
vado para o tipo real que será passado para Gen quando um objeto for criado. Logo,
T será usado dentro de Gen sempre que o parâmetro de tipo for necessário. Observe
que T está dentro de < >. Essa sintaxe pode ser generalizada. Sempre que um pa-
râmetro de tipo estiver sendo declarado, ele será especificado dentro de colchetes
angulares (< >). Já que Gen usa um parâmetro de tipo, é uma classe genérica.
Na declaração de Gen, não há um significado especial no nome T. Qualquer
identificador válido poderia ter sido usado, mas o uso de T é tradicional. Além disso,
é recomendável que os nomes dos parâmetros de tipo tenham apenas um caractere:
uma letra maiúscula. Outros nomes de parâmetros de tipo normalmente usados são
V e E.
Em seguida, T é usado para declarar um objeto chamado ob, como mostrado
abaixo:
T ob; // declara um objeto de tipo T
Como explicado, T é um espaço reservado para o tipo real que será especificado
quando um objeto Gen for criado. Logo, ob será um objeto do tipo passado para T.
Por exemplo, se o tipo String for passado para T, então, nesse caso, ob será de tipo
String.
Agora, considere o construtor de Gen:
Gen(T o) {
ob = o;
}
Observe que seu parâmetro, o, é de tipo T. Ou seja, o tipo real de o será determinado
pelo tipo passado para T quando um objeto Gen for criado. Além disso, já que tanto
o parâmetro o quanto a variável membro ob são de tipo T, ambos terão o mesmo tipo
quando da criação de um objeto Gen.
O parâmetro de tipo T também pode ser usado para especificar o tipo de retor-
no de um método, como ocorre com o método getob( ), mostrado aqui:
T getob() {
return ob;
}
Já que ob também é de tipo T, seu tipo é compatível com o tipo de retorno especifi-
cado por getob( ).
57
Capítulo 13 Tipos genéricos
Examine bem essa declaração. Primeiro, observe que o tipo Integer é especificado
dentro de colchetes angulares após Gen. Nesse caso, Integer é um argumento de tipo
que é passado para o parâmetro de tipo de Gen, que é T. Isso cria uma versão de Gen
em que todas as referências a T são convertidas para referências a Integer. Logo,
para essa declaração, ob é de tipo Integer e o tipo de retorno de getob( ) também.
Antes de prosseguirmos, é preciso dizer que o compilador Java não cria real-
mente versões diferentes de Gen ou de qualquer outra classe genérica. Embora seja
útil pensar assim, não é o que acontece. Em vez disso, o compilador remove todas as
informações do tipo genérico, substituindo pelas coerções necessárias, para fazer o có-
digo se comportar como se uma versão específica de Gen fosse criada. Logo, na ver-
dade, há apenas uma versão de Gen no programa. O processo de remover informações
do tipo genérico se chama erasure e ele será discutido posteriormente neste capítulo.
A próxima linha atribui a iOb uma referência a uma instância de uma versão
Integer da classe Gen.
iOb = new Gen<Integer>(88);
Já que iOb é de tipo Gen<Integer>, não pode ser usada para referenciar um objeto
de Gen<Double>. Esse tipo de verificação é um dos principais benefícios dos gené-
ricos porque assegura a segurança dos tipos.
Como os comentários do programa informam, a atribuição
iOb = new Gen<Integer>(88);
faz uso do autoboxing para encapsular o valor 88, que é um int, em um Integer.
Isso funciona porque Gen<Integer> cria um construtor que recebe um argumento
58
Java para Iniciantes
Como o tipo de retorno de getob( ) é T, que foi substituído por Integer quando iOb
foi declarada, ele também é Integer, que é encapsulado em int quando atribuído a v
(que é um int). Logo, não há necessidade de converter o tipo de retorno de getob( )
para Integer.
Agora, GenDemo declara um objeto de tipo Gen<String>:
Gen<String> strOb = new Gen<String>("Generics Test");
Como o argumento de tipo é String, T é substituído por String dentro de Gen. Isso
cria (conceitualmente) uma versão String de Gen, como as linhas restantes do pro-
grama demonstram.
Certamente, não poder especificar um tipo primitivo não é uma restrição grave, por-
que você pode usar os encapsuladores de tipos (como fez o exemplo anterior) para
encapsular um tipo primitivo. Além disso, o mecanismo Java de autoboxing e autou-
nboxing torna o uso do encapsulador de tipos transparente.
Ainda que tanto iOb quanto strOb sejam de tipo Gen<T>, são referências a tipos
diferentes porque seus argumentos de tipo diferem. Isso faz parte da maneira como
os genéricos adicionam segurança de tipos e evitam erros.
59
DICA DO PROFESSOR
EXERCÍCIOS
D) Com um genérico você pode definir um algoritmo apenas uma vez, independentemente do
tipo de dados.
2) Nos fundamentos dos tipos genéricos, quando utilizamos o termo “genérico”, estamos
nos referindo a:
A) Estrutura de herança.
60
C) Quando uma aplicação pode ser executada sem o método main em java.
3) Para declararmos uma classe que utilizará tipos genéricos, utilizamos qual sintaxe?
1 - class Gen<T>{
2 - T ob;
3-
4 - Gen(T o) {
5-
6- ob = o;
7-
8- }
9-
10 - T getob(){
11 - return ob;
61
12 - }
13 -
14 - void showType() {
15 -
16 - System.out.println("Type of T is " + ob.getClass().getName());
17 -
18 - }
19 - }
20 -
21 -
22 - //Demonstra a classe genérica.
23 -
24 - class GenDemo {
25 -
26 - public static void main(String[] args){
27 -
28 - Gen<Integer> iOb = new Gen<Integer>(88);
29 -
30 - iOb.showType();
31 -
32 - int v = iOb.getob();
33 -
34 - System.out.println("Value: " + v);
35 -
36 - System.out.println();
37 -
38 - Gen<String> strOb = new Gen<String>("Generics Test");
39 -
40 - strOb.showType();
41 -
42 - String str = strOb.getob();
43 -
44 - System.out.println("Value: "+ str);
45 -
46 - }
47 - }
62
A) Veja o trecho de código escrito na linha 1. class Gen<T>{ A letra T, representa o nome de
um parâmetro de tipo.
B) Veja o trecho de código escrito na linha 2. T ob; Teremos um erro de compilação, pois não
estamos definindo um tipo válido para o atributo ob.
C) Veja o trecho de código escrito nas linhas 10,11 e 12. T getob(){ return ob; } Temos o
método getob() que retorna um tipo T.
D) Veja o trecho de código escrito na linha 28. Gen iOb = new Gen(88); Estamos criando
uma versão de Gen para inteiros e atribuindo uma referência a iOb a uma instância da
classe GEN.
E) Veja o trecho de código escrito na linha 38. Gen strOb = new Gen("Generics Test"); Aqui,
GenDemo está declarando um objeto do tipo Gen.
E) As letras a serem utilizadas como nomes de parâmetros de tipos devem ser apenas “T”,
“E” ou “V”.
NA PRÁTICA
63
Veja no vídeo uma aplicação prática de classes com tipos genéricos.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Para ser um bom desenvolvedor Java é preciso, acima de tudo, ter experiência. Nesse artigo, leia
mais sobre o assunto.
eja nesse artigo como e quando utilizar sobrecarga de métodos e tipos genéricos e quais
problemas cada um ajuda a resolver.
64
Interfaces
APRESENTAÇÃO
Nesta Unidade de Aprendizagem conheceremos um pouco mais sobre interfaces e sua aplicação.
Bons estudos.
DESAFIO
As interfaces podem ser utilizadas até mesmo em tarefas mais simples. Além de definirem
métodos a serem utilizados pelas classes que as implementam, as interfaces podem declarar
constantes para serem usadas por estas classes.
Você trabalha na área de TI de uma escola. A secretaria da instituição solicitou que você crie
uma forma de inserir o conceito obtido pelo aluno, com sua descrição, de tal maneira que apenas
seja necessário informar o número do conceito obtido.
Você deverá criar uma interface com três constantes, constante "a" = "Parabéns, você atingiu
todos os indicadores de avaliação com excelência"; constante "b" = "Parabéns, você obteve
aproveitamento satisfatório nos indicadores de avaliação"; constante "c" = "Você não atingiu o
mínimo esperado para aprovação".
65
Crie uma classe para implementar a interface. Nesta classe, crie uma variável para receber a
opção digitada pelo usuário. Utilize o método showInputDialog() da classe JOptionPane para
solicitar as opções. Crie uma estrutura de decisão para verificar a opção digitada e printar na tela
o conceito e sua descrição.
INFOGRÁFICO
CONTEÚDO DO LIVRO
66
Interfaces definem tipos em uma forma abstrata, como uma coleção de métodos ou outros tipos
que formam o contrato para aquele tipo. Interfaces não contêm implementações e você não pode
criar instâncias de uma interface. Acompanhe um trecho do livro A linguagem de programação
java, livro que serve de base teórica para esta Unidade de Aprendizagem. Inicie o estudo pelo
tópico Interfaces e finalize no tópico Estendendo Interfaces.
67
68
CAPÍTULO 4
Interfaces
“Reger” é quando você desenha “figuras” em nenhum lugar – com sua batuta
ou com suas mãos – que são interpretadas como “mensagens instrucionais”
por rapazes vestindo gravatas borboleta que desejariam estar pescando.
– Frank Zappa
69
A LINGUAGEM DE PROGRAMAÇÃO JAVA
Uma declaração de interface é similar a uma declaração de classe, exceto que a palavra-
chave interface é usada em lugar de class. Também existem regras especiais que go-
vernam os membros de uma interface, como em breve você vai aprender.
O método compareTo usa como argumento um único objeto do tipo T e o compara ao
objeto atual (esperado ser também do tipo T), retornando um inteiro negativo, nulo ou
positivo, se o objeto atual é menor do que, igual a ou maior do que o argumento, res-
pectivamente.
Considere uma variação da classe Point que introduzimos no Capítulo 1. O ordenamen-
to natural para pontos poderia ser a sua distância da origem. Poderíamos então tornar
Comparable objetos Point:
class Point implements Comparable<Point> {
private int x, y;
70
CAPÍTULO 4 • INTERFACES
1
No capítulo 11 você aprende sobre métodos genéricos, e sort realmente deveria ser definido como um desses.
71
A LINGUAGEM DE PROGRAMAÇÃO JAVA
Se você quiser tratar obj como um objeto Point você deve fazer uma coerção explícita pa-
ra este tipo.
Você pode invocar quaisquer dos métodos de Object usando uma referência do tipo de uma
interface porque não importa quais interfaces o objeto implemente, ele sempre será um Ob-
ject e assim possui aqueles métodos. De fato, qualquer interface que não estende outra in-
terface explicitamente possui membros que são os métodos públicos de Object (a menos
que a interface os sobrescreva explicitamente). Portanto, o seguinte é legal:
String desc = obj.toString();
como uma atribuição de uma referência de interface a uma referência de Object.
72
CAPÍTULO 4 • INTERFACES
73
A LINGUAGEM DE PROGRAMAÇÃO JAVA
74
DICA DO PROFESSOR
EXERCÍCIOS
A) Método.
B) Atributos.
C) Modificadores de acesso.
D) Pacote.
E) Classes.
75
C) São elementos da classe.
E) Interfaces são classes que possuem apenas métodos e podem ser instanciadas.
3) Em uma estrutura de herança, uma classe usa membros de outra classe. Interfaces
fornecem membros para que outras classes possam fazer uso deles. Com isso, é
importante conhecermos o conceito de herança para podermos analisar suas
diferenças com implementação de interfaces. Marque a alternativa que melhor define
herança.
A) Herança é uma estrutura que possui uma superclasse e subclasses que herdam membros
desta superclasse.
C) Ao herdar um método da superclasse, ele não poderá ser sobrescrito pela superclasse.
E) Para criarmos uma estrutura de herança, devemos limitar a duas o número de subclasses.
4) Queremos criar uma interface com o nome Contrato e com o método sem retorno
chamado entrarComTexto(). Marque a afirmativa que escreve corretamente o
código.
76
C) public Interface class Contrato{ void entrarComTextoString texto;}
E) public interface B { }
NA PRÁTICA
Interface é um recurso da orientação a objetos muito utilizado em Java, para obrigar as classes
que a implementam a utilizarem seus métodos.
77
Em Java, utilizamos interfaces como uma forma de criar heranças múltiplas, já que Java não
permite tal estrutura. Com isso, as classes podem herdar membros de uma superclasse e
implementar de quantas interfaces forem necessárias. O uso de interfaces em um projeto pode
ser uma forma de obrigar o programador a usar determinados métodos nas classes. Os métodos
de uma interface devem ser sobrescritos nas classes que as implementam.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Java Progressivo. Interface em Java (implements) - O que é, para que serve e como
implementar.
No texto abaixo serão passadas informações a respeito de uma interface de Java: a implements.
Clique abaixo para saber mais.
78
Conteúdo interativo disponível na plataforma de ensino!
79
Classes abstratas e interfaces
APRESENTAÇÃO
As classes abstratas e as interfaces são responsáveis por fazer abstrações, em outras palavras,
elas realizam implementação interna de recursos e mostram apenas a funcionalidade aos
usuários. Ambas trabalham com o conceito de abstração, no entanto, elas têm suas diferenças.
Em Java, a principal diferença entre elas é que os métodos de uma interface Java são
implicitamente abstratos e não podem ter implementações; já uma classe abstrata Java pode ter
métodos de instância que implementam um comportamento padrão.
As classes abstratas podem ter métodos abstratos e não abstratos, diferentemente da interface
que contém apenas métodos abstratos.
Os métodos abstratos são métodos com assinatura válida, no entanto, eles devem ser
sobrescritos e implementados na classe concreta que estende a classe abstrata.
Bons estudos.
DESAFIO
80
desses conceitos, podem ser utilizadas classes genéricas que nunca serão instanciadas
(abstratas), ou até mesmo
a implementação de métodos alheios a contratos (interface).
Você, como programador de linguagem Java, é convidado para desenvolver um sistema para
uma banca de jornal, cujo proprietário deseja expandir seus negócios para o meio digital. Ele
quer algo simples, uma vez que o negócio recém foi estabelecido. A banca tem apenas livros
(que pode ser classe abstrata) e revistas, os quais implementam
o produto dessa banca. O produto será adicionado como interface para que livros e revistam
tenham, futuramente, um sistema de desconto.
Os livros por sua vez, podem ser ampliados para livro físico, e-book
e minilivro.
INFOGRÁFICO
81
Uma classe abstrata permite criar funcionalidades que as subclasses podem implementar ou
substituir, enquanto uma interface permite apenas indicar a funcionalidade, mas não
implementá-la. Uma classe pode estender apenas uma classe abstrata, enquanto uma classe pode
implementar várias interfaces.
82
83
CONTEÚDO DO LIVRO
Na obra Programação orientada a objetos, base teórica desta Unidade de Aprendizagem, leia o
capítulo Classes abstratas e interfaces, no qual você irá ver conceitos e aplicações dessas duas
características enraizadas na linguagem de programação Java, podendo, ao final, diferenciar
uma da outra.
Boa leitura.
84
Classes abstratas
e interfaces
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
Dentro do paradigma de programação orientada a objetos, classes abs-
tratas e interfaces são dois conceitos importantes, pois são responsáveis
por determinar comportamentos. Apesar de ambas trabalharem com o
conceito de abstração, elas possuem suas particularidades. A principal
diferença entre elas é que os métodos de uma interface Java são impli-
citamente abstratos, não podendo conter implementação de métodos
em sua classe. Já uma classe abstrata em Java pode ter métodos com sua
codificação, que implementam um comportamento padrão.
Além dos conceitos de classes abstratas e interfaces, existe o con-
ceito de métodos abstratos, que podem ser utilizados em interfaces e
em classes abstratas, uma vez que um método abstrato possui apenas
a assinatura e sua implementação é realizada apenas nas classes que
implementem a classe abstrata ou a interface. No entanto, as classes
abstratas podem ter tanto os métodos abstratos quanto os não abstratos,
diferentemente da interface, que pode possuir apenas métodos abstratos.
Neste capítulo, você estudará sobre os conceitos de classes e mé-
todos abstratos. Além disso, verá quando utilizar os conceitos de he-
rança ou interface. Por fim, verá um exemplo de aplicação prática da
implantação de classes abstratas e interfaces, utilizando a linguagem
de programação Java.
85
Classes abstratas e interfaces
86
Classes abstratas e interfaces
87
Classes abstratas e interfaces
Se você declarar um método abstrato, precisará tornar a classe abstrata também, visto
que não é possível ter métodos abstratos em uma classe que não é abstrata. Além disso,
toda classe-filha (subclasse) precisa implementar os métodos abstratos da classe-pai
(superclasse), a não ser que ela também seja abstrata.
88
Classes abstratas e interfaces
89
Classes abstratas e interfaces
múltiplas. Ou seja, uma classe Veículo nunca poderá ser uma moto ou um
carro ao mesmo tempo.
Uma maneira de contornar essa situação é por meio do recurso de interface.
Segundo Machado, Franco e Bertagnolli (2016), interface é a definição de um
contrato, ou seja, seus métodos devem, necessariamente, ser implementados. Uma
vez que uma classe implemente essa interface, essa implementação é realizada
por meio da sintaxe implements em Java. Apenas as assinaturas dos métodos
estão disponíveis, deixando para a classe que o implemento deve prover o com-
portamento ou ação necessária. Por padrão, todos os métodos devem ser públicos
e abstratos — logo, em sua declaração, nenhuma implementação é permitida.
Uma boa maneira de analisar o funcionamento de uma interface, além do
método da prática em si, é por meio da linguagem de modelagem unificada
(UML). No exemplo da Figura 6, a interface Forca representa uma família
de classes (tanto Motor quanto Turbina estão associadas por uma agre-
gação a um tipo de Forca) e permite que o veículo tenha o seu núcleo de
força alterado (como potência, empuxo, nível de ruído) sem a necessidade de
alterações na classe Carro.
Observe que o carro aceita como novo núcleo qualquer classe que realize a
implementação da interface Forca. Assim, se, no futuro, os carros forem movidos
por um novo tipo de moto, como um reator, basta criar: public class Reator
implements Forca.
Embora as interfaces sejam utilizadas para criar situações de herança múltipla, essa
não é a sua finalidade. Essa função é dada a classes abstratas, que conseguem criar
uma hierarquia de classes e de subtipos. Contudo, não é considerado um erro utilizar
interfaces para simular uma herança.
92
Classes abstratas e interfaces
93
Classes abstratas e interfaces
94
Classes abstratas e interfaces
95
DICA DO PROFESSOR
EXERCÍCIOS
A) Característica polimórfica.
C) Característica de herança.
96
2) Normalmente, uma classe declarada como genérica, não tem um objeto com sua
instância e, por conta disso, algumas situações exigem que sua declaração seja
abstrata. Avalie as seguintes sentenças e marque a alternativa correta.
A) Toda classe abstrata servirá apenas de modelo. Logo, seus métodos deverão ser
sobrescritos, mesmo que tenham sua implementação.
B) Uma classe abstrata servirá de modelo para outras classes. Seus métodos devem ser
concretos, exigindo sua implementação, contendo, assim, as definições de sua assinatura.
C) Uma classe abstrata servirá de modelo para outras classes. Seus métodos devem ser
abstratos, ma são implementados na classe abstrata e têm definições de sua assinatura.
D) Uma classe abstrata servirá de modelo para outras classes. Seus métodos podem ser
abstratos e concretos, no entanto, eles não são implementados na classe abstrata, mas têm
definições de sua assinatura.
E) Toda classe abstrata servirá apenas de modelo. Logo, seus métodos deverão ser
sobrescritos quando declarados como abstract, mesmo que tenham sua implementação.
3) Há situações em que não é desejável que certas classes tenham os mesmos privilégios
que outras, como em um sistema bancário. Embora o cliente e o gerente herdem um
método para login, os dois não estão no mesmo nível hierárquico, mesmo que ambos
herdem a mesma característica de uma superclasse denominada pessoa. Para
contornar essa situação e fazer com que cada um tenha sua própria tela de login,
assinale a alternativa que mostra o melhor caminho.
A) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de
usuários, é possível estender uma interface chamada login e implementar sua própria
função de acesso, sem sobrescrever qualquer método.
B) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de
97
usuários, ele deve estender uma classe abstrata, herdando assim sua implementação de
acesso.
C) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de
usuários, é possível implementar uma interface chamada login e programar sua própria
função de acesso, sem sobrescrever qualquer método.
D) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de
usuários, é possível implementar uma interface chamada login para incorporar a
programação do método de acesso da interface, tornando-a independente da forma de
implementação de sua superclasse.
E) Para que o usuário (cliente) faça login, de forma diferente do gerente e de outros tipos de
usuários, é possível programar uma interface chamada login para implementar sua própria
forma de acesso, tornando-a independente da forma de implementação de sua superclasse.
A) Erro de compilação.
B) 2.
C) 4.
D) 10.
E) 20.
98
5) Mesmo que as classes abstratas sejam parecidas com as interfaces, ambas têm
particularidades que as tornam únicas. Logo, marque a resposta que melhor
representa cada uma delas.
A) Interfaces podem ter apenas métodos abstratos públicos; as classes abstratas não podem
conter campos de dados.
NA PRÁTICA
99
100
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
O método final não pode ser substituído, assim, uma função abstrata não pode ser final. O
sistema Android Interface Definition Language permite definir a interface de programação que o
cliente e o serviço usam para se comunicar entre si, a partir da comunicação entre processos
(IPC). No Android, um processo normalmente não pode acessar a memória de outro.
101
Atributos e métodos de classe
APRESENTAÇÃO
Nesta Unidade de Aprenduizagem veremos qual a diferença entre os tipos, para que possamos
fazer bom uso destes elementos em programação orientada a objetos.
Bons estudos.
DESAFIO
Trabalhar com métodos e atributos estáticos pode nos trazer muitas vantagens, como economia
de código. Entretanto, é importante termos um bom conhecimento sobre o assunto para
aplicarmos em nossos projetos.
INFOGRÁFICO
103
CONTEÚDO DO LIVRO
Membros estáticos ou de classe podem nos trazer uma redução significativa de código e espaço
em memória, sem contar com as vantagens funcionais. Portanto, o domínio destes conceitos
torna-se vital para o desenvolvimento de softwares.
Acompanhe um trecho do livro Conceitos de computação em Java, livro que serve de base
teórica para esta Unidade de Aprendizagem. Inicie o estudo pelo tópico 8.6 Métodos estáticos e
finalize ao final de 8.7 Campos estáticos.
Boa leitura.
104
CAY HORSTMANN
CONCEITOS DE
C O M P U TA Ç Ã O C O M
Compatível com
Java 5 & 6
Java
5a Edição
105
CAPÍTULO 8 䊏 Projetando Classes
106
Conceitos de Computação com Java
Você precisa encontrar um local para esse método. Vamos pensar em uma nova classe
(semelhante à classe Math da biblioteca Java padrão). Como o método percentOf tem a
ver com cálculos financeiros, projetaremos uma classe Financial para armazená-lo. Eis
a classe:
public class Financial
{
public static double percentOf(double p, double a)
{
return (p / 100) * a;
}
// Outros métodos financeiros podem ser adicionados aqui.
}
Ao chamar um método estático, você fornece o nome da classe que contém o método
para que o compilador possa localizá-lo. Por exemplo,
double tax = Financial.percentOf(taxRate, total);
Observe que você não fornece um objeto do tipo Financial ao chamar o método.
Agora podemos dizer por que o método main é estático. Quando o programa inicia,
não há nenhum objeto. Portanto, o primeiro método no programa deve ser um método
estático.
Talvez você esteja se perguntando por que esses métodos são chamados estáticos.
O significado normal da palavra estático (“permanecer fixo em um lugar”) não parece
estar relacionado com aquilo que os métodos estáticos fazem. Na realidade, essa palavra
foi adotada por acidente. Java usa a palavra-chave static porque C++ a usa no mesmo
contexto. C++ usa static para indicar métodos de classe porque os criadores de C++ não
queriam criar uma outra palavra-chave. Alguém observou que havia uma palavra-chave
107
CAPÍTULO 8 䊏 Projetando Classes
raramente utilizada, static, que indica algumas variáveis que permanecem em uma loca-
lização fixa para múltiplas chamadas de método. (Java não tem esse recurso, nem precisa
dele.) Acabou-se descobrindo que a palavra-chave poderia ser reutilizada para indicar
métodos de classe sem confundir o compilador. O fato de que ela pode confundir as
pessoas aparentemente não foi uma grande preocupação. Você simplesmente tem de con-
viver com o fato de que “método estático” significa “método de classe”: um método que
não opera em um objeto e que só tem parâmetros explícitos.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
12. Suponha que Java não tivesse métodos estáticos. Todos os métodos da classe
Math seriam então métodos de instância. Como você calcularia a raiz quadrada
de x?
13. Harry entrega seu dever de casa, um programa que executa o jogo-da-velha. A
solução dele consiste em uma única classe com muitos métodos estáticos. Por
que isso não é uma solução orientada a objetos?
Nesse caso, cada instância da classe BankAccount teria um valor próprio de lastAssigned-
Number.
108
Conceitos de Computação com Java
Cada objeto BankAccount tem campos de instância balance e accountNumber próprios, mas
há apenas uma única cópia da variável lastAssignedNumber (veja Figura 4). Esse campo é
armazenado em um local separado, fora de qualquer objeto BankAccount.
Um campo estático às vezes é chamado campo de classe porque há um único campo
para toda a classe.
Cada método de uma classe pode acessar seus campos estáticos. Eis o construtor da
classe BankAccount, que incrementa o último número atribuído e então o usa para inicia-
lizar o número de conta do objeto a ser construído:
public class BankAccount
{
public BankAccount()
{
// Gera o próximo número de conta a ser atribuído
lastAssignedNumber++; // Atualiza o campo estático
// Atribui o campo ao número de conta dessa conta bancária
accountNumber = lastAssignedNumber; // Configura o campo de instância
}
. . .
}
Como você inicializa um campo estático? Você não pode configurá-lo no construtor da
classe:
public BankAccount()
{
lastAssignedNumber = 1000; // NÃO – seria redefinido para 1000 a cada novo objeto
. . .
}
Assim, a inicialização ocorreria toda vez que uma nova instância fosse construída.
Há três maneiras de inicializar um campo estático:
1. Não fazer nada. O campo estático é então inicializado com 0 (para números),
false (para valores boolean) ou null (para objetos).
2. Utilizar um inicializador explícito, como:
public class BankAccount
{
. . .
private static int lastAssignedNumber = 1000;
}
109
CAPÍTULO 8 䊏 Projetando Classes
Cada objeto
collegeFund = BankAccount
BankAccount tem um campo
accountNumber
balance = 10000 próprio
accountNumber = 1001
momsSavings =
BankAccount
balance = 8000
accountNumber = 1002
harrysChecking =
BankAccount
balance = 0
accountNumber = 1003
Há um único campo
lastAssignedNumber
para a classe
BankAccount
BankAccount.lastAssignedNumber = 1003
110
Conceitos de Computação com Java
de C++. Mas campos estáticos e métodos estáticos têm muito em comum: eles são apli-
cados a toda a classe, não a instâncias específicas da classe.
Em geral, é recomendável minimizar o uso dos campos e métodos estáticos. Se en-
contrar utilizando vários métodos estáticos é uma indicação de que talvez você não tenha
encontrado as classes corretas para resolver seu problema de uma maneira orientada a
objetos.
AUTOVERIFICAÇÃO DA APRENDIZAGEM
14. Cite dois campos estáticos da classe System.
15. Harry informa que encontrou uma excelente maneira de evitar esses objetos in-
cômodos: colocar todo o código em uma única classe e declarar todos os méto-
dos e campos como static. Então main pode chamar os outros métodos estáticos
e todos eles podem acessar os campos estáticos. O plano do Harry funcionará?
Ele é uma boa idéia?
111
DICA DO PROFESSOR
EXERCÍCIOS
C) Usamos variáveis de classe quando apenas um objeto da classe precisa utilizar uma cópia
desta variável.
D) Todo objeto tem sua própria cópia de todas as variáveis estáticas da classe.
E) Se vários objetos precisam acessar uma determinada variável em comum, a medida que
transformamos esta variável em estática, estamos desperdiçando espaço na memória.
A) public.
B) class.
C) void.
112
D) private.
E) static.
A) Métodos são variáveis que tem a capacidade de receber uma quantidade maior de
informação.
D) Por serem estáticos, os métodos não podem ser chamados em outras classes.
113
5) Marque a afirmativa correta.
C) Se um método estático tentar acessar um outro método não estático da classe usando
somente o nome do método, ocorrerá um erro de compilação.
NA PRÁTICA
Cada objeto possui sua cópia de todos os atributos de instância de uma classe, entretanto, em
alguns casos, é interessante que haja um atributo que possa ser compartilhado entre todos os
objetos de uma classe, e a ele damos o nome de atributo de classe ou estático. A maioria dos
métodos é executada dependendo da chamada de um objeto específico, todavia, existem
métodos que não dependem de nenhum objeto; a eles damos o nome de métodos de classe ou
estáticos.
114
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Nesse artigo você verá sobre os métodos de aprendizado de máquina supervisionados baseados
em uma unica classe para classificação automática.
115
Atributos e métodos finais
APRESENTAÇÃO
Atributos e métodos finais são utilizados para garantir que determinada implementação não
tenha modificações, isto é, garantir a imutabilidade.
Bons estudos.
DESAFIO
Determinar o preço de venda de uma mercadoria ou serviço é muito importante para qualquer
comerciante ou empresário, pois erros de cálculo podem causar um enorme prejuízo. Portanto, é
necessário termos um índice, que, quando multiplicado pelo valor de compra, traga o preço final
da mercadoria. O markup é exatamente isso, um índice.
116
Crie a aplicação com uma variável final e, depois, um método final para calcular o preço de
venda do produto. A formula para tal é (markup*preço*compra), crie uma classe controle para
instanciar a classe que contenha a variável e o método, e coloque alguns valores para testar a
aplicação. Utilize uma linguagem de programação orientada a objetos para criar a aplicação,
depois exporte o projeto em formato zip.
Como sugestão para facilitar o trabalho, utilize o IDE netbeans ou um de sua preferência.
INFOGRÁFICO
117
CONTEÚDO DO LIVRO
Qualquer que seja a razão, em Java, com o uso da palavra-chave final, é fácil impedir que um
método seja sobreposto ou uma classe seja herdada.
Acompanhe um trecho do livro Java para iniciantes, que traz uma abordagem sobre o uso da
palavra-chave final. O livro serve de base teórica para esta Unidade de Aprendizagem. Inicie o
estudo pelo tópico Usando final e finalize em Pergunte ao especialista.
Boa leitura.
118
Atualizado para JAVA SE 8 (JDK 8)
Java
para iniciantes
Herbert Schildt
119
O autor
O autor de best-sellers Herbert Schildt escreve incansavelmente sobre programação
há quase três décadas e é uma das principais autoridades na linguagem Java. Seus
livros de programação venderam milhões de cópias no mundo inteiro e foram tra-
duzidos para diversos idiomas. É autor de vários livros sobre Java, incluindo Java:
The Complete Reference, Herb Schildt’s Java Programming Cookbook e Swing: A
Beginner’s Guide. Ele também escreveu sobre C, C++ e C#. Embora tenha interesse
em todas as áreas da computação, seu foco principal são as linguagens de progra-
mação, incluindo compiladores, interpretadores e linguagens de controle robótico.
Também tem grande interesse na padronização de linguagens. Schildt tem gradua-
ção e pós-graduação pela Universidade de Illinois. Seu site é www.HerbSchildt.com.
O editor técnico
Dr. Danny Coward trabalhou em todas as edições da plataforma Java. Ele conduziu
a definição dos Java Servlets para a primeira versão da plataforma Java EE e para
além dela, os serviços web para a plataforma Java ME, e a estratégia e planejamento
de Java SE 7. Fundou a tecnologia JavaFX e, mais recentemente, projetou o maior
acréscimo feito ao padrão Java EE 7, a API Java WebSocket. Da codificação em Java
ao projeto de APIs com especialistas da indústria e ao trabalho por vários anos como
executivo do Java Community Process, ele adquiriu uma perspectiva singularmente
ampla de vários aspectos da tecnologia Java. Além disso, é autor de JavaWebSo-
cket Programming e de um livro ainda a ser publicado sobre Java EE. Dr. Coward
tem graduação, mestrado e doutorado em Matemática pela Universidade de Oxford.
CDU 004.438Java
120
Java para Iniciantes
Usando final
Mesmo com a sobreposição de métodos e a herança sendo tão poderosas e úteis,
podemos querer evitar que ocorram. Por exemplo, podemos ter uma classe que en-
capsule o controle de algum dispositivo de hardware. Além disso, essa classe pode
dar ao usuário a oportunidade de inicializar o dispositivo, fazendo uso de informa-
ções privadas. Nesse caso, não vamos querer que os usuários de nossa classe possam
sobrepor o método de inicialização. Qualquer que seja a razão, em Java, com o uso
da palavra-chave final, é fácil impedir que um método seja sobreposto ou uma classe
seja herdada.
class B extends A {
void meth() { // ERRO! não pode sobrepor.
System.out.println("Illegal!");
}
}
Já que meth( ) é declarado como final, não pode ser sobreposto em B. Se você tentar
fazê-lo, ocorrerá um erro de tempo de compilação.
121
Capítulo 7 Herança
String msgs[] = {
"Output Error",
"Input Error",
"Disk Full",
"Index Out-Of-Bounds"
};
class FinalD {
public static void main(String args[]) { Usa constantes final.
ErrorMsg err = new ErrorMsg();
System.out.println(err.getErrorMsg(err.OUTERR));
System.out.println(err.getErrorMsg(err.DISKERR));
}
}
Observe como as constantes final são usadas em main( ). Uma vez que são membros
da classe ErrorMsg, devem ser acessadas via um objeto dessa classe. É claro que
também podem ser herdadas pelas subclasses e acessadas diretamente dentro delas.
Por uma questão estilística, muitos programadores de Java usam identificado-
res maiúsculos em constantes final, como no exemplo anterior, mas essa não é uma
regra fixa.
122
Java para Iniciantes
Pergunte ao especialista
P: Variáveis membros final podem ser transformadas em static? A palavra-chave
final pode ser usada em parâmetros de métodos e variáveis locais?
R: A resposta às duas perguntas é sim. Transformar uma variável membro final em
static permite que você referencie a constante pelo nome de sua classe em vez de
por um objeto. Por exemplo, se as constantes de ErrorMsg fossem modificadas por
static, as instruções println( ) de main( ) teriam esta aparência:
System.out.println(err.getErrorMsg(ErrorMsg.OUTERR));
System.out.println(err.getErrorMsg(ErrorMsg.DISKERR));
A declaração de um parâmetro final impede que ele seja alterado dentro do método. A
declaração de uma variável local final impede que ela receba um valor mais de uma vez.
A classe Object
Java define uma classe especial chamada Object que é uma superclasse implícita de
todas as outras classes. Em outras palavras, todas as outras classes são subclasses de
Object. Ou seja, uma variável de referência de tipo Object pode referenciar um ob-
jeto de qualquer outra classe. Além disso, uma vez que os arrays são implementados
como classes, uma variável de tipo Object também pode referenciar qualquer array.
Object define os métodos a seguir, portanto, eles estão disponíveis em todos
os objetos:
Método Finalidade
Object clone( ) Cria um novo objeto igual ao objeto que está sendo
clonado.
boolean equals(Object objeto) Determina se um objeto é igual a outro.
void finalize() Chamado antes de um objeto não usado ser
reciclado.
Class<?> getClass( ) Obtém a classe de um objeto no tempo de execução.
int hashCode( ) Retorna o código hash associado ao objeto chamador.
void notify( ) Retoma a execução de uma thread que está
esperando no objeto chamador.
void notifyAll( ) Retoma a execução de todas as threads que estão
esperando no objeto chamador.
String toString() Retorna um string que descreve o objeto.
void wait( ) Espera outra thread de execução.
void wait(long milissegundos)
void wait(long milissegundos,
int nanossegundos)
123
DICA DO PROFESSOR
EXERCÍCIOS
A) Encapsulamento.
2) Em relação aos atributos de uma classe, podemos afirmar que a palavra-chave final é
usada para:
A) Declarar variáveis.
124
D) Para declararmos atributos que receberam valor de ponto flutuante.
D) private final int num1 = 6; private final int num2 = 4; private int result; public final void(){
result = num1 + num2; }
E) static private final double pi = 3.1416; private double raio = 2; private double area; public
125
void setRaio(){ this.raio = raio; area = pi * (raio*raio); }
126
127
A) A classe pessoa possui um método final.
NA PRÁTICA
128
Os atributos finais também são conhecidos como constantes. Podemos exemplificar como
aplicação um atributo que guarde o valor do "PI", não é interessante que esse valor mude em sua
aplicação, pois trata-se de algo constante.
Os nomes de atributos finais devem ser escritos com letras maiúsculas; por exemplo, PI,
TAMANHO, VALOR, PERCENTUAL.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Java Progressivo. Use constantes, e não números - declarando variáveis com o final
129
Encapsulamento e modificadores de
acesso
APRESENTAÇÃO
Bons estudos.
DESAFIO
Trabalhar com encapsulamento em orientação a objetos pode nos trazer muitas vantagens, como
diminuir a complexidade no desenvolvimento da aplicação; entretanto, é importante termos um
bom conhecimento sobre o assunto para aplicarmos da melhor forma em nossos projetos.
Você trabalha como analista/programador em uma fábrica de software e foi encarregado de criar
uma aplicação que calcule o volume de concreto para o trabalho com vigas em construção civil.
Sabe-se que a fórmula para o cálculo deste volume é (base x altura x comprimento).
O cliente necessita de uma aplicação que solicite, via caixa de diálogo, os dados referentes à
base, altura e comprimento das vigas a serem trabalhadas e seja informado o resultado através
de uma caixa de mensagem.
Sua tarefa é implementar esta aplicação em uma linguagem de programação orientada a objetos;
130
faça uso das técnicas de encapsulamento.
INFOGRÁFICO
CONTEÚDO DO LIVRO
Boa leitura.
131
Encapsulamento e
modificadores de acesso
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Definir encapsulamento.
Reconhecer os modificadores e os métodos de acesso.
Construir uma aplicação utilizando técnicas de encapsulamento.
Introdução
Neste capítulo, você estudará o encapsulamento e os modificadores de
acesso. Além disso, aprenderá como utilizar os modificadores de aces-
sos e quais as diferenças entre eles, tonando-se apto para desenvolver
programas utilizando este aprendizado.
Encapsulamento
Encapsulamento em programação orientada a objetos (POO) significa separar o
programa em partes, deixando-o mais isolado possível. Dessa forma, é possível
torná-lo mais flexível, fácil de modificar e manter, bem como implementar
novas funcionalidades.
132
Encapsulamento e modificadores de acesso
Trata-se de uma forma muito eficiente de proteger dados que são ma-
nipulados dentro da classe, determinando onde ela poderá ser manipulada.
Geralmente, utiliza-se o acesso mais restrito (private) para que não ocorra
acesso público aos membros. O encapsulamento ocorre em dois níveis, con-
forme você pode ver a seguir.
Se o método puder ser usado por outras classes (que não sejam subclasses), use public;
caso contrário, se você quiser que suas subclasses possam alterar algum comporta-
mento, encapsule o comportamento em um método protected. Já se o método trata
de um detalhe de implementação e você não quer que ninguém modifique (nem
mesmo as subclasses), use private.
133
Encapsulamento e modificadores de acesso
//metodos de acesso
return juros;
return numero;
return saldo;
this.juros = juros;
this.numero = numero;
//metodos
this.saldo -= valor;
this.saldo += valor;
134
Encapsulamento e modificadores de acesso
Reconhecimento de modificadores e
métodos de acesso
Em POO modificador de acesso é a palavra que define um atributo, método ou
classe e pode ser público, privado ou protegido. Entre os três modificadores
existem quatro níveis de visibilidade: private, default, protected e public. Pú-
blico (public) significa que qualquer classe pode ter acesso; privado (private),
que somente têm acesso métodos da própria classe, podendo manipular o
atributo; protegido (protected) pode ser acessado somente pela própria classe
ou subclasses; e default tem acesso as classes que estiverem no mesmo pacote
que a classe que possui o atributo.
Em geral, os modificadores de acesso são utilizados para privar os atributos
de serem acessados diretamente, e implementam métodos públicos que possam
acessar e alterar os atributos. Esse processo é chamado de encapsulamento.
Métodos privados são utilizados por métodos públicos da mesma classe,
para que o código seja reutilizado em mais de um método. Conforme descrito
anteriormente, o private proíbe o acesso externo, mas também bloqueia a lei-
tura do atributo. Assim, para que possamos recuperar seu valor, precisaremos
utilizar um método público na própria classe que devolverá o valor do atributo.
135
Encapsulamento e modificadores de acesso
https://qrgo.page.link/1SSvz
136
Encapsulamento e modificadores de acesso
Public ✔ ✔ ✔ ✔
Protected ✔ ✔ ✔ ✘
No modifier ✔ ✔ ✘ ✘
Private ✔ ✘ ✘ ✘
Como o método private de Animal não foi sobrescrito por Gato, é ele que será
chamado quando houver uma referência do tipo Animal.
137
Encapsulamento e modificadores de acesso
Referências
Leituras recomendadas
BARBOSA, M. A. L. Tipos abstratos de dados e construções encapsuladas: linguagens de
programação. 2012. Disponível em: <http://malbarbo.pro.br/arquivos/2012/1028/11-ti-
pos-abstratos-de-dados-e-construcoes-encapsuladas.pdf>. Acesso em: 17 maio 2018.
HAILTON. Um pouco sobre polimorfismo Java. 2009. Disponível em: <https://www.
devmedia.com.br/encapsulamento-polimorfismo-heranca-em-java/12991>. Acesso
em: 17 maio 2018.
QUAL É A DIFERENÇA entre modificadores public, default, protected e private?
2015. Disponível em: <https://pt.stackoverflow.com/questions/23/qual-%C3%A9-a-
diferen%C3%A7a-entre-modificadores-public-default-protected-e-private>. Acesso
em: 17 maio 2018.
Os links para sites da Web fornecidos neste capítulo foram todos testados, e seu fun-
cionamento foi comprovado no momento da publicação do material. No entanto, a
rede é extremamente dinâmica; suas páginas estão constantemente mudando de
local e conteúdo. Assim, os editores declaram não ter qualquer responsabilidade
sobre qualidade, precisão ou integralidade das informações referidas em tais links.
138
DICA DO PROFESSOR
Podemos dizer que encapsular seria empacotar, esconder, deixar visível apenas aquilo que
interessa ao usuário. Assista, no vídeo, um exemplo prático de encapsulamento e acompanhe o
uso da técnica de encapsulamento.
EXERCÍCIOS
C) Encapsular é deixar disponível para o usuário apenas o que lhe interessa, sem a
necessidade de expor detalhes do código.
2) Para encapsular um atributo, deixando-o visível apenas para a classe que o contém,
utilizamos qual palavra-chave?
A) Public.
139
B) Static.
C) Void.
E) Private.
A) Pacote.
B) Modificadores de acesso.
C) Classe.
D) Método.
A) Protected.
B) Private.
C) Public.
140
D) Package.
E) Static.
141
}
}
A) Todos os atributos desta classe poderão ser acessados apenas por seus respectivos
métodos.
C) Toda classe que possui atributos privados não obriga que cada atributo tenha o método que
fará acesso ao mesmo.
NA PRÁTICA
Em programação houve um tempo em que os códigos ficaram muito extensos e, com isso, os
programadores tinham muita dificuldade na organização; portanto, a solução foi dividir em
componentes, os quais os usuários não tinham a necessidade de conhecer a complexidade do
código do componente, apenas informar as entradas corretas para receber resultados. Esta
técnica se chama encapsular o código, que além da organização, trouxe mais segurança, pois
outros programadores usam o componente sem fazer qualquer alteração.
142
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Veja neste artigo quais são e como utilizar os modificadores de acesso a métodos, atributos e
classes da linguagem Java.
Conceitos de Computação com Java - Compatível com Java 5 & 6 Cay Horstmann, 2009,
5ª Edição
Acompanhe a obra a seguir onde você poderá aprofundar seus conhecimentos sobre os conceitos
e as principais práticas de programação. Dicas uteis sobre as boas práticas da engenharia de
software e etc.
143
Introdução ao polimorfismo
APRESENTAÇÃO
Bons estudos.
DESAFIO
Você trabalha como analista/programador em uma fábrica de software e foi solicitada a criação
de uma calculadora com as quatro operações básicas da matemática - soma, subtração,
multiplicação e divisão. Essa calculadora deverá receber apenas dois números de cada vez e a
operação desejada. Para construi-la, você deverá fazer o uso de uma interface com um método
calcular e quatro classes que implementam esta interface, cada classe correspondente a uma
operação. Crie uma classe controle para instanciar as classes das operações. Para executar a
tarefa, utilize uma linguagem de programação orientada a objeto.
Logo após a criação, exporte o projeto em um arquivo zipado.
INFOGRÁFICO
144
Veja no infográfico conceitos de polimorfismo.
CONTEÚDO DO LIVRO
145
SEGUNDA EDIÇÃO
Programar no específico
Ocasionalmente, ao realizarmos processamento polimórfico, precisamos programar “no
específico”. Vamos demonstrar que um programa pode determinar o tipo de um objeto
no momento da execução e atuar nesse objeto de forma correspondente.
Interfaces
O apêndice continua com uma introdução às interfaces Java. Uma interface descreve
um conjunto de métodos que podem ser chamados em um objeto, mas não fornece
implementações concretas para todos os métodos. Você pode declarar classes que im-
plementam (isto é, fornecem implementações concretas para os métodos de) uma ou
mais interfaces. Cada método de interface deve ser declarado em todas as classes que im-
plementam a interface explicitamente. Quando uma classe implementa uma interface,
todos os objetos dessa classe têm uma relação é um com o tipo de interface, e é garantido
que todos os objetos da classe fornecem a funcionalidade descrita pela interface. Isso
também vale para todas as subclasses dessa classe.
As interfaces são particularmente úteis para atribuir funcionalidade comum a clas-
ses possivelmente não relacionadas. Isso permite que objetos de classes não relacionadas
sejam processados de modo polimórfico – objetos de classes que implementam a mesma
interface podem responder a todas as chamadas de métodos da interface de forma perso-
nalizada. Para demonstrar a criação e o uso de interfaces, modificamos nosso aplicativo
de folha de pagamento para criar um aplicativo de contas a pagar geral que pode calcular
os pagamentos devidos aos funcionários da empresa e os valores das faturas a serem
cobrados por bens adquiridos. Como você vai ver, as interfaces possiblitam recursos
polimórficos semelhantes aos que são possíveis com a herança.
147
Apêndice G Programação orientada a objetos: herança e polimorfismo
148
Android: Como Programar
149
Apêndice G Programação orientada a objetos: herança e polimorfismo
150
Android: Como Programar
151
Apêndice G Programação orientada a objetos: herança e polimorfismo
mensagem desenhar para a classe abstrata FormaBidimensional, a classe sabe que formas
bidimensionais devem ser desenhadas, mas não sabe a forma específica a desenhar; por-
tanto, não pode implementar um método desenhar real. As classes concretas fornecem
os detalhes específicos que as tornam adequadas para instanciar objetos.
Nem todas as hierarquias contêm classes abstratas. No entanto, muitas vezes você
vai escrever código cliente que utiliza apenas tipos de superclasse abstrata para reduzir as
dependências do código a um intervalo de tipos de subclasse. Por exemplo, você pode
escrever um método com um parâmetro de um tipo de superclasse abstrata. Quando
chamado, esse método pode receber um objeto de qualquer classe concreta que estenda
direta ou indiretamente a superclasse especificada como tipo do parâmetro.
Às vezes, as classes abstratas constituem vários níveis de uma hierarquia. Por exem-
plo, a hierarquia Forma da Fig. G.3 começa com a classe abstrata Forma. No nível seguinte
da hierarquia estão as classes abstratas FormaBidimensional e FormaTridimensional. O
próximo nível declara classes concretas para FormasBidimensionais (Círculo, Quadrado e
Triângulo) e para FormasTridimensionais (Esfera, Cubo e Tetraedro).
152
Android: Como Programar
depois de escrever o programa de desenho. Talvez esse programa precise exibir formas
como Círculos, Triângulos, Retângulos ou outras que derivem da classe abstrata Forma.
O programa de desenho usa variáveis de Forma para gerenciar os objetos que são exibi-
dos. Para desenhar qualquer objeto dessa hierarquia de herança, o programa de desenho
usa uma variável da superclasse Forma contendo uma referência para o objeto de sub-
classe, a fim de chamar o método desenhar do objeto. Esse método é declarado como
abstract na superclasse Forma; portanto, cada subclasse concreta deve implementar o
método desenhar de uma maneira específica para essa forma – cada objeto da hierarquia
de herança Forma sabe como se desenhar. O programa de desenho não precisa se preocupar
com o tipo de cada objeto ou se encontrou objetos desse tipo.
153
DICA DO PROFESSOR
EXERCÍCIOS
154
C) Diferentemente de uma classe, um tipo de interface não fornece nenhuma implementação.
E) Interfaces são classes que possuem métodos que não podem ser implementados por outras
classes.
E) Novos tipos de objeto que podem responder às chamadas de método já existentes podem
ser incorporados ao sistema sem alterar o sistema básico.
C) Quando um método existente em uma interface é usado por uma classe que não altera a
155
implementação do método, temos um comportamento de polimorfismo.
D) Quando uma classe implementa uma interface, ela se obriga a utilizar e implementar todos
os métodos da interface, com isso, temos um comportamento polimórfico.
E) Quando uma classe implementa uma interface, não há necessidade de utilizar todos os seus
métodos. Entretanto, para que haja um comportamento polimórfico, é necessário
implementar os métodos utilizados de acordo com sua necessidade.
156
A) O código 1 refere-se à criação de uma classe abstrata.
D) O código 4 está escrito de forma errada, pois, para utilizarmos uma interface, devemos
colocar a palavra-chave implements, não extends.
NA PRÁTICA
157
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
HORSTMANN, C. Conceitos de computação com Java. 5.ed. Porto Alegre: Bookman, 2009.
Aula - Polimorfismo
Confira o livro Java para iniciantes no capítulo 7 (246) a relação de Herança e seu métodos que
dão suporte ao polimorfismo.
158
Sobrescrita
APRESENTAÇÃO
Bons estudos.
DESAFIO
Você trabalha como analista/programador em uma fábrica de software e foi encarregado de criar
uma aplicação para realizar o cálculo da área de determinadas figuras geométricas,
especificamente retângulo e triângulo retângulo. Sua tarefa é criar as classes-modelo utilizando
técnicas com herança e sobrescrita de método e uma classe para executar a aplicação. Utilize
uma linguagem de programação orientada a objeto com um IDE para auxiliar na organização do
projeto. (Linguagem recomendada: java com IDE NetBeans.)
159
INFOGRÁFICO
CONTEÚDO DO LIVRO
Acompanhe um trecho do livro A linguagem de programação Java, que serve de base teórica
para esta Unidade de Aprendizagem. Faça o estudo do tópico Acessibilidade e sobrescrita de
métodos.
Boa leitura!
160
A LINGUAGEM DE PROGRAMAÇÃO JAVA
161
CAPÍTULO 18 • PACOTES
pro();
pub();
}
}
Temos quatro métodos, cada um com um modificador de acesso diferente, e cada um
simplesmente identifica a si mesmo. O método show invoca cada um destes métodos para
o objeto atual. Vamos mostrar qual implementação de cada método é invocada quando
aplicada a objetos de diferentes subclasses.
Agora definimos a classe Concrete1, que estende AbstractBase mas vive no paco-
te P2:
package P2;
import P1.AbstractBase;
import P2.Concrete1;
2
Ter uma hierarquia de herança que navega dentro e fora de um pacote é geralmente uma idéia muito ruim. É usada aqui pura-
mente para ilustração.
162
A LINGUAGEM DE PROGRAMAÇÃO JAVA
import P1.Concrete2;
3
Isto ilustra porque navegar dentro e fora de um pacote pode ser confuso e deve ser evitado.
163
DICA DO PROFESSOR
EXERCÍCIOS
C) É um construtor.
D) É acessível.
B) Escrever um método herdado com mesmo tipo de retorno, mas com nome diferente.
164
D) As assinaturas e implementações devem ser diferentes daquela na superclasse.
165
A) A classe Peixe é uma subclasse de Animal.
E) O método locomover(), herdado pela classe Peixe, foi sobrescrito, pois sua assinatura
continua a mesma e apenas seu comportamento foi alterado.
E) Uma invocação externa do método da subclasse (assumindo que ele é acessível fora de sua
classe) resulta na invocação da implementação da superclasse.
NA PRÁTICA
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Conceitos de Computação com Java - Compatível com Java 5 & 6 Cay Horstmann, 2009,
5ª Edição
Acompanhe a obra a seguir onde você poderá aprofundar seus conhecimentos sobre os conceitos
e as principais práticas de programação, dicas uteis sobre as boas práticas de engenharia de
software e etc.
167
Tratamento de exceções
APRESENTAÇÃO
Exceções são erros que ocorrem em tempo de execução. Usando uma linguagem de
programação, você pode tratar erros de tempo de execução de forma estruturada e controlada.
As exceções podem ser uma simples divisão por zero ou a resposta a algum erro interno. Tratar
exceções também impede que nosso programa possa terminar de forma anormal.
Bons estudos.
DESAFIO
Exceções podem ocorrer na execução de uma aplicação. Podemos citar como exemplo o fato de
uma entrada de dados lançada pelo usuário, que deveria ser um número inteiro, e, por algum
motivo, o usuário digita um caractere. Caso não seja tratado, a aplicação pode terminar de forma
anormal.
Você trabalha como analista/programador em uma fábrica de software. Um dos clientes está
com um problema; sua aplicação é uma calculadora que funciona recebendo dois números, e o
cliente informa uma das quatro operações básicas da matemática (adição, subtração,
multiplicação e divisão). O que ocorre é que quando o usuário digita um valor que não seja um
número decimal, a aplicação gera um erro e encerra. Sua tarefa é implementar um tratamento de
exceções nesta aplicação.
168
INFOGRÁFICO
CONTEÚDO DO LIVRO
Uma exceção é um erro que ocorre no tempo de execução. Usando o subsistema Java de
tratamento de exceções, você pode tratar erros de tempo de execução de maneira estruturada e
controlada.
Acompanhe um trecho do livro Java para iniciantes, obra que serve de base teórica para esta
Unidade de Aprendizagem e traz uma abordagem sobre tratamento de exceções. Inicie o estudo
no tópico Principais habilidades e conceitos e finalize ao final de Consequências de uma
exceção não capturada.
169
Capítulo 9 Tratamento de exceções
.....................................................................................................................................
170
Java para Iniciantes
Hierarquia de exceções
Em Java, todas as exceções são representadas por classes e todas as classes de exce-
ções são derivadas de uma classe chamada Throwable. Logo, quando uma exceção
ocorre em um programa, um objeto de algum tipo de classe de exceção é gerado.
Há duas subclasses diretas de Throwable: Exception e Error. As exceções de tipo
Error estão relacionadas a erros que ocorrem na própria máquina virtual Java e não
nos programas. Esses tipos de exceções fogem ao nosso controle e geralmente os
programas não lidam com elas. Portanto, não serão descritas aqui.
Erros que resultam da atividade do programa são representados por subclasses
de Exception. Por exemplo, erros de divisão por zero, que excedem os limites do
array e relacionados a arquivos se enquadram nessa categoria. Em geral, os progra-
mas devem tratar exceções desses tipos. Uma subclasse importante de Exception é
RuntimeException, que é usada para representar vários tipos comuns de erros de
tempo de execução.
Pergunte ao especialista
P: Para não deixar dúvidas, você poderia descrever novamente as condições que
fazem uma exceção ser gerada?
R: Exceções são geradas de três maneiras diferentes. Em primeiro lugar, a Máquina Vir-
tual Java pode gerar uma exceção em reposta a algum erro interno sobre o qual não
tenhamos controle. Normalmente, o programa não trata esses tipos de exceções. Em
segundo lugar, exceções padrão, como as correspondentes à divisão por zero ou índi-
ces fora dos limites de um array, são geradas por erros no código do programa. Temos
que tratar essas exceções. Em terceiro lugar, podemos gerar manualmente uma exce-
ção usando a instrução throw. Independentemente de como uma exceção for gerada,
ela será tratada da mesma forma.
171
Capítulo 9 Tratamento de exceções
NOTA
A partir de JDK 7, há outra forma de instrução try que dá suporte ao gerenciamento
automático de recursos. Essa nova forma de try se chama try-with-resources. Ela é
descrita no Capítulo 10, no contexto do gerenciamento de fluxos de I/O (como os
conectados a um arquivo), porque os fluxos são um dos recursos mais usados.
172
Java para Iniciantes
para
nums[0] = 10;
class ExcTest {
173
Capítulo 9 Tratamento de exceções
try {
ExcTest.genException();
} catch (ArrayIndexOutOfBoundsException exc) {
// captura a exceção
System.out.println("Index out-of-bounds!");
}
System.out.println("After catch statement.");
}
}
Esse programa produz a saída a seguir, que é igual à produzida pela primeira
versão mostrada anteriormente:
Before exception is generated.
Index out-of-bounds!
After catch statement.
174
Java para Iniciantes
Embora essa mensagem seja útil na depuração, no mínimo não seria algo que
você gostaria que outras pessoas vissem! Por isso, é importante seu programa tratar
ele próprio as exceções, em vez de depender da JVM.
Como mencionado anteriormente, o tipo da exceção deve coincidir com o tipo
especificado em uma instrução catch. Se não coincidir, a exceção não será captura-
da. Por exemplo, o programa abaixo tenta capturar um erro no limite do array com
a instrução catch de uma ArithmeticException (outra das exceções internas Java).
Quando o limite do array é excedido, uma ArrayIndexOutOfBoundsException é
gerada, mas não será capturada pela instrução catch. Isso resulta no programa sendo
encerrado de modo anormal.
// Não funcionará!
class ExcTypeMismatch {
public static void main(String args[]) {
int nums[] = new int[4]; Essa linha lança uma
ArrayIndexOutOfBoundsException.
try {
System.out.println("Before exception is generated.");
175
Capítulo 9 Tratamento de exceções
Esse exemplo ilustra outro ponto importante: uma vez que uma exceção foi
tratada, ela é removida do sistema. Portanto, no programa, cada vez que o laço é
percorrido, entramos novamente no bloco try; qualquer exceção anterior terá sido
tratada. Isso permite que seu programa trate erros repetidos.
176
Java para Iniciantes
exceção diferente. Por exemplo, o programa mostrado aqui captura erros tanto de
limite de array quanto de divisão por zero:
// Usa várias instruções catch.
class ExcDemo4 {
public static void main(String args[]) {
// Aqui, numer é maior do que denom.
int numer[] = { 4, 8, 16, 32, 64, 128, 256, 512 };
int denom[] = { 2, 0, 4, 4, 0, 8 };
Como a saída confirma, cada instrução catch responde apenas ao seu tipo de exceção.
Em geral, as expressões catch são verificadas na ordem em que ocorrem em
um programa. Só uma instrução que apresente correspondência é executada. Todos
os outros blocos catch são ignorados.
177
DICA DO PROFESSOR
EXERCÍCIOS
D) A linguagem de programação java define exceções-padrão para erros que são comuns nos
programas.
178
D) Void, throw, throws, static e abstract.
try {
B) No código, o try é responsável por monitorar a exceção, que pode ser qualquer
implementação.
E) Caso uma exceção fosse lançada, ela seria capturada pela instrução try.
179
B) O programa terminará normalmente.
C) Não teremos problemas caso o programa passe uma mensagem através de um método print
para o usuário.
A) Um dos principais benefícios da exceção é que seu programa não pare a execução.
E) Caso tenhamos um try dentro de outro, o interno não necessita ter uma instrução catch
associada.
NA PRÁTICA
Toda aplicação está suscetível a erros, e estes erros podem acontecer com uma frequência mais
comum do que se pensa. Para exemplificarmos erros que podem ocorrer na aplicação, podemos
citar os seguintes: tentar abrir um arquivo inexistente, manipular um tipo de dado como se fosse
outro tipo, fazer uma divisão por zero, manipular um objeto com valor nulo, tentar utilizar
métodos ou classes não existentes, tentar conectar a um servidor ou banco de dados inexistente,
180
entre outros.
Esses erros são chamados de exceções e devem ser tratados pelo programador para controlar tais
imprevistos. Para tratar as exceções em java, são utilizados os comandos try catch. O try catch
funciona da seguinte maneira: o código que você quer monitorar fica dentro do bloco do try;
caso aconteça alguma exceção, o catch captura e trata.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Assista e vídeo e saiba mais sobre como tratar possíveis erros em Java.
No artigo abaixo você saberá mais sobre o tratamento de erros com os blocos Try e Catch, em
C#.
181
Conteúdo interativo disponível na plataforma de ensino!
Blocos Try/Catch
O artigo abaixo artigo apresenta informações sobre programação utilizando os blocos Try/Catch
no Java.
182
Introdução à herança
APRESENTAÇÃO
Quando falamos em herança, logo nos vêm à mente situações intrínsecas no meio em que
vivemos; por exemplo, uma pessoa que deixa seus bens como herança para seus dependentes.
Podemos citar também heranças genéticas, um filho herda a cor de pele, a cor de cabelo e a cor
de olhos, entre outras características, de seus pais biológicos. Em orientação a objetos não é
diferente, a não ser o fato de estarmos lidando com códigos. Herança, em orientação a objetos,
consiste na criação de uma estrutura que possui uma classe raiz ou podemos referi-la como
classe pai, mãe, genérica ou superclasse; e classes especializadas, que também podemos chamar
de classes filhas ou subclasses.
Nesta Unidade de Aprendizagem você verá o que é herança e como implementar esta estrutura.
Bons estudos.
DESAFIO
Trabalhar com herança em orientação a objetos pode nos trazer muitas vantagens, como a
economia de código; entretanto, é importante termos um bom conhecimento sobre o assunto
para aplicá-lo da melhor forma em nossos projetos.
INFOGRÁFICO
CONTEÚDO DO LIVRO
Trabalhar com herança em orientação a objetos pode nos trazer uma redução significativa de
184
código e, em consequência, um aumento de produtividade. Portanto, o domínio destes conceitos
torna-se vital para o desenvolvimento de softwares.
Boa leitura.
185
Introdução à
herança em C++
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
Ao estudar herança, você percebe seus conceitos, aprende a realizar
reutilização de código (poupando tempo de desenvolvimento), como
utilizar construtores e funções-membro da classe base, bem como a
diferença entre vinculação estática e dinâmica.
Neste capítulo, você estudará um importante conceito de progra-
mação orientada a objetos. Por meio da utilização da herança você será
capaz de definir classes novas que serão extensões de classes existentes.
Conceito
A herança é um dos principais pontos da programação orientada a objetos,
promovendo a extensibilidade do código, a reutilização e uma maior coerência
lógica no modelo de implementação. Os métodos herdados são usados da
mesma forma que os métodos não herdados, nenhum trecho de código é ne-
cessário para mencionar que os métodos serão herdados, o uso do recurso em
uma classe não requer saber se ele foi ou não herdado, o que gera flexibilidade
para o programador.
Entre as vantagens oferecidas pela herança, podemos citar a manutenção
de bibliotecas, para uso futuro de determinados recursos que sejam utilizados
com frequência.
186
Introdução à herança em C++
187
Introdução à herança em C++
188
Introdução à herança em C++
Caso seja omitido o construtor de uma classe base, o objeto base será
construído com o construtor default dela. Porém, se a classe base não possuir
um construtor default, você terá que chamar, de forma explícita, um construtor
da classe base no construtor da classe derivada. Se você invocar outra função-
-membro sobre o parâmetro implícito, não precisará especificar o parâmetro,
mas somente escrever o nome da função-membro.
Segundo Horstmann (2005), um dos erros mais frequentes é tentar acessar
campos privativos da classe base. Outro possível erro é que, ao estender a
funcionalidade de uma função da classe base, os programadores se esquecem
do nome da classe. Assim, sempre que se chama uma função de determinada
classe base a partir de uma função do mesmo nome de uma classe derivada,
tenha a certeza de fornecer o nome completo da função, incluindo o nome
da classe base.
Ainda dentro da implementação de herança, você precisa saber que existem
tipos de vinculação de objetos, dinâmica e estática. O tipo estático é o tipo
foi declarado no texto do programa como tipo ponteiro, sem fazer qualquer
diferença para onde está apontando; já o tipo dinâmico é determinado pelo
tipo de objeto ao qual se refere neste momento, sendo assim, indica como ele
se comportará. O tipo dinâmico pode ser modificado à medida que o programa
for sendo executado, normalmente por meio de atribuições.
As funções virtuais são dinamicamente vinculadas, portanto, a função espe-
cífica chamada será determinada pelo tipo dinâmico de objeto, de acordo com
o modo como é chamada. Porém, os parâmetros são vinculados estaticamente,
ou seja, você pode chamar uma função definida em uma classe derivada, mas
deve utilizar um valor padrão de parâmetro da classe base.
“Uma classe derivada herda todos os campos de uma classe base. Porém, se os campos
forem privativos, as funções da classe derivada não possuem direito de acesso a eles”
(HORSTMANN, 2005, p. 396).
189
Introdução à herança em C++
public;
private;
protected.
Herança pública garante que tudo o que se aplica a objetos da classe base,
será aplicado aos objetos da classe derivada, porque cada objeto da classe
derivada é um objeto da classe base. Na classe herdada como public, membros
da classe derivada permanecem como públicos; membros private da classe base
só podem ser acessados por meio de funções públicas ou protegidas da classe
base; e membros protected que estiverem na classe derivada se comportam
na classe derivada como protegidos.
A utilização do atributo protected funciona da mesma forma que o private
sob o ponto de vista interno da classe, a diferença está no fato de que atributos
protected são visíveis pelas classes derivadas, ao passo que os private não.
Essas características podem ser traduzidas por permitir flexibilidade para o
programador.
Na classe herdada como protected, membros public da classe base ficam
como se estivessem protegidos na classe derivada; membros private só podem
ser acessados por funções da classe base que se utilizem das informações que
estão neles; e membros protected se comportam como se fossem copiados
como protegidos na classe derivada.
Na classe herdada como private, membros public agem como se fossem
private na classe derivada, membros private estarão presentes, porém ocultos
como private, só podendo ser acessados por funções da classe base que se utili-
zem das informações que neles contém; já os membros protected comportam-se
como private na classe derivada. Assim, sobressai o atributo mais restritivo.
190
Introdução à herança em C++
191
Introdução à herança em C++
192
Introdução à herança em C++
193
Introdução à herança em C++
Leituras recomendadas
VOTRE, V. P. C++ explicado e aplicado. Rio de Janeiro: Alta Books, 2016.
WIKILIVROS. Programar em C++: herança. 2011. Disponível em: <https://pt.wikibooks.
org/wiki/Programar_em_C%2B%2B/Heran%C3%A7a>. Acesso em: 23 abr. 2018.
194
DICA DO PROFESSOR
Assista ao vídeo e veja algumas dicas de quando e como usar herança no paradigma de
programação orientado a objetos.
EXERCÍCIOS
C) Quando há a necessidade de utilizar uma classe que está em outro pacote, fazemos uso da
palavra-chave herança.
D) Dizemos que há herança quando duas ou mais classes dependem uma da outra.
195
C) Quando necessitamos aumentar a produtividade no desenvolvimento.
D) Quando temos uma relação e um ou vários atributos em comum entre duas ou mais
classes.
196
}
B) Não é necessária a criação de métodos de acesso como get e set, pois a classe possui
apenas um atributo.
D) A classe "Agua", quando instanciada, terá acesso apenas ao atributo ph, através dos
métodos set e get.
E) A classe não poderá ser instanciada, pois é necessário que os métodos de acesso da
superclasse estejam implementados na subclasse
return nome;
}
public void setNome(String nome){
this.nome = nome;
}
197
return idade;
}
public void setIdade(int idade){
this.idade = idade;
}
=================== // ============================
return gestacao;
}
public void setGestacao(String gestacao){
this.gestacao = gestacao;
}
return especVida;
}
public void setEspecVida(String especVida){
this.especVida = especVida;
}
198
=============================//==========================
return raca;
}
public void setRaca(String raca){
this.raca = raca;
}
============================//============================
return etnia;
}
public void setEtnia(String etnia){
this.etnia = etnia;
}
199
B) A classe "Cachorro" está estendendo de "Mamifero".
D) Por se tratar de herança, a classe "Homem" poderá herdar apenas membros da classe
"Mamifero".
NA PRÁTICA
Assista ao vídeo e veja na prática como implementar uma estrutura de herança na linguagem de
programação java.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Herança em Java
Herança
Nesse vídeo você a aplicação e para que serve, como reaproveitamento de código e
polimorfismo.
200
Conteúdo interativo disponível na plataforma de ensino!
201
Herança na orientação a objetos
APRESENTAÇÃO
Bons estudos.
DESAFIO
202
Imagine que você é desenvolvedor Java em uma startup fintech ou financeira. Uma de suas
tarefas é implementar uma funcionalidade
para gerenciar os saques dos clientes correntistas. Nesse contexto,
crie uma classe para representar uma conta corrente, com métodos para depositar uma quantia,
sacar uma quantia e obter o saldo atual
da conta.
INFOGRÁFICO
Desenvolver código limpo e fácil de manter, muitas vezes, é um desafio para desenvolvedores.
A alta demanda do dia a dia e a necessidade
de aumentar a produtividade pode ser uma armadilha para produzir códigos que futuramente
trarão mais problemas na manutenção, aumentando cada vez mais os custos. Quando se trata de
código
em Java, existem alguns padrões que podem ser seguidos para que o programador não cometa
erros ao abusar de conceitos como herança
e sobrecargas. Quando se aplica herança no código, é possível, muitas vezes, agrupar várias
classes e deixá-las amarradas, o que pode
se tornar um problema ao realizar uma modificação em alguma
das classes.
203
204
CONTEÚDO DO LIVRO
A herança é uma das características mais poderosas e importantes da orientação a objetos, pois
permite o reaproveitamento de atributos e de métodos no código. O reaproveitamento de código
é um dos principais pontos capazes de melhorar a produtividade de um programador, afinal,
reescrever trechos de código sem necessidade é um desperdício de tempo. Na programação
orientada a objetos, o conceito de herança pode ajudar desenvolvedores a produzirem sistemas
mais eficientes e fáceis de manter.
Boa leitura.
205
Herança na orientação
a objetos
Objetivos de aprendizagem
Ao final deste texto, você deve apresentar os seguintes aprendizados:
Introdução
As linguagens de programação que possuem paradigma orientado
a objetos são amplamente utilizadas, tanto na indústria quanto na
academia. A primeira linguagem de programação totalmente orien-
tada a objetos teve origem na década de 1970, chamada de Smalltalk
(GOLDBERG, 1984). Na década seguinte, começaram a surgir outras
linguagens com o mesmo paradigma, como Delphi, Pascal e Java.
A linguagem Java ganhou destaque e se popularizou, pois fornece,
entre outras coisas, portabilidade.
Nesse contexto de orientação a objetos, alguns conceitos são funda-
mentais, sendo um deles o de herança. O relacionamento de herança é
algo inovador na orientação a objetos e forneceu um meio de abstrair
informações de formas mais precisas.
Neste capítulo, você estudará sobre o princípio de herança em Java
na orientação a objetos. Além disso, verá como utilizar a sobrecarga de
construtores. Por fim, verá como construir uma aplicação com estrutura
de herança utilizando construtores para criar objetos.
206
Herança na orientação a objetos
207
Herança na orientação a objetos
Como pode ser visto na Figura 1, nesse caso, tem-se, em uma mesma
classe, muitos atributos que não pertencem ao mesmo objeto. Por exemplo, ao
instanciar um objeto sofa da classe Movel, esse objeto não possui informa-
ções sobre o número de portas. É importante ressaltar que manter atributos e
responsabilidades em um objeto que não pertencem a ele não é uma prática
correta de programação.
Para lidar com esse cenário, pode-se manter na classe Movel o que é
comum a todos os móveis e criar classes específicas para cada um dos móveis
que possuem características diferentes. A Figura 2 apresenta o diagrama de
classes com a estrutura de como se pode modelar para que as classes não
repitam atributos.
208
Herança na orientação a objetos
209
Herança na orientação a objetos
210
Herança na orientação a objetos
2 Sobrecarga de construtor
As classes possuem métodos responsáveis por inicializar o objeto, os quais são
chamados de construtores. Em Java, o construtor é definido como um método
cujo nome deve ser o mesmo da classe e sem indicação do tipo de retorno.
O construtor é unicamente invocado no momento da criação do objeto, por
meio do operador new (DEITEL; DEITEL, 2017). O retorno desse operador
é uma referência para o objeto recém-criado.
Em Java, o construtor pode receber argumentos, como em qualquer mé-
todo. Uma classe pode possuir mais de um construtor, o que é chamado de
sobrecarga (DEITEL; DEITEL, 2017). Observe, por exemplo, os construtores
definidos para a classe Point do pacote java.awt. A classe java.awt.
Point tem dois campos, x e y, do tipo int. Essa classe oferece um construtor
que permite criar um ponto representando as suas coordenadas, passadas
como argumentos para o construtor:
211
Herança na orientação a objetos
public Point(Point p)
public Point()
212
Herança na orientação a objetos
import java.util.Date;
import java.util.Date;
213
Herança na orientação a objetos
import java.util.Date;
214
Herança na orientação a objetos
215
Herança na orientação a objetos
DEITEL, P.; DEITEL, H. Java: como programar. 10. ed. São Paulo: Pearson Education do
Brasil, 2017.
GOLDBERG, A. Smalltalk-80: the interactive programming environment. Boston: Addison-
-Wesley, 1984.
RUMBAUGH, J. et al. Object-oriented modeling and design. Englewood Cliffs: Prentice-
-Hall, 1991.
216
DICA DO PROFESSOR
Nesta Dica Do Professor, você vai ver um pouco mais sobre esses conceitos importantes
relacionados à herança na programação orientada a objetos.
EXERCÍCIOS
A) Modificador private.
B) Modificador protected.
C) Modificador public.
D) Modificador default.
E) Modificador extends.
217
2) Em uma classe, temos construtores que são usados para inicializar a classe. Quando,
em uma relação de herança, tanto a superclasse quanto a classe filha têm
construtores, os dois devem ser executados.
3) O método construtor de uma classe Java é um método especial, que tem o mesmo
nome da classe e é executado quando a classe é instanciada. Em Java, é possível
realizar sobrecarga de construtor.
218
B) É possível criar vários métodos construtores, todos com parâmetros diferentes.
C) É possível criar somente um método construtor e estender esse método por meio de
herança.
E) Ao se criar um objeto da classe horista ocorrerá um erro, pois essa classe horista não tem
construtor.
219
adaptar os métodos herdados.
B) O resultado será 400.0, pois a classe gerente herda da classe funcionário e será executado o
método da superclasse.
C) O resultado será 1000.0, pois serão executados os métodos da classe gerente e funcionário.
D) O resultado será um erro de execução, pois a classe gerente não tem um atributo salário
para o cálculo.
E) O resultado será 400.0, pois a classe gerente sobrecarrega a classe funcionário e será
executado o método da superclasse.
NA PRÁTICA
220
Neste Na Prática, você vai ver como Mariana usa sobrecarga de construtores no seu dia a dia no
desenvolvimento de sistemas Java.
221
222
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
A computação quântica vem sendo estudada e desenvolvida nas últimas décadas como uma
solução às barreiras da computação clássica. Paralelamente ao desenvolvimento de hardware,
existem diversas pesquisas para evoluir as abordagens de software. Nesse contexto, o trabalho a
seguir apresenta a proposta de uma linguagem de programação para computadores quânticos,
baseada no Java e em suas características, como herança e polimorfismo.
223
Programação orientada a objetos:
herança e polimorfismo
APRESENTAÇÃO
Bons estudos.
DESAFIO
224
Com base em tais informações e utilizando o conceito de herança, apresente o modelo de classes
e o modelo descritivo com os atributos e métodos das classes necessárias para atender a esse
requisito. Utilize os métodos 'get' e 'set' para manipulação dos atributos de cada classe.
INFOGRÁFICO
Neste Infográfico, você verá a sintetização de conceitos relacionados à herança entre classes,
abordando a hierarquia de classes, herança simples e herança múltipla.
225
226
CONTEÚDO DO LIVRO
Outro benefício importante da programação orientada a objetos está ligado ao reuso de código.
E, quando se fala em reuso de código em programação orientada a objetos, é necessário falar
sobre herança e polimorfismo.
Boa leitura.
227
Programação orientada
a objetos: herança
e polimorfismo
Objetivos de aprendizagem
Ao final deste texto, você deverá apresentar os seguintes aprendizados:
Introdução
O paradigma da programação orientada a objetos surgiu com o intuito
de aplicar conceitos da realidade ao contexto da programação de com-
putadores. O próprio nome, orientação a objetos, remete ao conceito
de que o foco da construção dos programas está em orientar a estrutura
para as entidades objetos, que emulam noções existentes no mundo real.
Para que o paradigma de orientação a objetos tenha maior abrangên-
cia, faz-se necessário que outros conceitos também sejam possíveis e,
nesse escopo, ocorre a herança entre objetos. Assim como na realidade,
no contexto da programação orientada a objetos, a herança está asso-
ciada à característica de possuir comportamentos de outra entidade.
Neste capítulo, iremos entender o funcionamento do conceito de
herança na programação orientada a objetos. Além disso, abordaremos
o conceito de polimorfismo, que permite que a herança entre objetos
seja possível, mesmo com alterações no comportamento herdado, para
atender a características específicas do objeto herdeiro.
228
Programação orientada a objetos: herança e polimorfismo
Animal
Cachorro Gato
229
Programação orientada a objetos: herança e polimorfismo
Estado Cidade
Existem situações em que seu uso pode ser pertinente, mas a herança múl-
tipla também possui desvantagens, especialmente em razão de sua semântica,
que pode dificultar a manutenção do código. Conforme Lima (2014, p. 148)
observa,
[...] uma desvantagem da herança múltipla é que sua semântica se torna muito
complicada em certas circunstâncias. Por exemplo, se uma classe E tem sub-
classes B e C, e um método M é definido diferentemente em B e C, que imple-
mentação de M deveria ser herdada por E: aquela em B, aquela em C ou ambas?
Polimorfismo
O polimorfismo na programação orientada a objetos permite que uma ou mais
classes derivadas de uma mesma superclasse possam invocar métodos que
possuam uma mesma assinatura, mas com comportamentos diferenciados
para cada classe derivada, utilizando, para isso, uma referência a um objeto
da superclasse.
A definição de polimorfismo é mais um dos recursos da orientação a
objetos que possibilita que um comportamento encontrado na realidade seja
aplicado à programação. Na natureza, existem animais que são capazes de
modificar sua forma ou comportamento para atender a determinada situação,
e é isto que o polimorfismo possibilita na programação orientada a objetos.
Segundo Tucker e Noonan (2009, p. 323), “em linguagens orientadas a ob-
jetos, polimorfismo refere-se à ligação tardia de uma chamada a uma ou várias
diferentes implementações de um método em uma hierarquia de herança”.
Para entendermos melhor este exemplo, suponhamos que uma aplicação
implementa um programa de desenho. Em um programa desses, podemos ter
diferentes formas geométricas: círculo, quadrado, retângulo etc.
231
Programação orientada a objetos: herança e polimorfismo
classe circulo;
classe quadrado;
classe retangulo.
FormaGeometrica
desenhar()
Circulo Retangulo
Quadrado
232
Programação orientada a objetos: herança e polimorfismo
233
Programação orientada a objetos: herança e polimorfismo
234
Programação orientada a objetos: herança e polimorfismo
Pessoa
nome: string
cpf: string
data_nascimento : Date
newAttr : integer
obterDescontoMensalidade(valor)
Professor
Aluno
salario : double
Matricula : String
disciplina : String
Figura 4. Modelo de classes para situação proposta de um programa para uma escola.
235
Programação orientada a objetos: herança e polimorfismo
236
Programação orientada a objetos: herança e polimorfismo
_ nome
_ cpf
_ data
237
Programação orientada a objetos: herança e polimorfismo
https://qrgo.page.link/6xYCs
238
Programação orientada a objetos: herança e polimorfismo
BOOCH, G.; RUMBAUGH, J.; JACOBSON, I. UML: guia do usuário. 2. ed. Rio de Janeiro:
Elsevier; Campus, 2006. 474 p.
LIMA, A. S. UML 2.5: do requisito à solução. São Paulo: Érica, 2014. 368 p.
TUCKER, A. B.; NOONAN, R. E. Linguagens de programação: princípios e paradigmas. 2.
ed. Porto Alegre: AMGH, 2009. 630 p.
Leituras recomendadas
EDELWEISS, N.; LIVI, M. A. C. Algoritmos e programação: com exemplos em Pascal e C.
Porto Alegre: Bookman, 2014. 476 p. (Série Livros Didáticos Informática UFRGS).
LEDUR, C. L. Desenvolvimento de sistemas com C#. Porto Alegre: SAGAH, 2018. 268 p.
MACHADO, R. P.; FRANCO, M. H. I.; BERTAGNOLLI, S. C. Desenvolvimento de software III:
programação de sistemas web orientada a objetos em Java. Porto Alegre: Bookman,
2016. 220 p. (Série Tekne; Eixo Informação e Comunicação).
OKUYAMA, F. Y.; MILETTO, E. M.; NICOLAO, M. Desenvolvimento de software I: conceitos bá-
sicos. Porto Alegre: Bookman, 2014. 236 p. (Série Tekne; Eixo Informação e Comunicação).
NICOLETTI, M. C. A cartilha Prolog. São Carlos: Edufscar, 2003. 124 p. (Série Apontamentos).
PINHEIRO, F. A. C. Elementos de programação em C: em conformidade com o padrão
ISO / IEC 9899. Porto Alegre: Bookman, 2012. 548 p.
SEBESTA, R. W. Conceitos de linguagem de programação. 11. ed. Porto Alegre: Bookman,
2018. 758 p.
239
DICA DO PROFESSOR
Nesta Dica do Professor, você irá entender o conceito de polimorfismo para que seja possível
diferenciar cada um dos seus tipos de implementação.
EXERCÍCIOS
C) Todos os atributos serão herdados da classe MeioPagamento, mas os métodos não serão.
E) Não será possível criar um objeto a partir da classe CartaoCredito sem antes criar objeto
MeioPagamento.
240
2) Utilizando ainda o exemplo do exercício anterior, caso existisse a necessidade de
inserir um atributo para armazenar o valor do limite de gastos diários, que seria
único por CartaoCredito, lembrando que a classe MeioPagamento também tem como
herdeira a classe CartaoDebito, assinale a alternativa correta sobre essa
implementação:
A) Herança Composta.
B) Herança Associativa.
C) Herança Dupla.
D) Herança Múltipla.
241
E) Herança Binária.
A) Sobrecarga e Sobreposição.
B) Estático e Sobrecarga.
C) Dinâmico e Sobreposição.
242
D) Alternativo e Sobrecarga.
E) Alternativo e Sobreposição.
NA PRÁTICA
243
244
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
Neste vídeo, você entenderá, de forma bem didática, sobre o conceito de herança na
programação orientada a objetos.
Conceituando polimorfismo
245
Padrões de projeto orientados a objeto
APRESENTAÇÃO
Desenvolver software a partir do zero pode se tornar uma atividade um tanto complexa. Para
ajudar, existem padrões de projeto. Um projeto deve ser específico para atender o problema a
resolver, e genérico para ser usado em desenvolvimentos futuros.
Bons estudos.
DESAFIO
Você trabalha como analista/programador em uma fábrica de software e foi encarregado de criar
uma aplicação para fazer cálculos utilizando as quatro operações básicas da matemática. Esses
cálculos serão executados apenas entre dois números. Você deverá criar um projeto e um pacote;
logo a seguir, crie as classes necessárias orientadas pelo padrão solicitado, e não esqueça de
criar uma classe de controle para instanciar as outras classes e testar os resultados. Para a criação
da aplicação, utilize o padrão de projeto Strategy. Exporte o projeto em formato zip e envie.
INFOGRÁFICO
246
CONTEÚDO DO LIVRO
Projetar software orientado a objetos é difícil, mas projetar software> reutilizável orientado a
objetos é ainda mais complicado. Você deve identificar objetos pertinentes, fatorá-los em
classes no nível correto de granularidade, definir as interfaces das classes, as hierarquias de
herança e estabelecer as relações-chave entre eles.
Acompanhe um trecho do livro Padrões de projeto, o qual serve de base teórica para esta
Unidade de Aprendizagem. Inicie o estudo pelo tópico Introdução e finalize em O que é um
padrão de projeto?
Boa leitura!
247
1
Introdução
248
CAPÍTULO 1 INTRODUÇÃO
* N. de R. T: Atualmente, já existe literatura disponível sobre padrões para domínios específicos. Ver Analysis
Patterns e Enterprise Integration Patterns ambos de Martin Fowler.
249
PADRÕES DE PROJETO
250
CAPÍTULO 1 INTRODUÇÃO
outra. Neste livro concentramos-nos sobre os padrões que estão em um certo nível de
abstração. Padrões de projeto não são projetos, como listas encadeadas e tabelas de
acesso aleatório, que podem ser codificadas em classes e ser reutilizadas tais como
estão. Tampouco são projetos complexos, de domínio específico, para uma aplicação
inteira ou subsistema. Padrões de projeto, neste livro, são descrições de objetos e classes
comunicantes que precisam ser personalizadas para resolver um problema geral de projeto
num contexto particular.
Um padrão de projeto nomeia, abstrai e identifica os aspectos-chave de uma
estrutura de projeto comum para torná-la útil para a criação de um projeto orientado
a objetos reutilizável. O padrão de projeto identifica as classes e instâncias participan-
tes, seus papéis, colaborações e a distribuição de responsabilidades. Cada padrão de
projeto focaliza um problema ou tópico particular de projeto orientado a objetos. Ele
descreve em que situação pode ser aplicado, se ele pode ser aplicado em função de
outras restrições de projeto e as conseqüências, custos e benefícios de sua utilização.
Uma vez que em algum momento devemos implementar nossos projetos, um padrão
de projeto também fornece exemplos em código – nesse caso, C++ e, algumas vezes,
Smalltalk – para ilustrar uma implementação.
Embora padrões de projeto descrevam projetos orientados a objeto, baseiam-se
em soluções reais que foram implementadas nas principais linguagens de programa-
ção orientadas a objeto, como Smalltalk e C++, em vez de implementações em
linguagens procedurais (Pascal, C, Ada) ou linguagens orientadas a objetos mais
dinâmicas (CLOS, Dylan, Self). Nós escolhemos Smalltalk e C++ por razões práticas:
a nossa experiência do dia a dia foi com estas linguagens e elas estão se tornando cada
vez mais populares.*
A escolha da linguagem de programação é importante porque influencia o
ponto de vista do projetista (usuário do pradrão): nossos padrões assumem recursos
de linguagem do nível do Smalltalk/C++, e essa escolha determina o que pode, ou
não, ser implementado facilmente. Se tivéssemos assumido o uso de linguagens
procedurais, deveríamos ter incluído padrões de projetos como “Herança”, “Encap-
sulamento” e “Polimorfismo”. De maneira semelhante, alguns dos nossos padrões
são suportados diretamente por linguagens orientadas a objetos menos comuns. Por
exemplo, CLOS tem multimétodos que diminuem a necessidade de um padrão como
Visitor (pág. 305). De fato, há bastante diferenças entre Smalltalk e C++, o que
significa que alguns padrões podem ser expressos mais facilmente em uma lingua-
gem que em outra. (Ver Iterator, 244, por exemplo).
* N. de R. T: Essa observação foi feita em 1995, quando, de fato, as linguagens C++ e Smalltalk ganharam grande
reconhecimento.
251
DICA DO PROFESSOR
EXERCÍCIOS
C) Bons projetistas sabem que não devem fazer e resolver problemas a partir dos princípios
elementares ou do zero.
252
C) A solução do problema incluirá uma lista de condições que devem ser satisfeitas para que
faça sentido aplicar padrão.
A) Criação.
B) Escopo.
C) Estrutural.
D) Comportamental.
253
B) Representa uma operação a ser executada sobre os elementos da estrutura de um objeto.
C) Permite que um objeto altere seu comportamento quando seu estado interno muda.
B) b) O padrão para classes lida com os relacionamentos entre classes e suas subclasses.
NA PRÁTICA
Imagine uma empresa da construção civil que construirá vários imóveis. Nessa atividade,
percebe-se que todos os banheiros são semelhantes, com isso, a experiência empregada na
construção de um deles pode ser aplicada a todos. Portanto, estamos criando um padrão de
projeto. Quando construímos um software, criamos formas para resolver um determinado
254
problema, e, com nossa experiência, repetimos o processo em outras construções, criando um
padrão de projeto.
SAIBA MAIS
Para ampliar o seu conhecimento a respeito desse assunto, veja abaixo as sugestões do
professor:
255