poo metropole digital

121
Programação Orientada a Objetos Professores autores Adriano Bezerra Manuel Gomes Uirá Kulesza Aula 1 – Introdução à Programação Orientada a Objetos Apresentação Nesta disciplina de Programação Orientada a Objetos(POO),você vai estudar os conceitos necessários para se aplicar o paradigma da Orientação a Objetos na programação de computadores. Nas primeiras aulas, você vai estudar basicamente a teoria e no decorrer do curso iremos colocar em prática os conceitos teóricos aprendidos. Os exercícios práticos serão desenvolvidos usando a linguagem Java. É natural e previsível que, após esse curso, você não seja ainda um excelente programador, pois isso leva anos de prática, mas podemos afirmar que você terá uma base sólida para construir sua carreira como programador utilizando esse que é o principal paradigma de desenvolvimento de software atualmente, a Orientação a Objetos. Ah! Um conselho de um experiente amigo para vocês jovens iniciantes, se você quer ser um ótimo profissional, veja nos problemas e desafios uma oportunidade de mostrar que você é capaz. Agarre as oportunidades. Aprendendo bem os fundamentos da Orientação a Objetos, você com certeza já estará dando um grande passo. Objetivos Ao final desta aula, você será capaz de: diferenciar Programação Estruturada e POO; conceituar Classes e Objetos; conceituar Atributos e Métodos; entendera realidade sob o ponto de vista da POO. Introdução

Upload: saint-clair-lima

Post on 05-Aug-2015

288 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: POO Metropole Digital

Programação Orientada a Objetos

Professores autores

Adriano Bezerra

Manuel Gomes

Uirá Kulesza

Aula 1 – Introdução à Programação Orientada a Objetos

Apresentação

Nesta disciplina de Programação Orientada a Objetos(POO),você vai estudar os conceitos necessários para se aplicar o paradigma da Orientação a Objetos na programação de computadores. Nas primeiras aulas, você vai estudar basicamente a teoria e no decorrer do curso iremos colocar em prática os conceitos teóricos aprendidos.

Os exercícios práticos serão desenvolvidos usando a linguagem Java. É natural e previsível que, após esse curso, você não seja ainda um excelente programador, pois isso leva anos de prática, mas podemos afirmar que você terá uma base sólida para construir sua carreira como programador utilizando esse que é o principal paradigma de desenvolvimento de software atualmente, a Orientação a Objetos.

Ah! Um conselho de um experiente amigo para vocês jovens iniciantes, se você quer ser um ótimo profissional, veja nos problemas e desafios uma oportunidade de mostrar que você é capaz. Agarre as oportunidades. Aprendendo bem os fundamentos da Orientação a Objetos, você com certeza já estará dando um grande passo.

Objetivos

Ao final desta aula, você será capaz de:

• diferenciar Programação Estruturada e POO; • conceituar Classes e Objetos; • conceituar Atributos e Métodos; • entendera realidade sob o ponto de vista da POO.

Introdução

Page 2: POO Metropole Digital

Olá pessoal, eu sou Dígito! E estarei com você nessa grande aventura sobre a Programação Orientada a Objetos. Nossa missão é explorar e descobrir os principais conceitos dessa tecnologia e juntos darmos os primeiros passos nesse admirável mundo novo. Vem comigo!!! A Programação Orientada a Objetos (POO) é um paradigma de programação de computadores que usa os conceitos de Objetos e Classes como elementos centrais para representar e processar dados usados nos programas.

Você sabe o que um Paradigma?

Segundo o dicionário Houaiss, paradigma significa modelo, padrão, exemplo. Assim um paradigma de POO é a maneira como pensamos e iremos fazer nossos programas.

E é dessa maneira que iremos aprender a ver o mundo em nossa volta. O mundo dos objetos!

Como tudo começou

De acordo com dados bibliográficos, os conceitos da programação orientada a objetos (POO) surgiram no final da década de 1960, quando a linguagem Simula-68 introduziu os conceitos de objetos e troca de mensagens para construção de programas.

Tais conceitos foram posteriormente amadurecidos e aprimorados durante a década de 1970 pela linguagem de programação Smalltalk, desenvolvida no laboratório de pesquisa da Xerox, nos Estados Unidos. Entretanto, a popularização da POO só se deu ao longo da década de 80 e 90, com as linguagens C++ e Java.

Java é uma das linguagens mais difundidas nos dias atuais e por conta disso foi escolhida para iniciarmos nossos estudos de POO. Ela surgiu, oficialmente, em 1995 e também tem uma historinha interessante... mas, essa história só veremos na próxima aula.

Um dos principais pesquisadores que introduziu os conceitos de POO, foi o cientista Alan Kay (veja a Figura 1) da Xerox, um dos criadores da linguagem Smalltalk. Durante suas pesquisas, Alan desenvolveu a idéia de que poderíamos construir um programa usando conceitos e abstrações do mundo real, como objetos, troca de mensagens. Houve um dia em que Alan Kay pensou:

Page 3: POO Metropole Digital

Figura 1 –Alan Kay

Então, a partir desses questionamentos, ele começou a desenvolver suas ideias sobre um sistema de software fazendo uma comparação com o sistema de seres vivos, como ilustra aFigura 2.

Figura 2 –Alan Kay pensando na programação OO

Nossa! Quantas ideias!!! Mas, não se preocupe que iremos falar e aprender sobre cada uma delas ao longo das diversas aulas deste curso.

Conceitos da Programação Orientada a Objetos

Até aqui, você aprendeu o conceito de programação estruturada, na qual um programa é construído por meio de funções e procedimentos. Na programação estruturada na linguagem C, um programa é definido por meio de uma função principal a qual faz chamadas a outras funções implementadas por nós, programadores.

Na programação OO, a forma de pensar (o paradigma) é diferente. Um programa é visto como um conjunto de objetos que se comunicam através de mensagens. Perceba que a Figura 3 ilustra essa ideia. Cada objeto mantém dados internos, chamados de atributos. Dessa forma, um sistema (programa de computador) desenvolvido usando a POO possui objetos que colaboram entre si, executando tarefas específicas em busca de um objetivo comum.

Page 4: POO Metropole Digital

Figura 3 – Colaboração de Objetos

A Programação Orientada a Objetos está sedimentada sobre quatro pilares derivados do princípio da abstração, são eles: Encapsulamento, Herança, Composição e Polimorfismo. O Princípio da abstração é a nossa capacidade de abstrair a complexidade de um sistema e se concentrar em apenas partes desse sistema, que é o tema central de nosso estudo ou foco em um dado momento.

Por exemplo: quando um médico torna-se um especialista em algum órgão do nosso corpo (exemplo, o coração), ele abstrai sem desconsiderar as influências dos outros órgãos e foca apenas sua atenção nesse órgão. Outro exemplo: quando um engenheiro civil projeta um edifício, ele abstrai a complexidade como um todo e planeja seu projeto em partes: sistema elétrico, hidráulico, estrutural,etc.

Veremos durante todo esse curso cada um desses pilares que compõem a Orientação a Objetos.

Figura 4 – Pilares da Orientação a Objetos

Objetos

O que são objetos? Na programação OO, objetos são usados para representar entidades do mundo real ou computacional. Ou seja, os objetos são usados para representar aqueles elementos e abstrações que fazem parte da solução do programa que estamos desenvolvendo.

Se observarmos ao nosso redor, veremos várias entidades ou abstrações as quais podem ser representadas como objetos no nosso programa. As pessoas e seus carros podem ser vistas como objetos. Na Figura 5, ilustramos, por exemplo, a

Page 5: POO Metropole Digital

pessoa de nome “Camila” que tem um carro “Ferrari”.

Os objetos possuem características pelas quais os identificamos e finalidades para as quais os utilizamos. Essas características são tipicamente chamadas de atributos, no linguajar da programação OO. Cada objeto Pessoa, por exemplo, possui um RG, um nome, uma data de nascimento, etc. Já os objetos do tipo Carro possuem um tipo, uma cor, uma quantidade de portas. A Figura 3 mostra os diferentes atributos que os objetos “Camila” e “Ferrari” possuem, assim como os valores que estão assumindo.

Finalmente, objetos podem também ter comportamentos associados. Objetos do tipo Pessoa, por exemplo, podem andar, correr ou dirigir carros. Já os objetos do tipo Carro podem ter os seguintes comportamentos: ligar, desligar, acelerar, frear. A Figura 5também ilustra os comportamentos que objetos Pessoa e Carro podem ter.

Assim, na POO os objetos possuem características e comportamentos. As características também podem ser chamadas de dados ou atributos. Enquanto os comportamentos também podem ser chamados de operações ou métodos.

Exemplos

Características: (dados, atributos) tipo: Ferrari placa: KZE1018 cor: vermelha número de portas: 2

Comportamentos: (operações, métodos) ligar desligar acelerar frear

Características: nome: Camila cor do cabelo: negro biotipo: magro

Comportamentos: andar correr dirigir Carro

Figura 5 –Exemplos de objetos

Atividade 1

1. Observe os objetos a sua volta, escolha um deles e descreva de 3 a 5 características (atributos) e comportamentos (métodos).

Page 6: POO Metropole Digital

Classes

Agora que você aprendeu o conceito de Objetos em programação OO, podemos passar para outro ponto da nossa conversa. Podemos dizer que no fundo todos nós pensamos e organizamos o mundo segundo a nossa visão das características e finalidades das coisas, logo pensamos o mundo Orientado a Objetos. É muito comum (e com muita frequência o fazemos) criar grupos de objetos com base nas suas características e comportamento. Se pensarmos no universo de objetos Carro, por exemplo, vamos perceber que todos eles sempre possuem os atributos tipo, cor e número de portas. O mesmo vale para o universo de objetos Pessoa, que sempre vão possuir um nome, uma data de nascimento e, possivelmente, um RG.

A modelagem e programação de um conjunto de objetos que possuem características (atributos) e comportamentos (métodos) comuns é feita na POO usando o conceito de Classe. Cada classe funciona no fundo como um molde para a criação de um dado objeto. Os objetos são vistos como representações concretas (instâncias) das classes. AFigura 6, por exemplo, ilustra uma classe que representa os objetos Carro. Como pode ser observado, a classe define que objetos devem ter tipo, cor, placa e número de portas, mas não indica explicitamente quais são seus valores.

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Figura 6 – Classe Carro

A Figura 7 mostra como a partir da classe (entidade abstrata) podemos criar vários objetos diferentes (entidades concretas). Dois diferentes carros foram criados tomando como base a estrutura da classe. Outros objetos carro podem ser criados usando a classe Carro como molde.

CLASSE →

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Page 7: POO Metropole Digital

Tipo: Porsche

Cor: Cinza

Placa: MHZ-4345

Número de Portas: 2

← OBJETOS →

Tipo: Ferrari

Cor: Vermelho

Placa: JKL-0001

Número de Portas: 4

Figura 7 – Classe Carro e dois objetos concretos

Atividade 2

Observando o exemplo daFigura 7, imagine se a classe fosse: Livro, Celular, Mamíferos, Aves e Flores.

1. Como seriam seus objetos?

2. Escreva apenas as características (ou atributos) das classes e objetos!

Atenção – Em alguns livros, esses dois conceitos – classes e objetos – podem ser usados indistintamente.

Exemplos de classes e objetos

Como vimos, diferentes classes (e seus respectivos objetos) podem ser criados em POO, para facilitar a programação do sistema. Na prática, não existem limites ou restrições sobre o que você pode modelar e implementar. A seguir, apresentamos alguns exemplos de classes/objetos para representação de diferentes abstrações em sistemas:

• objetos físicos (um livro, uma mercadoria, uma nota fiscal); • funções de pessoas para os sistemas (cliente, vendedor); • eventos (uma compra, um telefonema); • lugares (loja matriz, revenda norte).

Leituras complementares

MASSAGO, Sadao; SCHÜTZER, Waldeck. Programação Java. Disponível em:

Page 8: POO Metropole Digital

<http://www.dm.ufscar.br/~waldeck/curso/java/>. Acesso em: 13 maio 2010.

Material online introdutório sobre Java.

Resumo

Nesta aula, você estudou o que é a Programação Orientada a Objetos e o que a diferencia da Programação Estruturada. Conhecemos os conceitos de Classes, Objetos, Atributos e Métodos. Além disso, você começou a observar o mundo a nossa volta sob o ponto de vista da Programação Orientada a Objetos.

Autoavaliação

1. Quais as diferenças entre a Programação Estruturada e a POO?

2. Defina o conceito de classe e objetos.

3. Agora, seguindo o exemplo da Figura 3, descreva os possíveis comportamentos (ou métodos) para cada um desses objetos.

4. Para que servem atributos e métodos?

5. Qual é a diferença entre classe e objeto?

6. Identifique classes e objetos para um sistema escolar responsável por controlar as turmas, professores, alunos, notas dos alunos etc. Apresente em detalhes também quem são os atributos e métodos de cada classe que você modelou.

Referencias

BARNES, David J.; KÖLLING Michael.Programação orientada a objetos com Java. São Paulo: Editora Pearson Prentice Hall, 2004.

DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

LEMAY, Laura. Aprenda Java em 21 dias. Tradução: Daniel Vieira. Rio de Janeiro: Campos, 2003.

SANTOS, Rafael. Introdução à programação orientada a objetos usando Java. São Paulo: Editora Campus, 2003.

SINTES, Anthony. Aprenda a programar orientada a objeto em 21 dias. Tradução: João Eduardo Nóbrega Tortello. São Paulo: Pearson Education do Brasil, 2002.

THE JAVA: tutorials. [Tutorial Oficial Java]. Disponível em: <http://java.sun.com/docs/books/tutorial/>. Acesso em: 13 maio 2010.

Page 9: POO Metropole Digital

Aula 2 – Introdução à Java

Apresentação

Nesta aula, você vai conhecer a linguagem Java e aprender um pouco mais sobre sua origem, desde seu surgimento até os dias atuais. Você verá também um dos principais conceitos da Programação Orientada a Objetos – a Classe. Vai aprender também como se representa esse conceito na linguagem Java, além de criar características e comportamentos para uma classe.

Objetivos

Ao final da aula, você será capaz de:

• conhecer um pouco da história da linguagem Java e sua importância no desenvolvimento de software da atualidade;

• entender a teoria sobre Classe; • entender em detalhes uma classe codificada usando a linguagem

Java; • criar atributos e métodos em classes Java.

Introdução à linguagem Java

Você já conhece a linguagem Java? Já pesquisou sobre isso? Bem, a linguagem Java é atualmente uma das mais utilizadas e com maior número de programadores no mundo inteiro. Sua popularidade se deve principalmente às seguintes características: 1. a portabilidade – capacidade de escrever código capaz de ser executado em várias plataformas e sistemas operacionais; 2. suporte a várias tecnologias (redes, acesso a banco de dados etc.); 3. disponibilidade em vários dispositivos móveis, como celular, palmtop e PDA’s. Outra característica fundamental é ser uma linguagem aberta e que evolui de acordo com os desejos da sua comunidade de programadores, além de possuir várias ferramentas gratuitas disponíveis para os desenvolvedores.

Para saber mais... Funcionamento geral de programas Java

Um arquivo .java quando é compilado, através do compilador Java, torna-se um arquivo .class. Esse .class contém códigos bytecodes que é a linguagem utilizada pela Máquina Virtual Java (JVM ou Java VM). Veja a Figura 1.

Page 10: POO Metropole Digital

Figura 1 – Conversão de código Java em Linguagem de máquina

A Máquina Virtual Java converte os bytecodes em linguagem de máquina de acordo com o processador do computador que está sendo executado o programa.

Assim, um mesmo arquivo .class pode ser executado em várias plataformas diferentes, tais como Windows, Linux, Mac, como mostra a Figura 2. Desde é claro, que o computador possua uma Máquina Virtual Java.

Figura 2 –Java para os vários Sistemas Operacionais

Histórico

No inicio dos anos 1990,a Sun Microsystems estava implementando um projeto chamado Green Project cujo objetivo era gerar a interação, sem a participação humana, entre os eletrodomésticos comuns usados pelas pessoas. Para a execução dessa ideia, James Gosling, um dos mentores do projeto, sentiu a necessidade de criar uma nova linguagem que superasse as limitações encontradas na linguagem C. Essa linguagem foi chamada de “OAK” (em português significa carvalho) que, segundo conta-se, foi inspirado na árvore que James via janela de seu escritório. Infelizmente, a ideia e o projeto original de Oaknão obtiveram sucesso!

Entretanto, a Internet estava crescendo e se apresentando como uma nova alternativa de interação. Em maio de 1995, James Gosling adaptou a linguagem OAK para Internet e batizou-a de Java. A linguagem que foi projetada para dispositivos heterogêneos encontrou seu ambiente na rede mundial através de

Page 11: POO Metropole Digital

aplicações que podiam ser executada dentro dos browsers nosApplets Java. A partir daí, usuários e fornecedores (como a IBM) cresceram de maneira assustadora eela tornou-se a linguagem que se expandiu mais que qualquer outra linguagem da história da computação. Hoje, a linguagem Java é referência popular para o desenvolvimento de software na Internet, Celulares, Palmtops, Jogos, Soluções de Negócios, Cartões Inteligentes etc. (Baseado em: <http://pt.wikipedia.org/wiki/Java e http://www.java.com/en/javahistory>. Acesso em: 4 fev. 2010.)

Criação de classes

Falamos que objetos são entidades concretas que possuem características e comportamentos bem definidos, tais objetos podem ser organizados em grupos de características e comportamentos comuns. Esses grupos são chamados de classe. Porém, a classe não serve para organizar no sentido de guardar os objetos,ela serve de modelo de construção. Para os nossos exemplos, todos os carros (objetos) são da classe Carro, pois possuem as mesmas características e comportamentos.

• A classe é o modelo ou molde de construção de objetos. • O modelo define as características e comportamentos que os

objetos irão determinar seus valores e desempenhar suas ações, respectivamente.

• A classe é abstrata (não existe concretamente).

Tipo: ?

Cor: ?

Placa: ?

Número de Portas: ?

Figura 3–Exemplo da ideia de uma classe Carro

ATENÇÃO: já que as classes não existem concretamente, elas são abstratas, servem apenas para gerar os objetos.

Atividade 1

Vamos criar a classe Carro em Java? Então, vamos lá!

1. Abra um editor de texto qualquer e digite o códigomostrado na Listagem 1.

2. Salve com o mesmo nome da classe mais “.java”

Page 12: POO Metropole Digital

Palavra obrigatória para indicar a

criação de uma classe.

Nome da classe escolhido pelo

programador. Por padrão, utiliza-

se sempre a primeira letra

maiúscula.

Conjunto de características

dos objetos da Classe Carro.

Listagem 1 - Esquema de criação para classe "Carro" em Java

Observação: Esse arquivo será salvo como Carro.java

Perceba que não inserimos no código nada sobre o comportamento dos carros, como andar para frente ou para trás, virar a esquerda/direita, frear etc.

Devemos ter em mente que a linguagem de programação é uma representação do mundo sob um ponto de vista. Você se lembra do paradigma? Esse ponto de vista ou paradigma é a orientação a objetos, porém, descrito nas regras da linguagem, que no nosso caso é a linguagem Java.

Na linguagem Java, as características são chamadas de atributos e são escritas informando o tipo de atributo e o nome do atributo. É necessário escrever um ponto-e-vírgula após a declaração de cada atributo, pois é uma exigência da linguagem Java, bem como o “espaço” em que são definidos os atributos e métodos, que irão representar o comportamento, deverão estar dentro de chaves “{“ e “}”, outra exigência da linguagem Java.

Programar é traduzir uma solução de um problema para uma linguagem de programação. Logo, é imprescindível conhecer as regras da linguagem. O programador é como um intérprete ou tradutor de um idioma para outro.

Vamos a outro exemplo apresentado na Listagem 2 :

Cada atributo é definido com o par TIPO e NOME.

String significa tipo de texto.

Int significa tipo numérico inteiro.

Listagem 2 – Classe Pessoa em Java

Page 13: POO Metropole Digital

Veja que uma pessoa, assim como um carro, possui milhares de características, porém, utilizando o princípio da abstração, iremos deixar de fora tudo que não nos interessa, ou que não seja importante ou relevante para o sistema que estamos desenvolvendo. Ora, se formos programar um sistema para uma locadora de veículos, precisamos saber algumas informaçõessobre a pessoaque irá alugar o veículo, como o seu nome, habilitação de condutor, idade e oque mais acharmos relevante. Porém, é muito pouco provável que iremos exigir dados escolares das pessoas, como notas de uma disciplina etc. Para os carros, também há essa observação, pois um sistema de oficina mecânica deverá conhecer mais detalhes “internos” do veículo, como numeração do motor, período das revisões, marcas de componentes, como amortecedores, dentre outros.

Mas, como saber o que é relevante? Isso é determinado no estudo do problema que pretendemos resolver e comumente chamamos esse contexto do problema de domínio.

Atividade 2

Na aula anterior, fizemos um exercício que pedia para observar os objetos a sua volta, escolher um deles e descrever de 3 a 5 características (que agora chamamos de atributos). Faça o mesmo para dois outros objetos e identifique seus atributos. Em seguida, escreva o código das classes que representam tais objetos na linguagem Java, conforme mostrado nas Listagens 1 e 2.

Adicionando comportamento

Os objetos das classes que criamos, Carro e Pessoa, precisam não só de suas características, mas também de comportamentos que expressem as ações possíveis de serem executadas, pois um carro precisa oferecer funções para que as pessoas os manobrem. E pessoas, por sua vez, precisam desempenhar suas atividades, como andar, correr, estudar etc. Percebam que falamos da capacidade dinâmica do objeto através dos métodos que possuem.

Vamos dar ações aos nossos carros! Veja a Listagem 3 :

Page 14: POO Metropole Digital

Listagem 3 – Classe Carro com métodos

Observe que adicionamos novas linhas ao código, agora com dois métodos setCor(String cor) e getCor() .Esses métodos servem, respectivamente, para definir ou mudar o valor do atributo “cor” e retornarao valor desse atributo. Situação onde levaríamos o nosso carro a uma equipadora para modificar a sua cor. Atente para o fato de que os atributos são alterados por métodos da sua classe.

Atente para o fato de que adicionamos a palavra this antes do atributo cor. Essa palavra-chave serve para que o compilador possa entender que o atributo cor está recebendo a informação contida no parâmetro cor.

Outra maneira de implementar os métodos sem usar a palavra chave this é apresentado na Listagem 4 . Nesse caso, temos que mudar o nome do parâmetro para “c” evitando um erro de compilação.

Listagem 4 – Classe Carro com métodos sem a palavra chave this

Page 15: POO Metropole Digital

A regra Java para definirmos os métodos é:

Listagem 5 – Exemplos de métodos

Logo, senão construímos outros métodos que acessem e modifiquem os valores dos demais atributos – do tipo placa e numPortas– esses não poderão ser vistos fora do objeto nem alterados.

Com isso, o nosso código ficará um pouco mais longo, veja a Listagem 6:

Page 16: POO Metropole Digital

Listagem 6 – Classe Carro completa

Atividade 3

1. Dando continuidade a Atividade 2, vamos agora acrescentar os comportamentos dos objetos nas classes, escrevendo o código de seus métodos.

2. De acordo com os exemplos vistos, crie uma classe chamada Livro e especifique os seus atributos e métodos.

Page 17: POO Metropole Digital

Leituras complementares

CESTA, André Augusto. Tutorial: a linguagem de programação Java. Campinas: Instituto de Computação, 1996. Disponível em: <http://www.dcc.unicamp.br/~cmrubira/aacesta/java/javatut9.html>. Acesso em: 13 maio 2010.

Material online introdutório sobre Classes.

Resumo

Nesta aula,você viu um breve histórico da linguagem Java. Conheceu a ideia de concepção de uma classe, como também o conceito sobre classes. Você entendeu a criação de uma classe na linguagem Java. Viu também como representar as características e comportamentos, agora chamados, respectivamente, de atributos e métodos em código Java. Você aprendeu ainda que a classe organiza as características e comportamentos comuns dos objetos. E que essas características (atributos) podem sofrer alterações em suas informações através dos comportamentos (métodos).

Autoavaliação

1. O que é uma classe e para que serve?

2. Como se escreve uma classe em Java?

3. Como se representam as características em uma classe?

4. Quais tipos de atributos você conhece?

5. Qual a regra básica de criação de um método de uma classe?

Referencias

THE JAVA: tutorials. [Tutorial Oficial Java]. Disponível em: <http://java.sun.com/docs/books/tutorial/>. Acesso em: 13 maio 2010.

______. About the Java Technology. Disponível em: <http://java.sun.com/docs/books/tutorial/getStarted/intro/definition.html>. Acesso em: 13 maio 2010.

WIKIPÉDIA. Máquina virtual Java. Disponível em: <http://pt.wikipedia.org/wiki/Máquina_virtual_Java>. Acesso em: 13 maio 2010.

Page 18: POO Metropole Digital

Aula 3 – Um Programa em Java e a criação de Objetos

Apresentação

Nesta aula, você vai colocar seus conhecimentos em prática escrevendo um programa real na linguagem Java, passando por todos os passos necessários de edição, compilação e execução. Você vai visualizar a transformação do código fonte .java em código executável .class.

Iremos também aprender como acontece a criação de um objeto, figura central da Programação Orientada a Objetos.

Objetivos

Ao final desta aula, você será capaz de:

• aprender como criar um programa executável em Java; • aprender como criar um objeto em Java; • conhecer o conceito e a criação dos métodos Construtores.

O ponto de partida

Para que um programa Java execute ou “rode”, como costumamos dizer, é necessário que exista um método especial chamado main(...), o qual veremos em detalhe na sequência. Esse método é responsável pelo início da execução do Aplicativo ou Programa escrito em Java.

Aplicativos são programas que podem ser executados sozinhos. A classe que serve de ponto de partida para o aplicativo. Todo aplicativoem Java precisa ter um método main().

publicstaticvoidmain(String arguments[]){

//corpo do método

}

Se em um mesmo aplicativo houver mais de uma classe com o método main(),quando ummain de uma das classes for executado, os demais serão ignorados enquanto o programa é executado.

Veja só, falamos de aplicativo (ou programa)! Vamos escrevê-lo. Para isso, precisamos do arquivo Carro.java da aula anterior, veja a Listagem 1:

Page 19: POO Metropole Digital

Listagem 1 – Classe Carro

Precisamos criar outra classe que irá conter o método main() para podermos executar nosso programa, como mostra a Listagem 2:

Page 20: POO Metropole Digital

Listagem 2 – Classe Main

Vamos salvar esse arquivo como Main.java, agora temos dois arquivos Carro.java e Main.java. O método main está vazio, não faz nada, iremos editá-lo para que realize a seguinte sequência:

• criar um objeto Carro; • definir seus atributos; • exibir seus atributos.

Antes disso, vamos preparar o nosso ambiente de desenvolvimento:

Ambiente de desenvolvimento

1. Crie um diretório (pasta) chamado poo/aula3 e coloque os arquivos Carro.java e Main.java. Veja o acesso, via comandos, à pasta aula3 na Figura 1:

Page 21: POO Metropole Digital

Figura 1 –Prompt de comandos com as pastas poo\aula3

2. Compile os códigos com o comando javac. Esse comando executa um programa responsável por traduzir o código Java contido nos arquivos .java para arquivos executáveis .class, ou seja, o compilador java ou javacompiler.Veja isso na Figura 2.

Figura 2 – Compilando os arquivos java

3. Execute o método main() da classe Main. Veja a execução na Figura 3.

Page 22: POO Metropole Digital

Figura 3 – Execução da classe Main

Mas, nada aconteceu ...

Bem, nosso programa executou corretamente, o problema é que não definimos nada no código do método main(). Porém, não dizemos nada para ele fazer. Vamos editar o Main.java e testar sua execução repetindo os passos 2 e 3 anteriores.

O arquivo Main.java terá uma linha a mais, como mostra a Listagem 3:

Listagem 3 – Método main() com um comando de impressão de informação

Após a execução,obtemos o resultado apresentado na Figura 4:

Figura 4 –Execução do Main com impressão de informação

A nova linha escrita representa um comando responsável por exibir uma mensagem na tela do terminal. Como a linguagem Java é totalmente orientada a objetos, essa instrução é construída como uma chamada do método println() do objeto out da

Page 23: POO Metropole Digital

classe System. Mais na frente, veremos em detalhe essa instrução. No momento, basta sabermos que tal chamada imprime mensagens na tela do computador.

Atividade 1

Insira uma instrução que exiba o seu nome e idade na saída do programa.

Criando um Objeto

Vamos criar um objeto da classe Carro, no mundo da programação orientada a objetos chamamos isso de instanciação, ou seja, criaremos uma instância da classe Carro.

Um objeto ou instância é criado através do operador new. Vejamos a seguinte instrução na Figura 5:

Figura 5 – Esquema de criação de um Objeto

Toda a manipulação e consulta dos atributos do objeto serão feitas através de sua referência, ou seja, da variável que possui essa referência para os dados e métodos armazenados na memória.

Nesse instante, nosso carro foi criado, mas nenhum de seus atributos foram ainda definidos. Vamos utilizar o métodos da classe Carro para defini-lo como quisermos, para isso, vamos utilizar o conjunto de métodos setAtributo(valor). Veja a Listagem 5.

Page 24: POO Metropole Digital

Listagem 5 – Definição de atributos usando o método set

Agora, vamos exibir cada atributo com seu respectivo método getAtributo(). Como mostra aListagem 6 a seguir.

Listagem 6 – Exibição dos valores dos atributos

Logo, a nossa classe Main ficará como mostra a Listagem 7:

Listagem 7 - Método main completo

Page 25: POO Metropole Digital

Repita os passos 2 e 3, anteriores, e você verá a saída do programa apresentada na Figura 6:

Figura 6 – Execução do método main

Atividade 2

1. Crie no exemplo apresentado outra variável Carro chamada outroCarro.

2. Defina valores distintos aos seus atributos através de seus respectivos métodos set e os exiba como foi feito com a variável meuCarro.

Métodos construtores

Você pode estar se perguntando: E se eu quiser, no momento da criação do objeto, passar valores para alguns de seus atributos, como placa e cor, por exemplo? É possível? É sim!! Para isso, precisamos definir um tipo especial de método chamado construtor. E como seu próprio nome diz, ele constrói e objeto e nesse instante pode definir quaisquer atributos que desejarmos. O método construtor é aquele chamado em um objeto, quando ele é criado, ou seja, quando ele é construído.Mas, se a classe não tiver método construtor?O objeto ainda pode ser criado usando a instrução (ou operador) new. Mas nesse caso será provavelmente necessário chamar métodos set, como fizemos anteriormente. Definindo os construtores, pode-se estabelecer valores iniciais para os atributos do objeto e chamar métodos de outros objetos. As diferenças do construtor para outros métodos é que o construtor sempre tem o mesmo nome da classe e nãopossui tipo de retorno.

Considere a seguinte definição de um método construtor na classe Carro adicionando o método construtor mostrado na Listagem 8:

Page 26: POO Metropole Digital

Listagem 8 – Construtor para classe carro

Observe que esse método possui o mesmo nome da Classe Carro e não possui tipo de retorno, pois seu retorno, como já mencionamos, é justamente a referência para o objeto na memória,lembra-se disso?

Atenção, se fizermos apenas essa alteração, iremos nos deparar com um erro de compilação na classe Main. Você sabe por quê?

Toda classe possui um construtor implícito e padrão, sem argumentos, por isso, utilizamos o operador new mais o nome classe Carro e os ( ):

Carro meuCarro = new Carro();

Observe que quando utilizamos o operador new não existem argumentos (ou parâmetros)dentro dos parênteses. Isso significa que podemos estar usando o construtor padrão (ou em inglês:default).

Quando em uma classe define-se outro construtor, não podemos mais usar o construtor padrão, a não ser que se defina explicitamente um construtor sem parâmetros, como mostra o construtor 1 na Listagem 9. Com isso, a classe Carro ficará com dois construtores.

Listagem 9 – Dois construtores para uma mesma classe

Observe que no primeiro construtor nada foi feito, enquanto no segundo os atributos placa e numPortas foram inicializados (receberam valores). Isso significa que existem duas maneiras de se construir um objeto derivado da classe Carro, ou do tipo Carro, com ou sem inicialização dos valores dos atributos.

Com isso, fechamos a base para se criar um objeto a partir de uma classe e ainda executar um programa que utilize esse objeto.

O que são construtores?

• Construtores são métodos especiais para a criação e inicialização

Page 27: POO Metropole Digital

de novas instâncias de classe(objetos). • Inicializam o novo objeto e seus atributos. • Criam todos os outros objetos de que esse objeto necessita. • Realiza todas as outras operações que ele precisa para ser

inicializado.

O que faz o operador new?

• Ele inicializa o novo objeto e seus atributos, criam todos os outros objetos de que esse objeto necessita e realizam todas as outras operações de que ele precisa para ser inicializado.

Leituras complementares

WIKIPÉDIA. Java: linguagem de programação. Disponível em: <http://pt.wikipedia.org/wiki/Java_%28linguagem_de_programa%C3%A7%C3%A3o%29>. Acesso em: 13 maio 2010.

A Wikipédia em português apresenta uma introdução a Java, discutindo inclusive o método main.

WIKIPÉDIA. Main function: programming. Disponível em: <http://en.wikipedia.org/wiki/Main_function_%28programming%29>. Acesso em: 13 maio 2010.

Se você quiser ver como o método main é definido em várias linguagens de programação existentes, acesse o link acima.

Resumo

Com esta aula,você já é capaz de se aventurar na programação orientada a objetos em Java, pois você já sabe como escrever um código simples e transformá-lo em um código executável. Podemos alterar e acrescentar novas classes aos nossos programas e aos poucos transformá-los em um grande sistema. Você viu também a estrutura de criação de um objeto em Java, bem como a definição dos valores para os atributos dos objetos. Por fim,você estudou o conceito e a prática sobre os métodos construtores e sua utilidade para a criação dos objetos. Nossa caminhada está apenas começando, mas já demos excelentes passos!

Autoavaliação

1. Edite o arquivo Carro.java adicionando mais atributos à classe, como marca, modelo, ano de fabricação, tipo de combustível (álcool, gasolina ou flex).

2. Edite o arquivo Main.java para definir e exibir os novos atributos.

Page 28: POO Metropole Digital

3. Crie um segundo carro na classe Main utilizando o construtor com parâmetros.

Referencias

BARNES, David J.; KÖLLING, Michael.Programação orientada a objetos com Java. São Paulo: Pearson Prentice Hall, 2004.

DEITEL,H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

LEMAY, Laura.Aprenda Java em 21 dias. Tradução:Daniel Vieira. Rio de Janeiro: Campos, 2003.

Aula 4 – Sistemas OO

Apresentação

Agora, você será apresentado ao verdadeiro mundo da Orientação a Objetos. Você terá a oportunidade de estudar de que maneira construímos sistemas de grande porte utilizando princípios básicos desse paradigma e mecanismos da linguagem Java.

Objetivos

• entender o que é realmente um Sistema OO; • compreender o mecanismo de troca de mensagem entre os

objetos.

Sistema = mundo OO

Quando falamos em sistema, estamos falando em um programa complexo que implementa a solução de um problema complexo. Até agora, vimos pequenos programas, específicos e simplificados, pois trata-se de uma situação didática. Mas, iremos adicionando complexidade pouco a pouco e logo você será capaz de desenvolver suas próprias soluções.

O mundo em que vivemos está repleto de objetos (ou coisas) que nos cercam e fazem a nossa vida ser como é, pois sem eles não conseguimos sequer imaginar

Page 29: POO Metropole Digital

como seria. Tais objetos definem nosso mundo por possuírem características próprias e se relacionarem entre si. Nele, vimos carros trafegando pelas ruas, com edifícios que possuem escadas e elevadores; utilizamos nossos objetos pessoais, como relógios, óculos e bolsas. Todos têm uma finalidade, atribuímos nomes a eles e os ligamos a pessoas e a outros objetos. É o nosso mundo! E esse mundo está sujeito a leis naturais e humanas. Essa analogia é importante para entendermos que um sistema computacional é abstrato, mas segue um princípio de construção semelhante ao mundo que nos cerca.

Um sistema é um verdadeiro mundo orientado a objetos, se a linguagem assim o definir, como é o caso da linguagem Java. Pois, nela, todo programa por mais simples que seja, até um complexo sistema de controle de tráfego aéreo, por exemplo, são feitos por um conjunto de muitos objetos de várias classes diferentes.

Atividade 1

Verifique agora a sua volta a quantidade de objetos que o cerca, identifique um conjunto de 5 a 10 deles e descreva as seguintes características: nome e para que servem.

Por exemplo, aqui eu tenho um computador na minha frente, então ai vai: Nome: Computador

Serve para: Trabalhar (inclui preparar esta aula), comunicar-me com meus amigos e diversão.

Como foi visto na atividade anterior, praticamente todos os objetos estão relacionados a outros, pois nenhum faz tudo sozinho, nem mesmo meu computador de última geração, pois sem a tomada na parede ele não é nada. Os objetos precisam se “comunicar”, ou seja, um objeto aciona um método de outro, e este, por sua vez, de um outro, e assim por diante. Essa comunicação é realizada através do mecanismo de troca de mensagem.

Vejamos a seguinte situação.

Estou digitando esta aula e sei que está prestes a faltar energia na área do meu escritório, mas preciso revisá-la, então, decido imprimi-la, para poder ler o documento da aula enquanto estiver faltando energia. O meu objeto Computador não é capaz de sozinho fazer essa tarefa, ele precisa interagir com a impressora. Como mostrado na Figura 1, o computador envia os dados (conteúdo desta aula) em forma de mensagem para a impressora, que realiza a sua tarefa de imprimir o conteúdo do documento em papel para ser lido à luz natural ou de velas.

Page 30: POO Metropole Digital

Figura 1 –Objetos do mundo real trocando mensagens

Agora, vejamos outro exemplo, este no mundo OO – Java, relembrando nosso programa:

Listagem 1 –Exemplo de troca de mensagem com um objeto da classe Carro

Esse código escrito dentro da classe Main envia uma mensagem para definir um atributo e outra para recuperar a placa do carro. Em Java, a troca de mensagem representa: (i) a mudança ou leitura do estado interno do objeto através da alteração de um de seus atributos; ou (ii) a chamada a um dos métodos do objeto que representam seu comportamento e as tarefas que são capazes de desempenhar.

Durante a execução de um sistema, que se inicia sempre pelo método main() (não se esqueça!), há várias, milhares de trocas de mensagem entre objetos! Logo, precisamos projetar bem os sistemas e gerenciar a complexidade para que não se transforme em uma tarefa árdua diária.

Atividade 2

1. Envie mensagens para o objeto meuCarro definindo seus outros atributos (modificando seu estado interno), e outras mensagens recuperando esses novos valores (acionando o comportamento de informar ao mundo exterior seu estado interior).

Nos sistemas orientados a objetos, quando objetos de classes distintas possuem uma troca de mensagens muito frequente, por possuírem uma autodependência forte, ou cooperarem entre si por objetivos mútuos, é comum estabelecermos um relacionamento entre essas classes.

O nosso exemplo do mundo real expresso através do computador e da

Page 31: POO Metropole Digital

impressora possui um relacionamento entre ambos, pois quando solicitada a impressão de um documento meu computador já possui um cadastro das impressoras de que disponho, caso contrário, terei que instalar uma nova. Logo, a classe Computador possui um relacionamento com a classe Impressora, se assim formos traduzir para o mundo OO. Esses relacionamentos costumam ser definidos através de suas cardinalidades.

Mas, o que é isso?

Bem, quando relacionamos coisas no mundo real fazemos isso de forma natural e espontânea, teremos que ser mais observadores daqui pra frente. Vejamos, quantas pessoas cabem em um automóvel? Na maioria deles, a lotação é de no máximo 5 pessoas, incluindo seu condutor.Mas uma pessoa pode estar em quantos automóveis ao mesmo tempo? Até onde as leis da física permitem, só em um, de cada vez!

Chamamos esse relacionamento de um-para-muitos, um (automóvel) para muitos (pessoas). Em outras situações, vemos que um marido é para uma, e somente uma, esposa, e a recíproca é verdadeira, temos então um relacionamento um-para-um. A outra combinação possível seria muitos-para-muitos, o que verificamos no nosso exemplo computador e impressora, pois do meu computador posso imprimir em várias impressoras e cada uma dessas podem receber documentos dos outros computadores do escritório.

Atividade 3

Complemente a atividade anterior adicionando relacionamentos aos objetos listados por você. Tome como exemplo: Computador

Relacionado com: é pessoal, é meu. E está conectado a um mouse e a rede elétrica do meu escritório.

Continuando nosso programa...

Vamos ligar a classe Carro à classe Pessoa, fazendo com que uma pessoa possua um carro e esse carro só possa pertencer a uma única pessoa. É o que chamados de relação um-para-um.

Camila possui um carro vermelho Figura 2 –Exemplo de relacionamento entre objetos

Page 32: POO Metropole Digital

A classe Carro precisa “saber que pertence” a alguém. Iremos adicionar um atributo chamado dono, que é do tipo Pessoa. Exibindo a lista de atributos de Carro após a mudança:

Listagem 2 –Codificação do relacionamento entre as classes Carro e Pessoa

E os respectivos métodos get e set:

Listagem 3 –Métodos que relacionam Carro a Pessoa

Vamos utilizar esse relacionamento no exemplo seguinte:

Page 33: POO Metropole Digital

Listagem 4 –Programa exemplo do relacionamento Carro e Pessoa

Observe a linha:

Listagem 5 –Comando com exemplo de troca de mensagem

Neste ponto, a classe Main envia uma mensagem para o objeto carro, recuperando o seu dono, um objeto da classe Pessoa, e esse recebe uma mensagem para que retorne o seu nome.

A troca de mensagens é comumente denominada de chamada de método

Até agora,você estudou a troca de mensagens entre objetos para definir ou recuperar algum atributo, unicamente. Os sistemas OO precisam de métodos mais complexos, que verifiquem a validade dos dados, realizem atualizações em outras entidades, pesquisem em banco de dados, escrevam em arquivos de log, atualizem objetos da interface etc.

Vamos colocar um pouco da complexidade do mundo real no nosso

Page 34: POO Metropole Digital

programa?!Vamos lá!

Faremos as seguintes alterações:

1- Adicionar os métodos ligar(), desligar(), acelerar(), frear() à classe Carro.

Listagem 6 –Novos métodos para a classe Carro

2 - Vamos adicionar à classe Carro, ainda, um atributo câmbio que indicará qual a “marcha” que o carro está em um dado momento, para tanto, tal atributo irá guardar um valor inteiro de 0 (zero) a 5 (cinco).

0 – neutro (ponto morto)

1 a 5 – marchas

Page 35: POO Metropole Digital

Listagem 7 – Novo atributo e métodos da classe Carro

3 - Precisamos colocar uma referência do automóvel dentro da classe Pessoa.

Listagem 8 –Métodos que implementam o relacionamento entre Carro e Pessoa

4 - Vamos adicionar outros métodos à classe Pessoa para interagir (trocar mensagens) com seu carro.

Page 36: POO Metropole Digital

Listagem 9 –Classe Pessoa recebe métodos para interagir com a classe Carro

5 - Vamos ao Main! Nosso programa precisa:

1. criar uma Pessoa; 2. criar um Carro, e atribuí-lo a essa Pessoa; 3. fazer com que a pessoa ligue o carro, troque de marcha, acelere,

reduza a velocidade, troque de marcha e desligue o carro.

Page 37: POO Metropole Digital

Listagem 10 –Programa exemplo para testar o relacionamento entre Carro e Pessoa

O que podemos ver é que o método Main envia uma mensagem para o objeto pessoa, que, por sua vez, manda ou repassa essa mensagem para seu objeto da classe Carro, que executa a ação final desejada, que consiste em guiá-lo. Veja a ilustração a seguir:

Page 38: POO Metropole Digital

Figura 3 – Envio de mensagens entre objetos

Leitura Complementar

No site <http://www.leandro.wives.nom.br/java/oojava.htm>, você encontrará informações sobre o que vimos nesta aula e um breve resumo do que ainda veremos. Aconselho que leia apenas o que se sentir confortável e possa assimilar no momento, pois veremos mais técnicas de programação orientada a objetos na sequência das aulas.

Resumo

Nesta aula, você ampliou os horizontes. É importante que neste ponto você revise o que foi visto até agora, pois os elementos fundamentais da orientação a objetos e os mecanismos básicos da linguagem Java foram apresentados e combinados para gerar uma aplicação simples, mas bastante significativa. Os sistemas são arranjos complexos de objetos que se relacionam trocando mensagens entre si e cooperando para atingir objetivos planejados pelo seu programador. É necessário um bom planejamento para manter a complexidade do sistema sob controle.

Autoavaliação

1 – O que é a troca de mensagens entre objetos?

2 – Como os sistemas OO implementam sua solução?

3 – Dos exemplos apresentados, identifique os trechos onde há troca de mensagens envolvendo objetos das classes Carro e Pessoa.

Page 39: POO Metropole Digital

Referências

DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

Aula 5 – Encapsulamento

Apresentação

Nesta aula, vamos aprender sobre encapsulamento, você sabe o que é isso? Cápsula nos lembra qualquer forma pequena que protege algo em seu interior, como um medicamento, fruto seco ou mesmo um compartimento para astronautas cheio de instrumentos para uma missão espacial. Você verá na aula de hoje uma importante característica da Programação Orientada a Objetos, o encapsulamento, que nos ajuda a desenvolver programas com maior qualidade e flexibilidade para mudanças futuras.

Objetivos

Ao final desta aula, você será capaz de:

• conhecer os conceitos ligados a encapsulamento; • entender, através de um contra-exemplo (exemplo errado),

a importância do encapsulamento; • entender com a “correção” do exemplo como se aplica essa

característica de encapsulamento, tão importante para a programação OO.

Encapsulamento

Encapsulamento é a característica da OO capaz de ocultar partes (dados e detalhes) de implementação interna de classes do mundo exterior.

Graças ao encapsulamento, podemos ver as classes apenas pelos serviços (métodos) que elas devem oferecer para quem as utiliza. Não visualizamos, nesse caso, de que forma (como) o serviço (método) está implementado internamente na classe. No fundo, o encapsulamento da classe acaba definindo um contrato que determina o que o mundo exterior pode fazer com objetos daquela classe.

Na Figura 1, podemos ver que um objeto que possui a característica de encapsulamento fica protegido por uma cápsula. Essa cápsula, que chamamos de interface, serve para ocultar e proteger de outros objetos, os detalhes de

Page 40: POO Metropole Digital

implementação daquele objeto. Dessa maneira, o objeto só disponibiliza, através da interface, os serviços ou funcionalidades que ele deseja receber mensagens (1) (solicitações) de outros objetos.

(1) Veja mais sobre Troca de Mensagens na aula 4.

Figura 1 – Um objeto com encapsulamento

Para facilitar nosso entendimento, vamos a um exemplo. Considere um objeto Automóvel que disponibiliza para um objetoPessoa (na OO tudo é objeto!) a direção como parte da sua interface, para que se possa guiar o Automóvel para a esquerda ou para a direita. Através da direção, a Pessoa solicita ao Automóvel esses serviços, sem saber COMO serão feitos ou estão implementados.

Apenas o Automóvel sabe que mecanismos serão acionados para atender a solicitação da Pessoa. A Pessoa apenas usufrui do resultado da solicitação. Observe a Figura 2.

Figura 2 – Pessoa usando a direção como interface para acessar os serviços de Automóvel

Podemos dizer, nesse caso, que estamos aplicando a característica de encapsulamento ao objeto Automóvel, pois ocultamos do objeto Pessoa os detalhes da implementação dos serviços oferecidos pelo Automóvel.

Você deve estar se perguntando: como isso acontece na prática?

Antes de mostrarmos a implementação na linguagem Java do uso do encapsulamento, precisamos conhecer os chamadosModificadores de Acesso da linguagem.

Antes, uma explicação...

Page 41: POO Metropole Digital

Quando falarmos em ACESSO, é necessário interpretarmos: o acesso deve-se dar a quem e por quem? Para respondermos, devemos interpretar que o acesso será ao objeto que possui encapsulamento (ou está encapsulado), e será feito pelos outros objetos do sistema ou mesmo por você (programador), que decidirá usar determinados objetos durante a construção de seus programas.

Outra pergunta seria: acesso a que? Para responder, devemos interpretar como o acesso aos atributos e métodos do objeto encapsulado.

Então, ACESSO nos traz a interpretação de acessar os atributos e métodos do objeto que possui encapsulamento pelos outros objetos do sistema ou pelos programadores.

Modificadores de acesso

Os Modificadores de Acesso são palavras chave ou reservadas da linguagem Java cuja utilidade é permitir ou proibir o acesso aos atributos e/ou métodos das classes. Veja-os a seguir.

public: garante que o atributo ou método da classe seja acessado ou executado a partir de qualquer outra classe.

private: pode ser acessado, modificado ou executado apenas por métodos da mesma classe, sendo totalmente oculto ao programador (ou outros objetos do sistema) que for usar instâncias dessa classe.

protected : funciona como o private exceto que as classes filhas ou derivadas também terão acesso ao atributo ou método. Veremos mais sobre classes filhas na aula 10.

Package ou Friendly: não são palavras reservadas de modificadores de acesso. Os atributos e métodos são chamados de Package ou Friendly, quando não possuem modificadores, ou seja, são os atributos e métodos declarados sem modificadores. Isso significa que podem ser acessados por todas as classes pertencentes a um mesmo pacote (pacotes são pastas onde estão inseridos os arquivos das classes, para ajudar a organizá-las. Falaremos sobre pacotes em aulas futuras).

Atividade 1

Relembrando os exemplos apresentados até agora, escolha 3 classes apresentadas e decida quais atributos e métodos seriam mais convenientes para serem declarados como privados, e quais poderiam ser públicos.

Page 42: POO Metropole Digital

Agora que vocêjá conhece os conceitos sobre encapsulamento, vamos ver como isso acontece na prática.

Um exemplo completo

Iremos mostrar um exemplo que demonstre a importância de se usar o encapsulamento na Programação Orientada a Objetos.

Vamos supor que temos uma classe Agenda que guarda apenas uma data e uma anotação importante a ser lembrada, conforme mostra a listagem 1 a seguir.

Listagem 1 –Classe agenda

Agora, vamos querer que essa classe anote a informação. Assim, nossa classifica:

Listagem 2 – Adicionando comportamento

É importante também verificar se a data da anotação é uma data válida. Se for uma data válida registra-se a anotação, caso contrário a anotação recebe uma informação de data inválida. Assim, nossa classe fica:

Page 43: POO Metropole Digital

Listagem 3 – Validação das datas

Você até agora pode está se perguntando onde está o encapsulamento e aquela conversa toda do início da aula, não é mesmo? Calma! O objetivo desse exemplo é mostrar a fragilidade do código que não usa o encapsulamento. Por isso, iremos agora testar nossa classe Agenda com uma aplicação.

Para isso, vamos criar dois objetos com a classe Agenda: agenda1 e agenda2. Em seguida, daremos a agenda1 – uma anotação com uma data válida, e a agenda2 – uma data inválida. Finalmente, consultaremos os dados dos atributos de cada objeto, em especial a anotação que foi registrada, utilizando o método mostraAnotacao().

Page 44: POO Metropole Digital

Listagem 4 - Testando a agenda

Para a agenda1, anotamos que dia 12 do mês 10 (Outubro) é o Dia da Criança, já para a agenda2 anotamos que dia 7 do mês 15 (mês Inexistente) é o dia da Independência do Brasil.

Com a sua atual experiência de programador, observando a classe Agenda e os dados inseridos pela classe Principal, o que você acha que será impresso após termos rodado a aplicação? Vejamos então o resultado.

Figura 3 - Saída impressa no terminal

Perfeito!!! Não utilizamos o encapsulamento na classe Agenda e tudo funcionou perfeitamente! Sem nenhuma via de acesso desprotegida, correto? Errado! Vamos identificar a falha da nossa codificação.

Veja o que acontece se fizéssemos uma pequena modificação no método main(), observe a listagem 6 a seguir.

Listagem 6 - Modificando o método main

Page 45: POO Metropole Digital

O resultado dessa aplicação seria...

Veja que sua Agenda permitiu que você inserisse uma data inválida para uma anotação. Isso significa que seu código está susceptível a falhas. Em um programa simples como esse, isso não irá trazer nenhuma dor de cabeça. Agora, imagine em um programa real que é usado diariamente pelas pessoas.

Qual é a solução?

Respondendo... A solução é aplicar o encapsulamento.

Aplicando o encapsulamento ao exemplo

Codificar em OO usando o encapsulamento nada mais é que aplicar os modificadores de acesso às classes.

Vamos ver como está a nossa classe Agenda com relação aos modificadores.

Listagem 7 - Exemplo sem modificadores de acesso explícito

Page 46: POO Metropole Digital

A classe Agenda não usa nenhum dos modificadores de acesso de forma explícita. Pela nossa classificação, implicitamente ele está usando o modificador de acesso Package ou Friendly. Vimos, anteriormente, que o modificador de acesso Package permite que classes do mesmo pacote acessem atributos ou métodos que estejam com tal modificador. Considerando que a nossa classe Principal está no mesmo pacote (veja sobre pacotes na classificação de Package), então, ele tem acesso aos atributos e métodos da classe Agenda.

Você pode está perguntando... Quando a classe Principal teve acesso aos atributos da classe Agenda?

Respondendo: veja o trecho de código da classe Principal a seguir.

Listagem 8 - Acesso direto aos métodos e atributos da classe

O método main() da classe Principal está acessando os atributos dia, mes e anotacao da classe Agenda. E modificando as informações sem passar pelo teste da validação da data. Essa falha na codificação não é aceitável.

Vamos então aplicar o encapsulamento tornando privados os atributos e o método validaData()da classe Agenda com o uso do modificador de acesso private, e permitir os acessos para os métodos anote() e mostraAnotacao(). Temos:

Page 47: POO Metropole Digital

Listagem 9 - Adicionando explicitamente os modificadores de acesso

Agora, o compilador já não aceita usar os comandos abaixo. Isso causaria erro! Ou seja, os atributos da classe Agenda agora são privados apenas para a uso da própria classe Agenda, como mostra a listagem 10.

Listagem 10 - Encapsulamento em ação

Com essa modificação, só é possível inserir uma anotação na classe Agenda usando o método anote(). O método anote() garante que a data inserida para a anotação será validada com o método validaData(), que também é privado ao uso apenas da classe Agenda.

Page 48: POO Metropole Digital

Atividade 2

1. Continuando a atividade anterior, separe as classes -Pessoa e Carro - e adicione os modificadores de acesso de seus atributos e métodos, verifique e corrija os programas para que não tentem executar uma operação não permitida pelo encapsulamento.

Uma verdade que não pode ser omitida para os programadores: você pode optar em não usar a característica de encapsulamento em seus códigos. Mas, isso seria uma péssima prática e um sinal que você não é um programador que segue as boas práticas. Se você havia pensado nisso, reveja os conceitos e tente entender a importância do encapsulamento para seus códigos

Leitura Complementar

Na Wikipédia em português, há um página exclusiva para encapsulamento, <http://pt.wikipedia.org/wiki/Encapsulamento>, é uma leitura rápida e com exemplos em Java.

Resumo

Nesta aula, você viu os conceitos que envolvem o encapsulamento e sua importância para a programação OO. Os conceitos foram inicialmente ilustrados através de um exemplo que não aplicava o encapsulamento, mas, como consequência, trazia falhas ou erros ao desenvolvimento. Em seguida, aplicamos o encapsulamento ao exemplo e pudemos perceber que ele protegeu a classe Agenda, não permitindo modificações diretas e indevidas em seus atributos. Nesta aula, você não estudou a aplicação do modificador de acesso protected porque ele envolve o conceito de herança entre classe,o qual será abordado posteriormente. Esse então fica para uma das próximas aulas!

Autoavaliação

1 - Sem consultar o material responda: O que você entende por encapsulamento? Para que serve? E como aplicar?

2 - Antes de rever os conceitos, para que servem os modificadores de acesso:

• public • private

Page 49: POO Metropole Digital

• package

3 - Pense e reflita o que faria você decidir se um método deve ser usado como privado?

4 - Crie classes chamadas Usuario e Hacker. Hacker possui o método main(). A classe Usuario possui os atributoslogin e senha. Inicialmente, não use encapsulamento e faça com que no método main() de Hacker seja possível modificar as informações (login,senha), inicialmente definidas, de um objeto da classe Usuário que você mesmo criar. Em seguida, aplique encapsulamento e verifique que Hacker terá suas tentativas frustradas.

Referências

DEITEL, H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

Aula 6 – Tipos Primitivos em Java

Apresentação

Nesta aula, você vai aprender um pouco sobre os tipos primitivos oferecidos pela linguagem Java. Esses tipos são fundamentais para a construção de programas e sistemas de médio e grande porte na linguagem. Além de conhecer os diferentes tipos oferecidos pela linguagem, apresentamos diversos exemplos de como usá-los e manipulá-los. Finalmente, a aula será finalizada com uma apresentação mais detalhada da classe String.

Objetivos

Ao final desta aula, você será capaz de:

• saber quais são os tipos primitivos e respectivas características existentes na linguagem Java;

• aprender como manipular alguns tipos numéricos; • saber sobre a classe String; • saber onde podemos declarar as variáveis que representam

tipos primitivos ou referências para objetos dentro de uma classe Java.

Tipos Primitivos em Java

A linguagem Java oferece um total de 8 tipos primitivos para criação de nossos programas. Tais tipos são usados para declararmos as variáveis que auxiliam na

Page 50: POO Metropole Digital

construção dos algoritmos e classes dos programas que descrevemos. A Tabela 1 apresenta um resumo dos tipos primitivos oferecidos pela linguagem.

Tabela 1 – Tipos primitivos de Java

Apesar da linguagem Java oferecer tantos tipos, muitos deles são capazes de representar os mesmos tipos de dados, mas com uma capacidade de armazenamento maior (em uma maior quantidade de bits na memória do computador). Variáveis do tipo byte, short, int e long, por exemplo, podem ser usadas para representar números inteiros, variando em diferentes faixas de valores (ver detalhes na Tabela), muito embora os tiposint e long sejam os mais usados. O mesmo acontece com variáveis do tipo float e double, que são usadas para representar números reais.

O tipo boolean é usado para declarar variáveis que podem assumir um dos seguintes valores:true (verdadeiro) oufalse(falso). Variáveis booleanas são bastante usadas para tomadas de decisões em comandos condicionais (if) ou de repetição (for, while).

Finalmente, o tipo char é usado para representar caracteres, como, por exemplo, as letras de alfabetos de línguas de diferentes países. Apesar de em alguns programas ser necessário o uso do tipo char para representar e permitir o processamento de caracteres de uma frase ou texto, por exemplo, o mais comum é usar a classe String. Tal classe é usada para armazenar um conjunto de caracteres, sendo seu uso bem mais fácil e simples do que usar variáveis do tipo char. No final desta aula, aprenderemos um pouco mais sobre o funcionamento e uso da classe String.

Page 51: POO Metropole Digital

Usando os tipos primitivos de Java

Para usar os tipos primitivos de Java, basta declarar variáveis do tipo específico que você deseja usar. É possível também já inicializar as variáveis no momento da sua declaração. Vejamos alguns exemplos na Listagem 1.

1. int idade = 18; 2. long tamanho; 3. float salarioFuncionario; 4. double poupanca = 100.0; 5. boolean casado; 6. boolean ferias = false; 7. char caracter1 = ‘A’;

Listagem 1 – Declaração e inicialização de variáveis em Java

Na listagem, podemos observar a declaração de 7 variáveis de tipos distintos. Inicialmente, foram declaradas duas variáveis de valores inteiro (linhas 01-02). A primeira é a variável idade do tipo int que foi inicializada com o valor 18. A segunda é a variável tamanho do tipo long que não foi inicializada. Cada variável não inicializada em Java recebe um valor de inicialização (default) dependendo do tipo escolhido. A Tabela 2 apresenta valores default escolhidos. No caso da variável tamanho, como ela do tipo int, ela é inicializada com o valor default inicial zero (0).

Logo a seguir (linhas 03-04), foram declaradas duas variáveis de valores reais: a variável salario Funcionario do tipo float, que é inicializada com o valor default zero (0,0), e a variável poupanca do tipo Double,que foi inicializada com o valor 100.0. As variáveis booleanas casado eferias (linhas 05-06) podem assumir dois valores, true e false. No caso, a variável casado é iniciada com o valor default false, já a variável ferias foi inicializada explicitamente com o valor false. Finalmente, é declarada a variável caracter 1 que é inicializada com o valor ‘A’.

Tabela 2 – Valores default de tipos primitivos de Java

Page 52: POO Metropole Digital

Atividade 1

1. Crie, compile e execute uma classe Java, de nomeTesteTiposPrimitivos,com um método main(), que declara as variáveis que foram apresentadas na Listagem 1.

2. Em seguida, experimente imprimir o valor de tais variáveis usando o método System.out.println().

3. Observe durante a execução do programa que variáveis não inicializadas têm um valor inicial padrão conforme apresentado na Tabela 2.

Regras e convenções para declarações de variáveis

Na linguagem Java, existe um conjunto de regras que devem ser seguidas para nomear as variáveis. O primeiro símbolo de declaração de uma variável pode ser uma letra (minúscula – a até z – ou maiúscula – A até Z), ou um dos seguintes caracteres “_” (underscore) ou “$” (cifrão). Na maioria dos programas, entretanto, é comum declarar as variáveis com o primeiro símbolo sendo uma letra minúscula, conforme foi ilustrado na declaração das variáveis da Listagem 1.

Os demais símbolos de declaração de uma variável podem ser, além de qualquer letra (maiúscula ou minúscula) e dos caracteres “_” e “$”, também algum número. Observe, por exemplo, na Listagem 1, a declaração das variáveis caracter1esalarioFuncionario.

Seguindo as regras acima, o compilador da linguagem Java reclama sempre que declaramos uma variável começando com números, ou qualquer outro símbolo que não sejam “_” e “$”. Assim, caso a gente declare as seguintes variáveis, o compilador acusará erro:(i) “1minhaVariavel” – o nome dessa variável está incorreto, porque inicia com um número; e (ii) “#nome” – variável declarada incorretamente também porque se inicia com um “#”.

Além das regras acima, é importante lembrar que existe um conjunto de palavras reservadas (do inglês: keywords) na linguagem Java, como, por exemplo: main, new, while, if, for, int, long, float, double. Tais palavras são reservadas na linguagem para um determinado propósito, e dessa forma o compilador Java não permite que o desenvolvedor declare alguma variável de forma idêntica a alguma das palavras chaves. Veja a listagem de todas as palavras reservadas no quadro 1 a seguir.

Palavras Reservadas da Linguagem Java

Page 53: POO Metropole Digital

Modificadores de acesso

Private: acesso apenas dentro da classe. zrotected: acesso por classes no mesmo pacote e subclasses. Public: acesso de qualquer classe. Modificadores de classes, variáveis ou métodos Abstract: classe que não pode ser instanciada ou método que precisa ser implementado por uma subclasse não abstrata. Class: especifica uma classe. Extends: indica a superclasse que a subclasse está estendendo. Final: impossibilita que uma classe seja estendida, que um método seja sobrescrito ou que uma variável seja reinicializada. Implements: indica as interfaces que uma classe irá implementar. interface: especifica uma interface. Native: indica que um método está escrito em uma linguagem dependente de plataforma, como o C. New: instancia um novo objeto, chamando seu construtor. Static: faz um método ou variável pertencer à classe ao invés de às instâncias.

Strictfp: usado em frente a um método ou classe para indicar que os números de ponto flutuante seguirão as regras de ponto flutuante em todas as expressões. Synchronized: indica que um método só pode ser acessado por uma thread de cada vez. Transient: impede a serialização de campos. Volatile: indica que uma variável pode ser alterada durante o uso de threads.

Controle de fluxo dentro de um bloco de código Break: sai do bloco de código em que ele está. Case: executa um bloco de código dependendo do teste do switch. Continue: pula a execução do código que viria após essa linha e vai para a próxima passagem do loop. Default: executa esse bloco de código caso nenhum dos teste de switch-case seja verdadeiro. Do: executa um bloco de código uma vez, e então realiza um teste em conjunto com o while para determinar se o bloco deverá ser executado novamente. Else: executa um bloco de código alternativo caso o teste if seja falso. For: usado para realizar um loop condicional de um bloco de código. If: usado para realizar um teste lógico de verdadeiro o falso. Instanceof: determina se um objeto é uma instância de determinada classe, superclasse ou interface. Return: retorna de um método sem executar qualquer código que venha depois desta linha (também pode retornar uma variável). Switch: indica a variável a ser comparada nas expressões case. While: executa um bloco de código repetidamente até que uma certa condição seja verdadeira.

Tratamento de erros Assert: testa uma expressão condicional para verificar uma suposição do programador. Catch: declara o bloco de código usado para tratar uma exceção.

Page 54: POO Metropole Digital

Finally: bloco de código, após um try-catch, que é executado independentemente do fluxo de programa seguido ao lidar com uma exceção. Throw: usado para passar uma exceção para o método que o chamou. Throws: indica que um método pode passar uma exceção para o método que o chamou. Try: bloco de código que tentará ser executado, mas que pode causar uma exceção.

Controle de pacotes Import: importa pacotes ou classes para dentro do código. Package: especifica a que pacote todas as classes de um arquivo pertencem.

Primitivos Boolean: um valor indicando verdadeiro ou falso. Byte: um inteiro de 8 bits (signed). Char: um caracterunicode (16-bit unsigned). Double: um número de ponto flutuante de 64 bits (signed). Float: um número de ponto flutuante de 32 bits (signed). Int: um inteiro de 32 bits (signed). Long: um inteiro de 64 bits (signed). Short: um inteiro de 32 bits (signed).

Variáveis de referência Super: refere-se à superclasse imediata. This: refere-se à instância atual do objeto.

Retorno de um método Void: indica que o método não tem retorno.

Palavras reservadas não utilizadas Const: Não utilize para declarar constantes; use publicstatic final. Goto: não implementada na linguagem Java por ser considerada prejudicial .

Literais reservados

De acordo com a Java LanguageSpecification, null, true e false são tecnicamente chamados de valores literais, e não palavras reservadas. Se você tentar criar algum identificador com esses valores, você também terá um erro de compilação.

Quadro 1 – Palavras reservadas da Linguagem Java. Fonte: <http://www.linhadecodigo.com.br/Artigo.aspx?id=83>. Acesso em: 14 maio

2010.

Trabalhando com os valores das variáveis

Ao longo da criação dos nossos programas, é comum, além de declararmos e inicializarmos as variáveis, trabalharmos com ela na lógica do nosso programa. No caso de variáveis de tipos primitivos numéricos inteiros ou reais, podemos

Page 55: POO Metropole Digital

usar os operadores matemáticos tradicionais como soma (“+”), subtração (“-“), multiplicação (“*”) e divisão (“/”).

A Listagem 2 apresenta diversos exemplos de uso dos operadores. Inicialmente, são declaradas duas variáveis (salario1, salario2) do tipo float. Em seguida, uma nova variável (somaSalario) é criada e seu valor é inicializado com a soma das variáveis salario1 e salario2.

A variável poupanca1 é calculada como o dobro do salario1, ou seja, é o valor do salario1 multiplicado (operador “*”) pelo valor 2. A variável do tipo double gastoMes é calculada como a subtração entre o valor do salario1 e o valor de 590.68. Finalmente, a variável idade é calculada como a subtração entre dois valores inteiros: 2010(que representa o ano corrente) e 1980(o ano do seu nascimento).

1. float salario1 = 700.0, salario2 = 855.0; 2. float somaSalario = salario1 + salario2; 3. double poupanca1 = salario1 * 2; 4. double gastoMes = salario1 – 590.68; 5. int idade = 2010 – 1980;

Listagem 2 - Manipulação de variáveis de tipos numéricos

Atividade 2

1. Estenda a classeTesteTiposPrimitivoscriada no exercício anterior para incluir a declaração de variáveis acima.

2. Em seguida, imprima os valores de tais variáveis usando o método System.out.println().

A classe String

A classe String é usada em Java para representar um conjunto de caracteres. Apesar de ser uma classe, a criação de objetos do tipo String não exige o uso da palavra chavenew.

A Listagem 3 apresenta a declaração de uma variável nome1 sendo inicializada com o valor“João Santos”, assim como de outra variávelnome2com o valor“Maria das Graças”.

Observe que para criar objetos do tipo Stringnão é necessário criar um objeto usando a palavra-chave new, como pode ser visto no exemplo da variável nome2.

Page 56: POO Metropole Digital

Uma string em Java é nada mais nada menos do que um conjunto de caracteres separados por aspas e que podem ser atribuídos diretamente para variáveis do tipoString.

A terceira linha da listagem mostra a declaração da variável frase do tipo String. No caso, está sendo atribuído para ela a concatenação (união) da variável nome1 com a string “gosta de “ e, finalmente, a variável nome2. Observe que essa concatenação é feita através do operador “+”. O próprio compilador Java consegue interpretar tais comandos e traduzir para que ocorra uma concatenação de strings em tais casos. Dessa forma, o valor final que a variável fraseirá armazenar será “João Santos é o pai de Maria das Graças”.

1. String nome1 = new String(“João Santos”); 2. String nome2 = “Maria das Graças”; 3. String frase = nome + “ é o pai de “ + nome2;

Listagem 3 – Declaração e inicialização de variáveis em Java

Para imprimir uma variável do tipo String, é possível usar o comandoSystem.out.println() normalmente, de forma idêntica como fazemos com os tipos primitivos.

A Listagem 4 mostra uma classe que contém um método main() para impressão das variáveis apresentadas na Listagem 3.

1. public class ProgramaPrincipal { 2. public static void main(String args[]) 3. String nome 1 = “João Santos”; 4. String nome2 = “Maria das Graças”; 5. String frase = nome + “ é o pai de “ + nome2; 6. 7. System.out.println(nome1); 8. System.out.println(nome2); 9. System.out.println(frase); 10. } 11. }

Listagem 4 – Declaração e inicialização de variáveis em Java

Atividade 3

1. Crie, compile e execute uma classe de

nomeTesteStringscom as variáveis do tipo String

Page 57: POO Metropole Digital

declaradas na Listagem 4. 2. Em seguida, estenda o programa criando novas variáveis

que criam novas frases usando variáveis String, por exemplo.

3. Crie variáveis com o seu nome e alguém da sua família. 4. Faça concatenações das Strings usando o operador “+”.

Declaração de variáveis em classes

Em um programa Java, as variáveis que declaramos tanto de tipo primitivos quanto de tipos de classes/objetos (como, por exemplo, a classe String) podem ser declaradas e usadas tanto no método main() quanto diretamente como atributos de classes ou variáveis locais de métodos.

Na Listagem 5, por exemplo, vemos inicialmente a declaração da variável idade do tipo inte salario do tipo float na forma de atributos da classe Pessoa. Observe que tais atributos podem ser usados nos métodos set e get da própria classe Pessoa. Essas variáveis da classe Pessoa são criadas para cada objeto que é instanciado em qualquer trecho de um programa Java. Ou seja, se criarmos dois objetos da classe Pessoa, cada objeto irá manter internamente em memória seu próprio nome, idade e salario.

Essa situação é ilustrada na Listagem 6. Nesse exemplo, vemos a declaração de duas variáveis objetos da classe Pessoa (pessoa1, pessoa2), além de uma variável inteira (anoAtual) do tipo int. Observe que, logo a seguir, os nomes dos objetos da classe Pessoa, assim como o anoAtual, são também impressos.

1. public class Pessoa { 2. // Atributos da classe 3. private String nome; 4. private int idade; 5. private float salario; 6. 7. // Construtor da classe 8. public Pessoa(String nomePessoa, int idadePessoa, 9. float salarioPessoa){ 10. nome = nomePessoa; 11. idade = idadePessoa; 12. salario = salarioPessoa; 13. } 14. // Método set e get de idade 15. public int getIdade(){ 16. return idade; 17. } 18. public void setIdade(int idadePessoa){ 19. idade = idadePessoa; 20. } 21. ...

Page 58: POO Metropole Digital

22. }

Listagem 5 – Declaração de variáveis em uma Classe

1. public class ProgramaPrincipal { 2. public static void main(String args[]) 3. Pessoa pessoa1 = new Pessoa(“João”, 22, 1500.0); 4. Pessoa pessoa2 = new Pessoa (“Maria”, 25, 2500.0); 5. int anoAtual = 2010; 6. 7. System.out.println(“Nome da pessoa 1: “ +

pessoa1.getNome()); 8. System.out.println(“Nome da pessoa 2: “ +

pessoa2.getNome()); 9. System.out.println(“Ano Atual: “ + anoAtual); 10. 11. } 12. }

Listagem 6 – Declaração de variáveis no métodomain

Leitura Complementar

No tutorial oficial da Linguagem Java, você poderá adquirir mais conhecimentos sobre os seguintes assuntos:

• variáveis:

<http://java.sun.com/docs/books/tutorial/java/nutsandbolts/variables.html>

• tipos primitivos:

<http://java.sun.com/docs/books/tutorial/java/nutsandbolts/datatypes.html>

• Strings:

<http://java.sun.com/docs/books/tutorial/java/data/strings.html>

Resumo

Nesta aula, você viu os tipos primitivos da linguagem Java. Você estudou também como manipular esses tipos. Aprendeu sobre a classe String e suas semelhanças com os tipos primitivos. Por fim, você aprendeu a declarar, modificar os valores e imprimir as variáveis de tipos primitivos e String.

Page 59: POO Metropole Digital

Autoavaliação

1 - Crie, compile e execute as classes ProgramaPrincipal e Pessoa apresentadas nas Listagens 5 e 6.

2 - Modifique a classe ProgramaPrincipal para criar três novos objetos Pessoa, que irão representar alguém da sua família ou amigos.

3 - Modifique a classe Pessoa para incluir dois novos atributos: (i) estaDeFerias do tipo boolean, sendo inicializada com false; (ii) curso do tipo String para indicar algum curso atual que a pessoa esteja fazendo. Observe que a inclusão de tais atributos exige que seja modificado o construtor para ser passado novos parâmetros para inicializar os novos atributos. Crie também métodos set() e get() para cada um dos novos atributos.

4 - Modifique a classe ProgramaPrincipal para inicializar os novos atributos criados para a classe Pessoa, assim como os respectivos métodos de impressão dos dados.

Referências

THE JAVA Tutorials. Disponível em: <http://java.sun.com/docs/books/tutorial/index.html>. Acesso em: 14 maio 2010.

Page 60: POO Metropole Digital

Aula 7 – Comandos da Linguagem

Apresentação

Nesta aula, iremos aprender um pouco mais sobre os comandos de fluxo de controle (if, switch) e repetição (while, for), que podemos utilizar na linguagem Java. Tais comandos são também fundamentais para a construção de qualquer sistema e elaboração de nossos algoritmos.

Objetivos

Ao final desta aula, você será capaz de:

• saber quais são os comandos de fluxo de controle e repetição existentes na linguagem Java;

• usar nas situações adequadas cada um desses comandos.

Introdução

Toda linguagem de programação oferece comandos para o desenvolvimento de nossos programas e algoritmos. Com a linguagem Java, também não é diferente, ela oferece uma série de comandos para fluxos de controle e repetição. Uma boa parte de tais comandos são derivados das linguagens C e C++, que serviram de inspiração para a criação de Java.

A seguir, você vai aprender um pouco mais sobre tais comandos.

Comandos condicionais

Um dos principais tipos de comandos que existem em muitas linguagens são os comandos condicionais. Eles servem para alterar o fluxo normal de execução seqüencial das instruções do seu programa. Ou seja, eles permitem que sejam feitos desvios ao longo da execução, afim de executar determinados trechos do programa apenas nas situações desejadas.

Comando IF

Um dos comandos mais conhecidos e usados nas linguagens de programação moderna é o comando IF. A palavra “IF” em inglês significa “se” em português. Ela indica alguma condição de decisão que é feita para controlar se um dado trecho de código é executado. Em Java, o comando IF pode apresentar duas formas: IF e IF-ELSE (em português: “Se – Senão”).

Page 61: POO Metropole Digital

Listagem 1 – Comando IF

Na Listagem 1, é apresentada a estrutura mais simples do comando IF. Como pode ser visto, o comando é estruturado de tal forma a avaliar uma dada condição. Caso essa condição seja avaliada como verdadeira, o trecho de código que fica no bloco do comando (entre as chaves) é executado.

Listagem 2 – Exemplo do comando IF

A Listagem 2 mostra um exemplo concreto de tal comando, apresentando a implementação do método imprimirFaixaEtaria()da classePessoa. Observe que no conteúdo do código usa-se o comando IF para verificar se a Pessoa é “menor de idade” testando se a “idade” é menor que 18 anos.

Vimos a primeira forma de utilização do comando IF, em que o programa só executa certo trecho de código, se e somente se, o teste avaliado tiver resultado verdadeiro. Já a segunda forma IF-ELSE fornece outro trecho de código para o caso onde o teste for avaliado como falso.

Ele tem a seguinte forma geral:

Listagem 3 – Comando IF-ELSE

E para o nosso exemplo teríamos:

Page 62: POO Metropole Digital

Listagem 4 – Exemplo do comando IF

Inserimos na Listagem 4 o comando ELSE que determina o bloco de comandos a serem executados caso a condição de teste o IF for falsa. Neste caso, mostra que o objeto Pessoa em questão é maior de idade.

Comando IF aninhados

Aninhar o comando IF significa que podemos colocar comandos IF’s dentro de outros comandos IF. Vamos mostrar através do refinamento do exemplo anterior.

Listagem 5 – Exemplo do comando IF Aninhado

Observe que agora temos outras condições de teste, caso a idade da pessoa seja menor que 18. Nosso programa também está analisando se a pessoa é criança (linha 15). Assim, como verifica se a pessoa é adolescente (linha 17). E, finalmente, temos simplesmente o comando ELSE(linha 19), pois não é necessário testar, uma vez que já sabemos se a pessoa possui idade entre 16 e 17 anos, dado os testes dos IFs anteriores.

Page 63: POO Metropole Digital

Atividade 1

Modifique a classe apresentada na Listagem 5 usando o comando IF de forma aninhada para testar se a “Pessoa maior de idade” é adulto ou idoso.

Em seguida, crie um método main()que cria dois objetos da classe Pessoa com idades diferentes, e verifica qual a faixa etária de tais pessoas chamando o métodoimprimirFaixaEtaria().

Comando SWITCH

Outro comando condicional existente na linguagem Java é o comando SWITCH (do inglês: desvio, mudar, trocar), assim como o IF, ele permite várias possibilidades para a execução do programa. Um detalhe é que o SWITCH efetua sua condição de teste apenas nos tipos primitivos: byte, short, char e int. Mas, assim como a avaliação de condição verdadeiro (true)ou falso (false) é suficiente para o comando IF, esses tipos são suficientes para tomar todas as decisões necessárias para o fluxo de seu programa.

A Listagem 6 mostra a estrutura geral do comando SWITCH.

Listagem 6 – A forma geral do comando SWITCH

A Listagem 7 mostra como seria o uso do SWITCH para um exemplo de um dos métodos usado pela classe Automóvel. Observe no exemplo que dependendo do valor que a variável cambio possui podemos imprimir a marcha que foi passada no automóvel. Ou seja, caso a variável cambio possua o valor 1, será exibida a mensagem “Passou a 1ª marcha”. Vale observar o funcionamento do comando break, pois é ele quem define que uma vez encontrado um dadocase (caso), outro caso (case) não será procurado, ocasionando assim a saída do comando switch.

Page 64: POO Metropole Digital

Listagem 7 – Exemplo com o comando SWITCH

Outra possibilidade com o uso do SWITCH é a situação em que, para várias possibilidades, temos o mesmo caminho a seguir. A Listagem 8 mostra um exemplo de tal uso do SWITCH.

Como pode ser visto em tal exemplo, caso o sensor disparado seja um dos sensores de 1 a 4, será mostrada uma mensagem indicando que existe uma porta aberta. Caso seja os sensores 5 ou 6, será mostrada a mensagem indicando que a mala do carro está aberta. Observe que nesse exemplo a busca só é interrompida pelo comandobreak quando se defineo que se deseja fazer (nesse caso, exibir uma mensagem). Pois enquanto o comando SWITCH não encontrar o break, mesmo já tendo encontrado o case, ele continuará verificando os demais casos.

Page 65: POO Metropole Digital

Listagem 8 – Comando SWITCH com case sem break

Atividade 2

1. Crie um método publicvoidmudarDirecao(char direção)para a classe Automóvelque defina a direção que o automóvel deve tomar de acordo com os comandos recebidos. As possibilidades de comandos são: F = Frente, E = Esquerda, D = Direita.

Observação Veja as dicas seguintes:

• defina cases no comando switch usando o tipo primitivo char.;

• se tiver dúvidas na hora de uso do comando SWITCH, releia o exemplo da Listagem 7.

Comandos de repetição

Os comandos de repetição das linguagens de programação são responsáveis pelas rotinas que nós humanos consideramos tediosas. E isso torna os computadores mais úteis. Primeiro, pela capacidade de repetição automática; segundo, em função da velocidade pelas quais são processadas. Por exemplo, imagine a tarefa de procurar um nome em um enorme banco de dados, ou uma palavra em vários textos, ou mesmo efetuar a mesma sequência de cálculos para uma grande lista de valores.

Page 66: POO Metropole Digital

Comando WHILE

O comando WHILE (do inglês, “Enquanto”) repete um comando ou um bloco de comandos enquanto a condição de teste for verdadeira. Ele possui a seguinte estrutura geral:

Listagem 9 – Comando WHILE

A Listagem 10 apresenta um exemplo do comando WHILE. No caso, temos um método que inicia uma contagem de 0 a 99 para servir de temporizador para chamar outro método que trava as portas do automóvel. Nesse caso, “enquanto” o contador for menor que 100, o método disparaTravaPortas()não será executado. E ainda quando executado será exibido cada valor do contador antes de ser incrementado. Vale observar que a instruçãocontador++(linha 07) representa o incremento da variável inteiracontadorem uma unidade, o que significa que sempre que essa linha é executada o valor da variávelcontador passa a ser o seu valor atual mais uma unidade.

Listagem 10 – Exemplo comando WHILE

Atividade 3

1. Crie um método dentro de uma classe chamada OperacoesNumericas, usando o comando WHILE que possua um contador que vá de 100 (cem) até 0 (zero) e imprime apenas os números pares.

Comando DO-WHILE

Page 67: POO Metropole Digital

O comando DO-WHILE tem a mesma finalidade do comando WHILE com apenas uma diferença. A diferença é que com o comando WHILE a condição de teste é efetuada antes de executar uma instrução ou bloco de instruções, já com o comando DO-WHILE a condição de teste só será efetuada depois de executar instrução ou bloco de instruções. A Listagem 11 apresenta a forma geral do comando.

Listagem 11 –Estrutura geral do comando DO-WHILE

Para entendermos melhor a diferença, vejamos primeiro o exemplo usando WHILE. Para a nossa classe Automóvel, considere que para ligar o automóvel é preciso que o usuário entre através do método acesso com uma senha num teclado do painel do carro.

Listagem 12 – Exemplo com o WHILE

Observe, na Listagem 12, que após a senha digitada (linha 10), se a senhaDigitadafor diferente dasenha (=100), o programa entra no WHILE e repetidas vezes pede a senha (linhas 12 e 13) até que o usuário digite a senha correta. Para só então exibir a mensagem de “Acesso Permitido” e chamar o método ligarAutomovel().Nesse caso, como o teste do WHILE é executado antes das instruções, nosso método tem as linhas 9 e 10 idênticas às linhas 12 e 13.

Agora, veja na Listagem 13 o mesmo exemplo usando o DO-WHILE. Observe nesse exemplo, que agora não é necessário repetir as linhas 10 e 11, porque o teste é efetuado depois de pedir a senha. E ainda assim funciona exatamente como o comando WHILE.

Page 68: POO Metropole Digital

Listagem 13 – Exemplo com o DO-WHILE

Comando FOR

Quando usamos os comandos de repetição WHILE e DO-WHILE controladas por contadores muito usualmente, temos que criar uma variável de controle e iniciar essa variável antes dos comandos. Dentro do bloco dos comandos, essa variável terá seu valor modificado para ser comparada na condição de teste.

O comando FOR já possui uma estrutura especializada para a implementação de repetição controlada por contadores, que agrupa a inicialização do contador, modificação do contador e condição de teste em um único comando. A Listagem 14 apresenta a estrutura geral do comando FOR.

Na inicialização,é onde se define o valor inicial para o contador. Nacondição,é onde efetuamos o teste de repetição. E opassoé onde o contador sofre a modificação a cada iteração, normalmente o contador pode ser incrementado ou decrementado. O comando FOR é interrompido apenas quando a condição de teste tem resultado falso.

Listagem 14 – Comando FOR

A Listagem 15 apresenta um exemplo concreto do Comando FOR. Observe que usamos o mesmo exemplo do comando WHILE apresentado na Listagem 10, mas o código ficou mais enxuto devido à estrutura do FOR.

Page 69: POO Metropole Digital

Listagem 15 –Exemplo do comando FOR

Anote a Dica

Use o comando WHILE e DO-WHILE quando não se sabe quando vai terminar a repetição. Normalmente, quando não são necessários contadores.

E o comando FOR quando se tem bem definido no términodo ciclo de repetição. Normalmente, quando os contadores são necessários.

Por exemplo : o FOR não seria muito adequado para implementar os exemplos de leitura de senha a partir do teclado (Listagens 13 e 14).

Listagem 15 – Comando FOR aninhado

O FOR Aninhado é usado quando se deseja trabalhar com a modificação do passo de dois (ou mais) contadores. Por exemplo: quando se deseja percorrer as informações contidas em matrizes.

Comando FOR para vetores e coleções

O comando FOR possui outra estrutura, quando se trabalha com vetores ou coleções (do inglês: Arrays eCollections). Vejamos em um trecho de código um exemplo dessa estrutura.

Page 70: POO Metropole Digital

Listagem 16 – Comando FOR para vetores e coleções

Observe que aqui a ideia de contador está implícita e existe uma variável do mesmo tipo do vetor (variável item do tipo int no exemplo) ou o item da coleção é que recebe uma nova informação a cada interação até passar por todos os itens do vetor.

Atividade 4

1. Usando o comando FOR, crie uma classe qualquer, que possua diferentes métodos que faça os seguintes tipos de contagem.

a) Contagem e exibição crescente para um dado número inicial e final.

b) Contagem e exibição decrescente para um dado número inicial e final.

c) Contagem e exibição de números PARES para um dado número inicial e final.

d) Contagem e exibição de números ÍMPARES para um dado número inicial e final.

e) Contagem e exibição de números de passo 2 (contador varia de 2 em 2, ou seja, é incrementado em 2 a cada rodada do comando FOR) para um dado número inicial e final.

f) Contagem e exibição de números de passo 3 (contador varia de 3 em 3, ou seja, é incrementado em 3 a cada rodada do comando FOR) para um dado número inicial e final.

g) Contagem e exibição de números de passo 5 (contador varia de 5 em 5, ou seja, é incrementado em 5 a cada rodada do comando FOR) para um dado número inicial e final.

h) Não deixe de criar um método main() na sua classe para fazer uma chamada de teste para cada um dos métodos acima.

Page 71: POO Metropole Digital

Leitura Complementar

Neste artigo, você verá o assunto da aula de hoje, explicado de outra forma e com algumas informações que não foram abordadas nesta aula.

<http://javafree.uol.com.br/artigo/6946/Cap-4-Controle-de-Fluxo.html>

Resumo

Na aula de hoje, você viu quais são os comandos de fluxo de controle e de repetição da linguagem Java. Estudou as estruturas de cada comando sempre acompanhadas de exemplo concretos, contemplando também alguma de suas variações.

Autoavaliação

1 - Quais são os comandos de controle de fluxo existentes na linguagem Java?

2 - Quando devemos usar os comandos de controle de fluxo?

3 - Quais são os comandos de repetição existentes na linguagem Java?

4 - Quando devemos usar os comandos de repetição?

Referências

THE JAVA Tutorials. Disponível em: <http://java.sun.com/docs/books/tutorial/index.html>. Acesso em: 17 maio 2010.

Page 72: POO Metropole Digital

Aula 8 – Composição ou Agregação

Apresentação

Compor, juntar, reunir, formar, constituir... Essas ações nos levama uma ideia muito interessante na programação orientada a objetos, chamada Composição. Nesta aula, você vai ver esse interessante conceito da POO, que nos dá a grande possibilidade da reutilização de código. Além disso, a ideia de composição também aproxima a ideia da Orientação a Objetos ao senso comum de sistematização das coisas, em que um objeto mais complexo pode ser composto de partes mais simples. Boa aula!!

Objetivos

Ao final desta aula, você será capaz de:

• saber o que significa Composição ou Agregação; • criar objetos na linguagem Java que são compostos por

outros objetos, fazendo uso prático do conceito de Composição;

• entender como se comporta os modificadores de acesso de Java na Composição.

Composição ou Agregação

Composição ou Agregação é um mecanismo de reaproveitamento (reutilização) de classesutilizado pela POO para aumentar a produtividade e a qualidade no desenvolvimento de software.

Reaproveitamento ou reutilização de classes significa que você pode usar uma ou várias classes para compor outra classe. Já o aumento de produtividade está relacionado com a possibilidade de não ser necessário reescrever código de determinadas classes, se alguma outra já existe com estado (atributos) e comportamento similar. Finalmente, com a composição, é possível também aumentar a qualidade dos sistemas gerados, porque há a possibilidade clara de reutilizar classes que já foram usadas em outros sistemas, e, portanto, já foram testadas e têm chances de conter menos erros.

Vejamos um exemplo: um carro é um objeto COMPOSTO por vários outros objetos. Ele é composto pelos objetos motor, pneus, direção, faróis etc. A Figura 1 dá uma ideia do conceito de composição para um objeto do tipo Carro.

Page 73: POO Metropole Digital

Figura 1 - Composição do objeto Automóvel

Legal não é?!! Isso mesmo que você entendeu, você pode criar um objeto a partir de vários outros objetos. E isso é muito natural.

Veja o computador que você está usando, ele é um objeto composto por outros objetos: teclado, monitor, placa mãe, memória, mouse etc.

E tem mais, quando uma classe é composta de outras classes ela pode tanto usar os objetos que são gerados pelas classes que a compõem, como pode também usufruir dos atributos e métodos dessas classes.

Atividade 1

Para praticar o conceito de composição que você acabou de aprender, tente olhar o mundo ao seu redor, outros exemplos de objetos do mundo real que são compostos por outros objetos menores. Anote tais exemplos para que possamos usá-los em outros exercícios ao longo da nossa aula.

Exemplos na prática

Vejamos agora um exemplo na prática! Vamos utilizar a mesma ideia do objeto Automóvel. Dado uma classe Automóvel que é composta pelas classes Direção e Motor.

Page 74: POO Metropole Digital

Figura 2 - Composição da classe Automóvel: motor e direção

Nas linhas de código, essa Composição é expressa da seguinte maneira, veja Listagem 1:

Listagem 1 - Classes Motor, Direção e Automóvel

Observe que a classe Automóvel é composta pelas classes Motor e Direção, eis aqui a nossa Composição! Mas, lembre-se de que primeiro criamos as classes Motor e Direção para só a partir daí podermos criar a classe Automóvel.

Atividade 2

1. Crie, baseado no exemplo apresentado, outras classes compostas de várias outras classes. Lembre-se: para que uma classe possa compor uma outra é necessário que ela já exista. Elabore também classes para os exemplos que você mesmo criou no exercício 1. As classes são:

Classe Composta Classes Componentes (“Partes”) da Classe Composta

Page 75: POO Metropole Digital

Computador Teclado, Monitor, Memória, Placa Mãe...

Livro Título, Autor, Capítulo, Editora ...

Monstro Cabeça,Olho,Boca,Braço,Perna...

Mas, o conceito e vantagens do uso da Composição não acabam por aí, analisando as classes, vamos incrementá-las um pouco mais e descobrir os benefícios de se utilizar a Composição.

Observe que a classe Automovel possui atributos que são referências para instâncias (1) (objetos) das classes Motor e Direção.Observe que as classes possuem a propriedade doEncapsulamento (visto na aula 5), consequentemente, para acessar os atributos das classes usaremos os métodos get e set (vistos na aula 2). Assim, nossas classes ficam conforme indicam as listagens a seguir: Listagem 2, Listagem 3 e Listagem 4:

(1) Ver aula 3.

Listagem 2 -Classe Motor

Listagem 3 - Classe Direção

Page 76: POO Metropole Digital

Listagem 4 - Classe Automóvel

Da maneira que está o código das classes, se nós criarmos um objeto (instanciarmos) da classeAutomóvel, os atributos motor e direção continuam com valor nulo (null).

Automovelautomovel = newAutomovel();

Isso significa que para instanciarmos os objetos que compõem a classe Automóvel podemos decidir de que maneira faremos.

A Composição e o método construtor

Os métodos construtores das classes componentes (Motor,Direção) que fazem parte da classe composta (Automóvel), podem ser chamados de três maneiras diferentes, são elas:

• CASO 1: chamadas nos construtores da classe que é composta; • CASO 2: chamadas em qualquer método da classe que é composta; • CASO 3: chamadas fora da classe que é composta.

Para mostrar cada uma dessas situações, vamos considerar inicialmente que a classe Automóvelé composta apenas pela classe Motor. Acrescentamos dois métodos construtores para a classeMotor. O primeiro utiliza a potência do motor 1000 (por default), já o segundo espera que o usuário forneça a informação da potência do motor quando criado o objeto Motor, veja a Listagem 5.

Page 77: POO Metropole Digital

Listagem 5 - Classe Motor com dois construtores

Listagem 6 - Classe Automóvel composta pela classe Motor

• CASO 1: chamadas nos construtores da classe que é composta

Para a primeira situação, quando o construtor da classe componente é chamado no construtor da classe que usa a composição, ilustrada na Listagem 7, temos:

Page 78: POO Metropole Digital

Listagem 7 - Classe Automóvel com dois métodos construtores

Nesse exemplo, os construtores da classe motor são chamados dentro dos construtores da classe Automóvel.

• CASO 2: chamadas em qualquer método da classe que é composta

Outra maneira seria a situação, na qual os construtores são chamados em qualquer método da classe que é composta. Vejamos a Listagem 8:

Listagem 8 - Construtor chamado a partir de um método

• CASO 3: chamadas fora da classe que é composta

Por fim, a terceira situação, onde o construtor da classe componente é chamado de fora da classe que usa a composição, veja a Listagem 9. Considere que a classe Automóvel utilizada possui o código apresentado na Listagem 6.

Page 79: POO Metropole Digital

Listagem 9 -Criação da classe Motor fora da classe Automóvel

Observe que o construtor da classe Motor foi chamado de fora da classe Automóvel, dentro do método main()da classe. Ou seja, antes de usar o métodosetMotor() o objeto motor não tem nenhum vínculo com o objeto automóvel.

Comparando as possibilidades

Observando a Listagem 10, analisaremos as possíveis maneiras de criar o objeto da classe componente (Motor) através da classe composta (Automóvel) ou dentro do método main() que define o comportamento de execução de um programa Java.

Listagem 10 - Possibilidades de criação da classe Motor para uso pela classe Automóvel

Page 80: POO Metropole Digital

Para o caso 1: temos duas possibilidades, na linha 1, é ocultado do usuário a existência de um objeto motor que compõe a classe Automóvel. Já na linha 2, o usuário define a potência a ser adotada pelo motor do automóvel.

Para o caso 2, podemos observar na linha 3 que quando criamos o objeto automóvel o objeto motor ainda não existe. Ele permanece nulo (null) dentro do objeto motor até que o automóvel seja ligado pela primeira vez. Para isso, pode-se usar um dos dois métodos ligarPrimeiraVez()(linhas 4 e 5), sem ou com parâmetro, respectivamente.

Finalmente, para o caso 3, apresentado a partir da linha 6, tem-se a mesma observação da linha 3. Nesse caso, o usuário cria normalmente o objeto motor, escolhendo um dos dois construtores (linhas 7 e 8) e, em seguida, define que esse objeto componha o objeto automóvel (linha 9.)

Atividade 3

Seguindo o exemplo apresentado para as classes Automóvel e Motor,

1. Aplique o caso 1 para a classe Computador que agrega uma placa mãe, o caso 2 para a classe Livro que agrega seu título e autor, e o caso 3 para a classe Monstro que agrega cabeça e boca.

Composição e os modificadores de acesso

Duas observações importantes, podemos considerar com relação à composição e aos modificadores de acesso (1). Elas estão mencionadas a seguir.

Quando declaramos atributos públicos nas classes e reutilizamos essas classes dentro de outras, esses atributos podem não ser acessados facilmente, através da classe de composição, veja Listagem 11.

(1) Veja sobre modificadores de acesso na Aula 5 sobre Encapsulamento.

Page 81: POO Metropole Digital

Listagem 11 - Tentativa de uso de um atributo público de um objeto privado

No exemplo acima, apesar do atributo cor da classe Direção ser public, esse atributo não é diretamente acessível a partir do método main(), porque o objeto Direção está encapsulado (é um atributo privado) dentro da classe Automóvel.

• Quando temos atributos privados nas classes e reusamos essas classes, declarando suas instâncias como públicas, os atributos não passam a ser públicos, veja a Listagem 12.

Listagem 12 - Tentativa de uso de um atributo privado de um objeto público.

Aqui é o inverso do caso anterior, mas reforça que private não deixa de ser privado mesmo quando na classe que usa da Composição (Automóvel) torna seu

Page 82: POO Metropole Digital

atributo (Direção) public.

Anote a Dica

Quando uma classe usa a Composição para agregar outras classes, podemos dizer que ela tem um relacionamento chamado “Tem um”, o qual descreve um relacionamento em que uma classe contém uma instância de outra classe.

Leitura Complementar

Como dissemos, na POO, Agregação é um conceito bastante similar a Composição, veja um pouco mais sobre agregação no link a seguir: <http://www.dca.fee.unicamp.br/cursos/POOCPP/node14.html>.

Na literatura, também encontramos autores que fazem diferença entre Agregação e Composição. Eles usam o mesmo raciocínio usado para modelagem de Banco de Dados. É também uma ideia válida e interessante. Veja no link a seguir:

<http://pt.wikipedia.org/wiki/Classe_%28programa%C3%A7%C3%A3o%29>.

Resumo

Nesta aula, você estudou o que é Composição. Viu que composição é a capacidade de fazer com que uma classe seja composta de vários objetos de outras classes. A Composição oferece a possibilidade de fazer uso do comportamento das classes que ela agrega (como atributos) de maneira implícita ou explícita, dependendo da maneira que se escolhe para instanciar as classes componentes.

Autoavaliação

1 - Sem consultar o material, responda: O que você entendeu por Composição?

2 - Quais são as vantagens de se usar a Composição?

3 - Dos três casos de instanciação dos objetos componentes, qual você usaria se quisesse omitir a presença da composição para quem irá criar os objetos das classes que usa a composição?

4 - Crie as classes apresentadas no diagrama abaixo e aplique a Composição para a classe Pessoa, que além de possuir um atributo Nome será composta pelas classes Data, Endereçoe Contato para os atributosdataNasc, enderecoe contato,respectivamente.

Page 83: POO Metropole Digital

Referências

DEITEL,H. M.; DEITEL, P. J. Java como programar. Porto Alegre: Bookman, 2003.

SANTOS, Rafael. Introdução à programação orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003.

Aula 9 - Arrays, coleções e listas

Apresentação

Precisamos constantemente manipular muitas informações e muitos objetos ao mesmo tempo. Para isso, é necessária uma estrutura que permita armazená-los e recuperá-los sempre que desejarmos. A linguagem Java oferece várias dessas estruturas de dados em um conjunto de classes chamadas de coleções. Tais coleções ajudam a armazenar e recuperar nossos objetos dentro de um sistema. É isso que você verá nesta aula.

Objetivos

Page 84: POO Metropole Digital

Ao final desta aula, você será capaz de:

• compreender como armazenar objetos em estruturas de dados conhecidas como arrays;

• conhecer e aprender como usar de forma introdutória, um conjunto de classes da biblioteca padrão de Java relacionadas à manipulação de coleções de objetos.

Armazenando objetos

Existem várias situações durante a construção de sistemas e programas que precisamos armazenar um número expressivo de objetos, onde a criação e manuseio de uma variável para cada um dos objetos torna-se impraticável. Esse fato ocorre, por exemplo, quando precisamos armazenar uma lista de alunos de uma turma, ou mesmo da escola inteira, e em um dado momento precisamos recuperar apenas um dos objetos aluno dessa lista. Outro exemplo, seria quando queremos encontrar um número de telefone e recorremos à lista telefônica, ela é nosso repositório de dados.

Imagine termos que criar 100 (cem) variáveis para 100 nomes de alunos! É possível criar um tipo especial de variável para armazenar um número específico de objetos ou valores primitivos. Esse tipo de variável é o que chamamos de array, e é ela que veremos na sequência.

Arrays

Considere a seguir um exemplo que motiva o uso de arrays. Constantemente, precisamos tomar nota de um valor que muda ao longo do tempo, e precisamos medir sua média, valores máximo e mínimo. Por exemplo, suponha que você é um treinador de um atleta velocista de 100 metros raso, como parte do treinamento,você irá fazer 5 medições de tiros de 100 metros. Para cada tentativa do atleta, você vai medir o tempo e colocar o resultado em sua planilha de rendimento.

Precisamos armazenar 5 valores numéricos reais para representar a marca de tempo obtida. Porém, não podemos criar 5 variáveis, e sim, apenas uma para comportar esses valores. Veja tal código na Listagem 1.

Page 85: POO Metropole Digital

Listagem 1 - Declaração de um array

Conforme pode ser observado, um novo operador entrou em cena: o par de colchetes “[“ e “]”. Eles servem para indicar uma dimensão, ou seja, uma posição onde iremos colocar um valor inteiro que indica a quantidade de elementos que precisamos armazenar na variável em questão (marca). Por conta de tais colchetes, a variável marcanão mais é capaz de armazenar um único valor do tipo double, mas sim irá armazenar um conjunto de valores do tipo double. Dessa forma, caracteriza-se a declaração de uma variável/atributo do tipo array (também chamada de vetor) em Java.

Observe que o atributo marca representa um array, mas é necessário o operador new para alocar espaço para armazenar o conjunto de valores. Assim, a palavra new é usada com o objetivo de indicar quantos valores do tipo Double serão necessários para armazenar tais valores. A quantidade de valores estipulada para armazenar no array, cinco (5) para o exemplo do atributo marca, é um valor que permanece fixo, após a chamada comnew. Isso significa que no nosso exemplo o atributo marca será capaz de armazenar 5 elementos.

O código logo após a declaração indica uma atribuição de valor para armazenar uma determinadamarca em cada posição do array. Veja que colocamos um número para indicar que posição estamos acessando. Esse valor sempre começa com 0 (zero) e vai até o comprimento do vetor menos uma unidade. No nosso caso, o array marca vai de 0 (zero) a 4 (quatro), compreendendo 5 (cinco) posições conforme foi declarado.

Listagem 2 - Impressão dos valores do Array

Page 86: POO Metropole Digital

Para exibirmos os valores, o programa da Listagem 1pode ser incrementado pelas seguintes linhas de código (Listagem 2). Não indicamos a primeira tomada de tempo como sendo o tempo 0 (zero), pois naturalmente costumamos realizar contagens a partir do número 1 (um).

Há outra forma de definir os valores de um array, no momento de sua declaração podemos indicar seus valores, sendo que já precisamos conhecê-los de antemão. Veja aListagem 3. Observe que não precisarmos indicar o comprimento do vetor, pois ele sabe de antemão pela quantidade de elementos definidos na sua inicialização.

Listagem 3 - Outra forma de definir os valores de um Array

Tanto na definição do array quanto no acesso para leitura ou escrita de suas posições, é possível usar um comando de repetição para acessá-lo diretamente. Na verdade, na programação diária, isso é o mais comum.

Vejamos como ficaria a exibição dos valores acima com um comando FOR naListagem 4.

Listagem 4 - Impressão dos valores de um array usando comando FOR

Atividade 1

Para praticar o conceito de array, crie um programa que declara uma lista (array) capaz de armazenar 10 (dez) nomes de ferramentas para uso de um mecânico. Inicialize cada uma das ferramentas armazenadas no array, em seguida, imprima cada um deles.

Arrays bidimensionais

Page 87: POO Metropole Digital

Primeiramente, vamos definir o que é uma dimensão de um array. A dimensão, ou quantidade de dimensões, é o conjunto de valores que precisamos definir para localizar uma informação. Por exemplo, uma lista de alunos de 0 a 100 pode ser organizada em um array de uma dimensão, pois para localizar um aluno nessa lista basta indicar um valor da sequência.

Já para localizar uma peça em um tabuleiro de xadrez precisamos de duas coordenadas, linha e coluna. Assim, para representarmos um tabuleiro de xadrez com arrays,são necessárias duas dimensões. A Listagem 5mostra esse exemplo codificado em Java. Suponha que iremos representar um tabuleiro de xadrez com linhas e colunas de 0 (zero) a 7 (sete), compreendendo 8 valores de cada. Vamos também supor que cada valor representa uma String com o nome da peça que ocupa a casa. Observe a utilização de dois valores distintos para localizar uma casa no tabuleiro, e para cada valor um par de colchetes, um par para cada dimensão do array.

Listagem 5 - Exemplo de Array bidimensional

É possível definir n dimensões, porém, na prática, não é comum nem recomendável trabalhar com tantas dimensões. Na prática, é extremamente comum trabalharmos com apenas 1 (uma), e algumas vezes com 2 (duas), e, quase nunca com 3 (três) dimensões, pois há outros recursos na programação orientada a objetos que desencorajam e oferecem alternativas melhores a essa prática.

Atividade 2

1. Observe o tabuleiro da Figura 1abaixo e crie um programa em Java que o represente através de um array de duas dimensões, em que cada casa irá conter a sua cor BRANCA ou PRETA, como sendo valores do tipo String. Imprima cada uma das casas do array, após iniciá-los.

Dica: não tente definir uma a uma, pois serão 64 linhas de códigos. Ao invés disso, crie estruturas com comandos de repetição para preenchê-lo e imprimí-lo.

Page 88: POO Metropole Digital

Figura 1 - Tabuleiro

Arrays como objetos

Vimos que arrays são estruturas para armazenar objetos, tais como Strings. Mas, é preciso dizer que arrays são também objetos, por isso é usado o comando new() para alocar espaço de armazenamento para ele. Graças a sua capacidade de se comportar como um objeto, os arrays possuem métodos e um atributo muito útil, o length,que indica seu comprimento.

É necessário conhecê-lo para não passarmos do limite, e para realizar operações de manutenção em seus dados. Pois bem, vamos alterar o exemplo anterior (Listagem 1) que exibe os valores do array marcapara utilizar seu atributo length. Tal programa modificado é apresentado naListagem 6.

Listagem 6 - Exemplo de uso do atributo lenght de um array

Coleções Java

A linguagem Java possui um conjunto de classes que servem para armazenar na memória vários objetos. Tais classes não possuem o inconveniente de termos que saber de antemão a quantidade exata de elementos que iremos armazenar, como no caso de arrays. E em alguns casos, nem mesmo o tipo.

Há 3 (três) tipos principais de objetos Java definidos para esse fim, veja-os a seguir.

Page 89: POO Metropole Digital

1. Set – representa a mesma ideia de conjuntos da matemática, ou seja, um grupo de objetos sem ordem definida, porém, únicos. Como mostra a Figura 2.

Figura 2 - Conjunto de objetos

Nunca poderemos prever a ordem com a qual serão apresentados os seus elementos. Essa situação pode não ser um incômodo diante do problema que tivermos.

Os sets possuem uma característica importante em relação às buscas de objetos em seu interior, pois não precisam percorrer todos eles.

O principal representante dos Set é a classe HashSet, vejamos um exemplo da sua utilização, como mostra a Listagem 7:

Listagem 7 - Exemplo de um Set

2. List – como o próprio nome sugere, representa uma lista de objetos, sendo que nela os objetos podem se repetir. Veja a figura.

Figura 3 - Lista de objetos

Nas listas (List) definidas em Java, os objetos armazenados mantém a ordem com que foram adicionados. Uma classe do tipo List bastante utilizada é a ArrayList, a qual representa uma alternativa aos arrays convencionais vistos anteriormente. Vejamos um exemplo da utilização de um ArrayList na Listagem 8:

Page 90: POO Metropole Digital

Listagem 8 - Exemplo de ArrayList

3. Map – Mapas são estruturas que relacionam um objeto a outro, por exemplo, um número de CEP ao nome de uma rua.

Podemos imaginar dois conjuntos, um de campos-chave e outro de objetos-valor que queremos armazenar. Observe aFigura 4:

Figura 4 - Dois conjuntos de objetos

Observe que para encontrarmos nossos objetos precisamos localizá-los através de suas chaves. Vejamos uma aplicação desses conceitos na Listagem 9:

Listagem 9 - HashMap na prática

Os Sets e Lists são do tipo Collection. Apesar de Map não descender de Collection, é também uma classe que define métodos de armazenamento e recuperação de objetos.

Page 91: POO Metropole Digital

Figura 5 -Collection e Map

Todas as classes do tipo Set e List descendem (implementam) a interface Collection. Veremos mais detalhes sobre interfaces em aulas futuras. Por hora, podemos entender interfaces como contratos que definem um conjunto de métodos que devem ser implementados pelas classes. No caso da interface Collection, ela define métodos para adicionar, remover, verificar a presença de um dado objeto. Tais métodos devem necessariamente existir em todas as List e Sets definidos para a linguagem Java. Segue abaixo uma lista básica desses métodos:

Lista básica de Métodos da Interface Collection

boolean add(Object) Adiciona um elemento na coleção. Como algumas coleções não suportam elementos duplicados (exemplo: Sets), esses métodos retornam verdadeiro (true) ou falso (false) para indicar se a adição foi bem sucedida.

boolean remove(Object) Remove determinado elemento da coleção. Se ele não fizer parte da coleção, retorna falso (false).

intsize() Retorna a quantidade de elementos presentes na coleção.

boolean contains(Object) Procura por um determinado objeto na coleção. Vale salientar: a comparação é feita pelo método equals().

Anote a Dica

As coleções Java mantêm um mecanismo interno de ordenação e recuperação de dados e para isso fazem uso de tabelas hash. Tais tabelas são utilizadas para que a pesquisa de um objeto seja feita de maneira rápida.

Mas, como funciona?

Cada objeto é “classificado” pelo seu hashCode, método de java.lang.Object que retorna um int, e com isso podemos agrupar os

Page 92: POO Metropole Digital

objetos por esse valor. Quando é realizada uma busca, só é percorrido o grupo de objetos com o mesmo hashCode.

Atividade 3

Crie um programa que registra uma lista de compras semanais com itens como: arroz, feijão, carne, pão etc. Utilize os três tipos de coleções vistos até aqui: oHashSet, ArrayList e HashMap.

Leitura Complementar

Sobre definição de Arrays Java na Wikipédia: <http://pt.wikipedia.org/wiki/Array>

Dois artigos que falam sobre Collections em Java <http://www.devmedia.com.br/articles/viewcomp.asp?comp=3162>

<http://javafree.uol.com.br/artigo/847654/Collections-Framework.html>

Resumo

Você estudou hoje que em sistemas grandes, é bastante comum precisarmos de um grande conjunto de objetos. Você viu que a linguagem Java oferece dois mecanismos para armazenar um grande número de objetos: arrays e coleções. Agora, você já sabe que os Arrays permitem armazenar um conjunto de objetos com tamanho fixo definido na sua inicialização. Já as coleções podem ser usadas para armazenar um conjunto não-finito de elementos, e são implementadas em Java como um conjunto de interfaces, que oferecem um conjunto de métodos padronizados para armazenamento e recuperação.

Autoavaliação

1 - Elabore um programa que exiba um calendário do dia 1 ao dia 31, utilizando um array de duas dimensões.

2 - Qual a principal diferença entre um array convencional e a classe ArrayList que você destacaria?

3 - Que tipo de coleção se assemelha a um conjunto matemático? Por quê? Explique.

Referências

THE JAVA tutorials. Arrays. Disponível em: <http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html>. Acesso

Page 93: POO Metropole Digital

em: 15 maio 2010.

______. Lesson: interfaces. Disponível em: <http://java.sun.com/docs/books/tutorial/collections/interfaces/index.html>. Acesso em: 15 maio 2010.

______. Lesson: implementations. Disponível em: <http://java.sun.com/docs/books/tutorial/collections/implementations/index.html>. Acesso em: 15 maio 2010.

Page 94: POO Metropole Digital

Aula 10 - Herança

Apresentação

Hoje, você vai aprender sobre mais um pilar de sustentação da Programação Orientada a Objetos: aHerança. Ela é considerada um dos conceitos mais importantes na POO. A herança trouxe para a programação um novo olhar sobre a maneira de se programar, até então não atendido pela Programação Estruturada.

Objetivos

Ao final da aula, o aluno deve:

• entender o que é Herança; • conhecer quais os tipos de Herança existentes em POO; • entender o funcionamento da Herança durante a execução

do programa; • programar em Java usando a Herança.

Herança

Você já ouviu falar sobre herança relacionada à programação? Estranho não é? A Figura 1 mostra os pilares da orientação objetos com destaque para a Herança.

Figura 1 - Orientação a Objetos

Vamos começar pela definição de herança. Herança é o mecanismo que permite a uma classe herdar todos os atributos e métodos de outra classe. Ela permite definir a implementação de uma nova classe na definição de uma classe previamente implementada. Como exemplo, observe a Figura 2 a seguir.

Page 95: POO Metropole Digital

Figura 2 -Exemplo de Herança entre classes

Considere como classes as seguintes abstrações: Transporte, Aquático, Terrestre, Aéreo, Barco,Automóvel e Avião. Considere capacidade como um atributo da classe Transporte, que indica a quantidade de pessoas que o transporte em questão pode transportar. E número de rodas como um atributo da classe Terrestre. E cor, número de portas e placa como atributos da classe Automóvel.

A Figura 2 apresenta um exemplo de Herança, onde as classes Aquático, Terrestre e Aéreo herdam da classe Transporte. A classe Barco herda da classe Aquático. A classe Automóvel herda de Terrestre. E, finalmente, Avião de Aéreo.

Um aspecto importante que podemos também observar na figura é que toda classe que herda de uma outra, acaba herdando também, como consequência, os seus atributos. Por exemplo, de acordo com a Figura 2, a classe Transporte possui um atributo chamado capacidade. Para a classe Aquático, como ela herda de Transporte, pode-se dizer que também possui o atributo capacidade. E Barco, como herda deAquático, também possui o atributo capacidade. Com essa lógica, percebemos que na herança os atributos (e também os métodos) são herdados naturalmente pelas classes subsequentes na hierarquia.

Hierarquia de Classe ou de Herança:é o mapeamento do tipo árvore de relacionamentos que se formam entre as classes como resultado da herança. Exemplo: a Figura 2 representa uma hierarquia de herança ou hierarquia de classe.

Usando a mesma lógica, responda: Quantos e quais são os atributos da classe Terrestre? E da classeAutomóvel?

Respondendo: a classe Terrestre possui dois atributos: capacidade (que é herdado de Transporte) enúmero de rodas. Já a classe Automóvel possui cinco atributos: capacidade (herdado de Transporte),número de rodas (herdado de

Page 96: POO Metropole Digital

Terrestre), cor, número de portas e placa.

Observe na Figura 2 que, quanto mais alta na hierarquia, está a classe, mais ela tende a ser abstrata em comparação com as suas subsequentes. Ou seja, quanto mais alto na hierarquia, menos definida (abstrata) é a classe, e assim ela define menos atributos e métodos. Isso também garante que a classe tenha mais chance de ser reusada por outras classes que herdem da mesma. Entendeu? Não, então vamos ao exemplo da figura. Suponha que a classe Transporte, além do atributo capacidade, possuísse também o atributo número de rodas. Ou seja, ela passa a ser uma classe mais concreta, menos abstrata. Mas nesse caso, conseqüentemente, não seria interessante nem faria sentido para as classesAquático e Aéreo herdar os atributos de Transporte (ou herdar de Transporte), pois o atributo número de rodas não é desejado por tais classes.

Atividade 1

Defina alguns atributos adicionais para as classes Aéreo e Avião da Figura 2. Em seguida, baseado na hierarquia de herança da qual elas fazem parte, indique quantos e quais são os atributos de cada uma delas.

Termos usados para Herança

Na literatura, são encontrados diversos termos para nomear tanto as classes que fornecem a herança quanto as classes que herdam de alguma outra. Veja exemplos de termos usados no Quadro 1 a seguir.

Classes que Fornecem a Herança Classes que Herdam de Outras

Superclasse Subclasse

Mãe Filha

Tipo Subtipo

Quadro 1 - Termos usados na Herança

Nota: a classe filha não pode remover os atributos e métodos da classe mãe. Abaixo, são apresentados outros termos que são também comumente usados.

• Ancestral: é uma classe que aparece na hierarquia de classes em uma posição acima da progenitora (mãe).

• Descendente: dada uma classe, toda classe que aparece abaixo dela na hierarquia é uma descendente da classe dada.

• Raiz (ou Base): é a classe topo da hierarquia. • Folha: é uma classe sem filhas.

Page 97: POO Metropole Digital

Atividade 2

Considerando a hierarquia de herança entre classes da Figura 2, dê exemplos de:

1. classes superclasse e subclasse; 2. classe raiz e classe folha; 3. classe ancestral da classe Automóvel, que não seja

superclasse dela; 4. classe descendente da classe Veículo, que não seja

subclasse dela.

Especialização e generalização

Assim como os conceitos de classes Abstratas e Concretas, tem-se também nos extremos da árvore hierárquica de herança, os conceitos de Generalização e Especialização. Na Generalização, como o próprio nome sugere, há classes mais genéricas e abstratas disponíveis, as quais podem ser usadas para outras descenderem delas. Já a Especialização é usada para indicar que classes que estão numa posição inferior na hierarquia possuem estado e comportamento mais especializados, ou seja, com mais detalhes de informações.

A Figura 3 ilustra tais conceitos dentro da hierarquia de classes de transportes, apresentada anteriormente. Como pode ser observado, classes em posição inferior na hierarquia, tal como a classe Automóvel, representam especializações de classes em posição superior (Transporte, Terrestre) na hierarquia. Já classes em posição superior, como a classe Transporte, representam generalizações de classes em posições inferiores (Automóvel, Terreste)

Figura 3 -Generalização e Especialização

Page 98: POO Metropole Digital

Herança múltipla e simples

Herança Múltipla: é a capacidade de uma classe possuir mais de uma superclasse e herdar as variáveis e métodos combinados de todas as superclasses.

Herança Simples: Cada classe pode ter apenas uma superclasse, embora uma superclasse possa ter várias subclasses.

Na linguagem Java, a Herança é simples e na codificação usa-se a palavra reservada extends para declarar que uma classe é herdeira de outra. Para simular a herança múltipla em Java, usa-se Interfaces.

Funcionamento da Herança

Você viu os conceitos sobre Herança, mas é importante também que possamos entender o que acontece com uma classe que utiliza a Herança durante sua execução. Para melhor entendermos o funcionamento da Herança durante a execução do programa, vejamos a Figura 4.

Figura 4 -Herança em ação

Sabemos que quando criamos um objeto, temos uma instância concreta da classe a qual esse objeto representa. Na Figura 3, esse objeto é representado pelo Objeto1. Agora, vamos supor que o Objeto2quer saber o valor do atributoX desse objeto, através do envio de uma mensagem. Para obter o valor do atributo X, o Objeto1 sai consultando sua árvore hierárquica de classes até encontrar o atributo solicitado pelo Objeto2. No caso da Figura 4, o objeto consulta a classe da qual ele foi instanciado (ClasseC), não encontrando, consulta a classe mãe dessa mesma (ClasseB), e assim sucessivamente até encontrar o atributo e o valor. Vale ressaltar que o Objeto1 não percorre toda a árvore hierárquica, percorre o caminho da classe filha em direção à classe mãe.

Outro ponto importante é que o objeto não acumula todos os atributos das classes que fazem parte da hierarquia de herança, mas apenas os atributos das classes

Page 99: POO Metropole Digital

ancestrais a ele. O usuário (programador ou outros objetos, tal como o Objeto 2 na Figura 4) de um determinado objeto não sabe (nem precisa saber) se o atributo é dele ou se o atributo é herdado de uma outra classe ancestral dele.

Herança em Java

Depois de termos visto os conceitos sobre Herança, vamos finalmente ver a herança nas linhas de código Java. Como mencionamos anteriormente, em Java a palavra-chave extends é usada para indicar que uma dada classe herda de outra. A Listagem 1 apresenta exemplos de código em Java, indicando queTerrestre herda de Transporte e que Automóvel herda de Terrestre.

Listagem 1 - Exemplo de Herança em Java

Vale lembrar que quando uma classe herda de outra, todos os atributos (e métodos) da outra classe passam a fazer parte dessa mesma. Isso significa que, para o exemplo acima, o programador (ou outro objeto) pode solicitar à classe Automóvel, os atributos de Transporte e Terrestre. Os atributos deTerrestre são acessíveis na classe Automóvel porque a segunda herda da primeira. E os atributos deTransporte são acessíveis a Automóvel devido ao fato de Terrestre herdar de Transporte.

Uma dúvida que você pode estar se perguntando é: como os atributos são acessíveis se eles estão declarados como private?

Respondendo: considere que para os códigos das classes da Listagem 1 foram declarados os métodosget e set para cada um dos atributos. Através desses métodos, que são também herdados pelas subclasses, podemos acessar facilmente qualquer um dos atributos herdados. Eles só não foram escritos para ressaltarmos a construção extends de Java definir a herança entre classes. Veremos códigos mais completos na próxima aula.

Anote a Dica

Page 100: POO Metropole Digital

A classe Object: todas as classes em Java descende de uma classe, chamada Object, mesmo que a declaração extendsObject seja omitida. Assim, a classe Object é a classe raiz da hierarquia de todas as classes Java, sendo, portanto, ancestral de todas as classes da linguagem.

Anote a Dica

Quando uma classe usa a relação de Herança, podemos dizer que essa classe possui um relacionamento chamado “É um” com a classe da qual ela herda. Tal relação também indica que uma classe é do mesmo tipo que outra. Assim, nos exemplos anteriores, podemos dizer queAutomóvel “é um” transporte Terrestre, assim como que Terrestre “é um” (ou tipo de) Transporte.

Leitura Complementar

Não faz parte desta disciplina falar sobre interfaces. Também não é mandatório que você já domine a “simulação” de herança múltipla usando interface em Java. Para isso, sugerimos que você primeiro domine a herança simples para no futuro procurar saber sobre o assunto.

Como leitura complementar, propomos o próprio tutorial Java da Sun, que pode ser acessado pelo seguinte endereço: <http://java.sun.com/docs/books/tutorial/index.html>

Artigo da web que fala sobre herança:

<http://www.tiexpert.net/programacao/java/heranca.php>

Resumo

Nesta aula, você aprendeu que Herança é a capacidade que uma classe tem de herdar as características (atributos) e comportamentos (métodos) de outra classe. Conheceu como funciona a Herança durante a execução do programa e quais são os tipos em que ela é classificada. Você viu também pequenos exemplos de como aplicar a Herança na prática. Na próxima aula, continuaremos abordando esse assunto, apresentando mais exemplos interessantes do uso de Herança, através da sobreposição de métodos, construtores e os modificadores na Herança.

Autoavaliação

1 - Sem consultar o material responda: o que você entendeu por Herança?

2 - Qual a diferença entre Herança simples e Herança múltipla?

3 - Como funcionaria o processo de busca pelos atributos na herança, se

Page 101: POO Metropole Digital

fosse solicitado ao objetoAutomóvel a sua capacidade? (Dica: dê uma relida na explicação da Figura 3 da nossa aula).

4 - Considerando o código das classes Transporte, Terrestre e Automóvel apresentados na Figura 4, finalize a implementação delas, adicionando os métodos get() eset() para cada um de seus atributos. Em seguida, crie uma classe Principal com um método main() que cria um objeto da classe Automóvel, e chama todos os métodos set() e get() criados, inclusive das classes Transporte e Terrestre. Observe no seu exemplo, que é possível chamar todos os métodos get() e set() herdados pela classe Automóvel.

5 - Das opções abaixo, qual se refere ao conceito de Herança?

a) Herança é a capacidade de reaproveitar outras classes para compor uma nova classe.

b) Herança é a característica da OO de ocultar partes da implementação interna de classes do mundo exterior.

c) Herança é a habilidade de objetos de classes diferentes responderem a mesma mensagem de diferentes maneiras.

d) Herança é o mecanismo que permite a uma classe herdar todos os atributos e métodos de outra classe.

e) As letras a e d estão corretas

Referências

BARNES, David J.; KÖLLING, Michael.Programação orientada a objetos com Java. São Paulo: Pearson Prentice Hall, 2004.

DEITEL,H. M.; DEITEL, P. J.Java como programar. Porto Alegre: Bookman, 2003.

SANTOS, Rafael. Introdução à programação orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003.

SINTES, anthony. Aprenda a programar orientada a objeto em 21 dias. Tradução: João Eduardo Nóbrega Tortello. São Paulo: Pearson Education doBrasil, 2002.

THE JAVA tutorials.What is inheritance?Disponível em: <http://java.sun.com/docs/books/tutorial/java/concepts/inheritance.html>. Acesso em: 15 maio 2010.

______. Inheritance.Disponível em: <http://java.sun.com/docs/books/tutorial/java/IandI/subclasses.html>. Acesso em: 15 maio 2010.

Page 102: POO Metropole Digital

Aula 11 - Herança II

Apresentação

Na aula passada, foram dados os primeiros passos sobre o assunto Herança, um dos pilares da POO. Considerando a importância desse tema, continuaremos a abordá-lo na aula de hoje, focalizando, sobretudo, a herança de comportamento (método). Serão também apresentados outros exemplos mais sofisticados de implementação de herança na linguagem Java.

Objetivos

Ao final desta aula, você deve ser capaz de:

• relacionar a herança e o modificador de acesso protected; • entender o uso da palavra-chave super no contexto de

herança entre classes; • saber como funciona a herança para os métodos, durante a

execução do programa.

A Herança e o protected

Na aula sobre Encapsulamento (aula 5), você viu os tipos de modificadores de acesso: public, private e protected. Esse último, ficamos de explicar melhor durante as aulas de Herança.

Naquela aula, nós mencionamos que o modificador protected funciona como o private exceto que as classes filhas também terão acesso ao atributo ou método declarado como protected. Isso significa que apenas as classes descendentes de uma determinada classe poderão ter acesso aos atributos e métodos declarados com esse modificador.

Listagem 1 - Herança em Java com protected e private

Figura 1 - Esquema de Herança

Page 103: POO Metropole Digital

A Figura 1 e a Listagem 1 apresentam o exemplo da aula anterior com algumas pequenas modificações.

As classes Transporte e Terrestre tiveram seus atributos modificados para serem protected, isso significa que apenas classes que pertencem à hierarquia de herança podem acessar diretamente esses atributos. Em outras palavras, apenas subclasses (ou classes descendentes) de Transporte e Terrestre terão acesso aos seus atributos protected.

A Listagem 2 abaixo mostra a definição de mais um método na classe Automóvel, o qual faz acesso aos atributosprotectedcapacidade e numRodas, definidos nas classes ancestrais Transporte e Terrestre, respectivamente. Observe que tais atributos são acessados e usados livremente no método imprimeDadosAutomovel(). Isso só é possível porque agora eles foram declarados como protected.

Listagem 2 -Acesso a atributos protected

A Listagem 3 mostra uma tentativa frustrada de acesso aos atributos capacidade e numRodas herdados pela classe Automóvel, dentro de um método main(). Nesse caso, não é possível acessar tais atributos, porque a classe Principal não herda da classe Terrestre e, portanto, não tem direito a acessar os atributos protected.

Listagem 3 -Acesso a atributos protected

Atividade 1

1. Modifique as classes Transporte, Terrestre e Automóvel da Listagem 1, para que tenham todos os seus atributos declarados como public.

2. Em seguida, tente novamente compilar e executar tais

Page 104: POO Metropole Digital

classes, juntamente com a classePrincipal da Listagem 3. 3. O que acontece? 4. A compilação e execução funcionaram corretamente? Se

sim, explique o que você acha que aconteceu.

A Herança e o super

Em suas pesquisas em outras fontes (tutoriais na internet, livros), além do material desta aula, você pode ter encontrado o uso da palavra (ou operador) super nos códigos exemplos.

A palavra super é mais uma das palavras reservadas da linguagem Java que tem uma forte ligação com a herança. A palavra super refere-se à classe ancestral imediata da classe, ou seja, a classe mãe ou super-classe. Ela é usada nos construtores para chamada de construtores em cascata das classes mães.

Listagem 4 - Herança em Java com uso do operador super

A Listagem 4 ilustra um exemplo de herança em Java, que faz uso da palavra-chave super. Vamos então entender o que acontece quando usamos o comando super em tais contextos.

Page 105: POO Metropole Digital

Primeiro, observe que o super é usado para chamar o método construtor da classe mãe. Na classe Transporte,como a classe mãe de Transporte é Object (vimos na aula passada que Object é o ancestral de todas as classes), o super não tem parâmetro. A chamada de super equivale a uma chamada explícita ao construtor sem parâmetro da classe Object.

Já no construtor da classe Terrestre, o super tem como parâmetro a capacidade exigida no construtor da classeTransporte. Portanto, a chamada a super na classe Terrestre é no fundo a chamada ao construtor deTransporte. Já o construtor da classe Automóvel, o super tem como parâmetros a capacidade e o numRodasexigidos pelo construtor da classe Terrestre.

Observando a Listagem 4 dá para observar que uma chamada a super ocasiona a invocação do construtor da classe mãe. Isso acaba permitindo uma chamada em cadeia dos construtores de classes ancestrais, permitindo assim a configuração de todos os atributos herdados da classe.

Vale ressaltar que se o construtor não possui parâmetro, o compilador Java aceita a omissão do super sem parâmetro, porque durante o processo de compilação ele insere explicitamente tal chamada. Para o nosso exemplo, se quiséssemos poderíamos omitir o super do construtor da classe Transporte.

Anote a Dica

Apenas comentários são permitidos antes da palavra super nos construtores. Assim, não é possível incluir nenhum comando antes de super() no código de métodos construtores de classes.

Anote a Dica

Da mesma maneira que se usa a palavra-chave this para acessar os atributos (ou métodos) da própria classe. Pode-se usar super, para acessar os atributos (ou métodos) da classe mãe.

Atividade 2

Hoje, os celulares estão cada vez mais sofisticados, mp3, mp4, acesso web, câmera digital... Crie uma hierarquia de classes que possui no topo da hierarquia o celular mais básico, aquele que simplesmente liga e atende ligações, e que vai sendo refinada com várias outras classes que definem celulares mais sofisticados e modernos. Para isso, use a hierarquia e nos construtores das classes use o operador super. Na hierarquia, defina no mínimo três classes.

Page 106: POO Metropole Digital

Um exemplo completo

Vimos até agora diversos exemplos do uso de herança para acessar atributos das classes ancestrais. Vamos mostrar agora a herança utilizando os métodos dessas classes.

Listagem 5 - Classe Transporte

Listagem 6 - Classe Terrestre

Page 107: POO Metropole Digital

Listagem 7 - Classe Automóvel

As Listagens 5, 6 e 7 apresentam o código das classes Veículo, Terrestre e Automóvel, incluindo a implementação dos métodos get e set para cada atributo das classes.

Cada um dos métodos declarados na classe Veículo são herdados pelas classes Terrestre e Automóvel, assim como os métodos declarados pela classe Terrestre são herdados pela classe Automóvel, exatamente como ocorre com os atributos.

A Figura 8 apresenta um demétodo main() que cria um objeto da classe Automóvel, em seguida, chama dois métodos setCapacidade() e setNumRodas(). Observe pelas

Page 108: POO Metropole Digital

Figuras 5 , 6 e 7 que tais métodos não pertencem à classe Automóvel, mas são na verdade herdados de suas ancestrais. Dessa forma, percebe-se claramente que uma vez declarado um método (público ou protected) em uma das classes ancestrais, aquele método é visível em objetos das classes filhas.

Listagem 8 - Classe Principal

Um pergunta: será que a Herança também permite o uso de outros métodos diferentes dos get e set para as classes descendentes?

A resposta é sim, a Herança serve para todos os métodos, desde que a classe mãe permita. Se um método estiver com modificador private, esse método não estará acessível para classes filhas. Assim, apenas estão acessíveis para classes filhas, os métodos declarados como public e protected na classe mãe.

Vejamos um exemplo do uso de outros métodos. Vamos acrescentar agora à classe Terrestre um método que calcula o número de pneus reservas.

Listagem 9 - Classe Terrestre com método calculaNumPneusReserva()

Na Figura 10, vemos a classe Principal modificada para criar um objeto Automóvel e acessar diretamente o método calculaNumPneusReserva() que foi herdado da classe Transporte. Como era de se esperar, mesmo o método sendo da classe Terreste a classe Automóvel usa sem restrição.

Page 109: POO Metropole Digital

Listagem 10 -Método main modificado

Atividade 3

Continuando a Atividade 2, acrescente agora os métodos que darão as funcionalidades dos telefones móveis (celulares). Uma observação é que os métodos ligar() e atender() não precisam ser criados novamente nas classes filhas. Uma vez que ele deve está presente na classe Mãe da hierarquia (celular mais simples).

Funcionamento da Herança para os métodos

A Herança funciona para os métodos durante a execução do programa, de maneira similar ao funcionamento para os atributos (ver Aula 10). A Figura 11 ilustra tal situação.

Quando o Objeto2 solicita a execução do metodoX() ao Objeto1, esse último inicialmente procura pelo método na própria classe C que o define. Caso não encontre, ele sai percorrendo sua árvore hierárquica. Nesse caso, em particular, o metodoX() é encontrado logo na primeira classe ancestral visitada, a ClasseB.

Figura 2 - Herança e os métodos

Page 110: POO Metropole Digital

Leitura Complementar

A seguir, temos dois links para artigos da web que tratam sobre Herança:

• <http://terramel.org/java-quarta-aula-heranca/>

<http://www.dcc.unicamp.br/~cmrubira/aacesta/java/javatut10.html>

Resumo

Nesta aula, você aprendeu que a Herança é a capacidade que uma classe tem de herdar as características e comportamentos (atributos e métodos) de outra classe. Em particular, foi enfatizado a herança de métodos entre classes. Você viu que um método de uma classe mãe para ser herdado em Java por uma classe filha não pode ser declarado como private.

Autoavaliação

1 - Para que serve o modificador de acesso protected? Como ele funciona no caso de Herança entre classes?

2 - Para que serve a palavra-chave super? Dê um exemplo concreto do seu funcionamento.

3 - Existe alguma diferença entre o funcionamento da Herança para os atributos e métodos?

4 - Descreva o que acontece com o acesso aos atributos e métodos quando são do tipo:

• public • private • protected

5 - Crie as classes utilizando o princípio da Herança, obedecendo à hierarquia da figura abaixo: (Obs: Para facilitar, substitua na figura o tipo Calendar por String)

Page 111: POO Metropole Digital

a) Acrescente aos construtores a lista de parâmetros necessária para instanciar o objeto. Por exemplo, a classe Pessoa deve ter nome, CPF e dataNasc. E essa lista é acumulativa, ou seja, o construtor da classe Funcionário deve ter a lista de seus atributos mais os atributos necessários para a classe Pessoa. Dica: não deixe de usar a palavra-chave super em cada um dos construtores para chamar o construtor da classe mãe, passando os atributos que são mantidos por ela e seus ancestrais.

b) Insira os seguintes métodos, para apresentar os valores dos atributos das classes, mostrarPessoa(), mostrarFuncionario(), mostrarChefe() e mostrarAluno(), respectivamente, às classes Pessoa, Funcionário, ChefeDepartamento e Aluno. Para imprimir os atributos, use o método System.out.println() em cada um dos métodos.

c) Crie uma classe TestaTudo com um método main(), que instancia um objeto de cada uma das classe e exibe os valores dos atributos através de chamadas aos métodos mostrarPessoa(), mostrarFuncionario(), mostrarChefe() e mostrarAluno().

Page 112: POO Metropole Digital

Referências

SANTOS, Rafael. Introdução à programação orientada a objetos usando Java. Rio de Janeiro: Editora Campus, 2003.

THE JAVA tutorials. Disponível em: <http://java.sun.com/docs/books/tutorial/>. Acesso em: 16 maio 2010.

Page 113: POO Metropole Digital

Aula 12 - Polimorfismo

Apresentação

Hoje, iremos iniciar o aprendizado do último princípio que serve de base para a Programação Orientada a Objeto – o Polimorfismo. Esse princípio também aposta na ideia da reutilização para facilitar o dia a dia da programação. Ele é também bastante importante tanto para o entendimento de programas OO em Java e outras linguagens, como também é um mecanismo bastante sofisticado para permitir a reutilização e flexibilidade durante o desenvolvimento de tais programas.

Objetivos

Ao final desta aula, você deve ser capaz de:

• entender o princípio do Polimorfismo; • saber quais são os tipos existentes de Polimorfismo; • conhecer Polimorfismo de Sobrecarga, de Sobreposição e de

Inclusão; • saber o que é Conversão de Tipos.

Polimorfismo

O poliformismo deriva da palavra polimorfo, que significa multiforme, ou que pode variar a forma. Para a POO, polimorfismo é a habilidade de objetos de classes diferentes responderem a mesma mensagem de diferentes maneiras. Ou seja, várias formas de responder à mesma mensagem. Veja a figura a seguir para entender onde se localiza o pilar do poliformismo dentro da Programação Orientada a Objetos.

Figura 1 - Pilares da POO

Vejamos o seguinte exemplo: um dono de uma fábrica de brinquedos solicitou que seus engenheiros criassem um mesmo controle remoto para todos os brinquedos

Page 114: POO Metropole Digital

de sua fábrica. A única restrição era que cada brinquedo atendesse aos comandos específicos definidos pelo controle.

O controle remoto teria vários botões, sendo que todos eles seriam úteis para todos os brinquedos. Assim, quando o usuário clicasse no botão mover,o controle enviaria o sinal MOVER para todos os brinquedos que estivessem no raio de dois metros. A Figura 2 ilustra tal situação.

Figura 2 -Exemplo de polimorfismo

Assim quando o brinquedo recebe o sinal MOVER, ele se move de acordo com a sua função. Para o avião, mover significa VOAR, para o barco significa NAVEGAR, e para o automóvel CORRER. Observe que os brinquedos respondem ao mesmo sinal de formas diferentes. Temos aqui então um caso de polimorfismo.

O Polimorfismo permite que diferentes objetos (avião, barco, automóvel) respondam uma mesma mensagem (mover) de formas diferentes (voar, navegar e correr).

Atividade 1

Para avaliar seu entendimento, descreva em seu caderno de anotações uma situação em que aconteça o polimorfismo.

Tipos de polimorfismo

O Polimorfismo pode ser classificado de três maneiras:

• Polimorfismo de Sobrecarga • Polimorfismo de Sobreposição • Polimorfismo de Inclusão

Page 115: POO Metropole Digital

Polimorfismo de sobrecarga

Polimorfismo de sobrecarga permite que um método de determinado nome tenha comportamentos distintos, em função de diferentes parâmetros(1) que ele recebe. Cada método difere no número e notipo de parâmetros. Exemplo

Considere uma classe Maior capaz de calcular e retornar o maior entre dois números de tipos diferentes. A Listagem 1 ilustra o código de tal classe.

(1) Lembrando: parâmetros são as variáveis que estão dentro dos parêntesis na declaração do método.

Listagem 1 - Polimorfismo de Sobrecarga com tipos de parâmetros diferentes

Veja no exemplo uma aplicação prática do uso do polimorfismo de sobrecarga. Observe que temos vários métodos com o mesmo nome, no caso calcMaior(), cujo objetivo é indicar qual é o maior dentre dois números.

O que diferencia cada um deles é o tipo de parâmetros. No primeiro método, os parâmetros são do tipo int. Já no segundo método, os dois parâmetros são float. Finalmente, no terceiro método, os parâmetros são do tipo double. Esses métodos fazem a mesma coisa (calculam o maior entre dois números), mas de maneiras diferentes, pois recebem e retornam tipos diferentes.

Observe agora o último método calcMaior() declarado na classe Maior. Esse método, apesar de diferenciar do anterior pelo tipo de retorno de double para int, não será aceito pelo compilador Java como um polimorfismo de sobrecarga.

O motivo é que já existe um método com o nome calcMaior() e dois parâmetros do tipo double. Esse método seria aceito se houvesse um número diferente de parâmetro ou um dos parâmetros tivesse o tipo diferente de double. Como mostra a Listagem 2.

Page 116: POO Metropole Digital

Listagem 2 - Polimorfismo de sobrecarga com tipo e número de parâmetros diferentes

Observe que agora os dois últimos métodos possuem número e tipos de parâmetros diferentes dos métodos anteriores.

A sobrecarga e os construtores

O polimorfismo de sobrecarga normalmente acontece sobre os métodos construtores, pois é comum para uma classe ter várias maneiras de instanciá-la.

A Listagem 3 ilustra um exemplo de polimorfismo de sobrecarga nos construtores da classe Pessoa. Observe que são declarados 3 construtores e todos eles têm o mesmo nome da classe. Entretanto, cada um deles recebe um número diferente de parâmetros.

Assim, durante a criação de objetos do tipo Pessoa em um método main, por exemplo, o construtor que será chamado irá depender da quantidade e parâmetros passados durante a invocação do comando new.

Page 117: POO Metropole Digital

Listagem 3 - Polimorfismo de sobrecarga de construtores

A sobrecarga e a conversão

Conversão e sobrecarga frequentemente andam lado a lado.

A Conversão é a capacidade de um tipo ser convertido em outro tipo de maneira automática ou pela força bruta também chamada de coerção.

Veja o quadro abaixo sobre conversão de tipos primitivos.

Conversão de Tipos Primitivos

Java converte um tipo de dado em outro sempre que isso for apropriado.

As conversões ocorrem automaticamente quando há garantia de não haver perda de informação. As conversões automáticas são permitidas para tipos de maior precisão e para tipos de menor precisão.

Exemplos de Conversões Automáticas

Page 118: POO Metropole Digital

São permitidas as conversões do tipo byte para o tipo short, de short para int, e assim sucessivamente, até chegar o tipo de maior precisão, que é o double.

Observe também algumas conversões permitidas baseadas nas variáveis criadas pelas letras no quadro “Algumas conversões legais”.

A conversão também pode fazer com que um método pareça como se fosse polimórfico. A conversão ocorre quando um argumento de um tipo é convertido para o tipo esperado, internamente. Por exemplo, suponha que a classe Maior, descrita anteriormente, tivesse apenas atributos e métodos para lidar com o tipo primitivo, conforme ilustra a Listagem 4.

Listagem 4 - Classe Maior com o método calcMaior para os tipos int e float

Agora suponha que em uma aplicação (método main) usamos um objeto da classe Maior, mas, na chamada de seu método calcMaior, fossem passados, ao invés de valores do tipo float, valores do tipoint., conforme ilustra a Listagem 5.

Page 119: POO Metropole Digital

Listagem 5 - Conversão automática de tipos primitivos

Observe que, apesar do método esperar parâmetros do tipo float, o compilador aceitou receber parâmetros do tipo int, e os converteu automaticamente para float dentro do método calcMaior da classe Maior apresentada na Listagem 5.

Nesse caso, parece um caso de polimorfismo de sobrecarga, mas na verdade o que acontece é uma conversão automática de tipos.

Atividade 2

Implemente em Java, a classe Brinquedo apresentada na Figura 3 a seguir, aplicando o polimorfismo de sobrecarga nos métodos apontados pelas setas. Em seguida, escreva um método main que cria diferentes brinquedos fazendo chamadas para seus diferentes métodos construtores e chamando diferentes métodos velocidade().

Figura 3 - Esquema da classe brinquedo

Polimorfismo de sobreposição

Polimorfismo de sobreposição é a redefinição de métodos em classes descendentes. Ou seja, um método de uma classe filha com o mesmo nome de um método de uma classe mãe irá sobrepor esse último. Vejamos o exemplo da Figura 4.

Como pode ser observado na hierarquia de classes apresentada, existe: (i) uma classeA, que implementa ummetodoX(); (ii)uma classeB, que implementa um método com o mesmo nome; e, finalmente, (iii)umaclasseC, que implementa um métodoY().

Page 120: POO Metropole Digital

Figura 4 -Sobreposição de métodos em uma hierarquia de Herança

O que aconteceria se fosse solicitado ao Objeto1 da classeC a execução do metodoX() ?

Conforme você viu nas aulas anteriores sobre Herança, esse método será procurado na hierarquia da classe instanciada pelo Objeto1.

Devemos observar que, nesse caso, o métodoX() que também é implementado na ClasseB, foi encontrado primeiro que o metodoX() da ClasseA.

Nesse caso, o método que de fato será executado será o da ClasseB.

E nesse caso, o metodoX() da ClasseA jamais será alcançado, a menos que seja criado um objeto da ClasseA. Dizemos então que ocorreu uma SOBREPOSIÇÃO DE MÉTODO ou um POLIMORFISMO DE SOBREPOSIÇÃO. O métodoX da classeB sobrepôs (ou redefiniu) o método de sua classe mãe.

O polimorfismo de sobreposição em Java

Considere que a classe Brinquedo (usada no exercício anterior) possui como descendentes as classesCarro, Avião e Barco, conforme ilustra a Figura 5.

Page 121: POO Metropole Digital

ERROR: undefined

OFFENDING COMMAND: ‘~

STACK: