• Nenhum resultado encontrado

Apostila de Programação OO - SENAI.pdf

N/A
N/A
Protected

Academic year: 2021

Share "Apostila de Programação OO - SENAI.pdf"

Copied!
84
0
0

Texto

(1)
(2)

Curso Técnico em Informática

(3)

Robson Braga de Andrade

Presidente da Confederação Nacional da Indústria

Rafael Lucchesi

Diretor do Departamento Nacional do SENAI

Regina Maria de Fátima Torres

Diretora de Operações do Departamento Nacional do SENAI

Alcantaro Corrêa

Presidente da Federação da Indústria do Estado de Santa Catarina

Sérgio Roberto Arruda

Diretor Regional do SENAI/SC

Antônio José Carradore

Diretor de Educação e Tecnologia do SENAI/SC

Marco Antônio Dociatti

(4)

Confederação Nacional da Indústria

Serviço Nacional de Aprendizagem Industrial

Curso Técnico em Informática

Programação Orientada a Objetos I

Dieison Grumovski

Florianópolis/SC

2011

(5)

É proibida a reprodução total ou parcial deste material por qualquer meio ou sistema sem o prévio consentimento do editor.

Autor

Dieison Grumovski

Fotografias

Banco de Imagens SENAI/SC http://www.sxc.hu/

http://office.microsoft.com/en-us/ images/ http://www.morguefile.com/

http://www.bancodemidia.cni.org.br/

SENAI/SC — Serviço Nacional de Aprendizagem Industrial

Rodovia Admar Gonzaga, 2.765 – Itacorubi – Florianópolis/SC CEP: 88034-001

Fone: (48) 0800 48 12 12 www.sc.senai.br

(6)

Prefácio

Você faz parte da maior instituição de educação profissional do estado. Uma rede de Educação e Tecnologia, formada por 35 unidades conecta-das e estrategicamente instalaconecta-das em toconecta-das as regiões de Santa Catarina. No SENAI, o conhecimento a mais é realidade. A proximidade com as necessidades da indústria, a infraestrutura de primeira linha e as aulas teóricas, e realmente práticas, são a essência de um modelo de Educação por Competências que possibilita ao aluno adquirir conhecimentos, de-senvolver habilidade e garantir seu espaço no mercado de trabalho. Com acesso livre a uma eficiente estrutura laboratorial, com o que existe de mais moderno no mundo da tecnologia, você está construindo o seu futuro profissional em uma instituição que, desde 1954, se preocupa em oferecer um modelo de educação atual e de qualidade.

Estruturado com o objetivo de atualizar constantemente os métodos de ensino-aprendizagem da instituição, o Programa Educação em Movi-mento promove a discussão, a revisão e o aprimoraMovi-mento dos processos

de educação do SENAI. Buscando manter o alinhamento com as neces-sidades do mercado, ampliar as possibilidades do processo educacional, oferecer recursos didáticos de excelência e consolidar o modelo de Edu-cação por Competências, em todos os seus cursos.

É nesse contexto que este livro foi produzido e chega às suas mãos. Todos os materiais didáticos do SENAI Santa Catarina são produções colaborativas dos professores mais qualificados e experientes, e contam com ambiente virtual, mini-aulas e apresentações, muitas com anima-ções, tornando a aula mais interativa e atraente.

Mais de 1,6 milhões de alunos já escolheram o SENAI. Você faz parte deste universo. Seja bem-vindo e aproveite por completo a Indústria do Conhecimento.

(7)
(8)

Sumário

Conteúdo Formativo 9

Apresentação 11

12 Unidade de estudo 1

Introdução a

Programação

Orientada a Objeto

Seção 1 - Relação com o

mundo real

Seção 2 - Relação com o

mundo da programação

Seção 3 - Classes e objetos Seção 4 - Métodos e

atributos

26 Unidade de estudo 2

Acessibilidade

Seção 1 - Controle de acesso Seção 2 - Encapsulamento

36 Unidade de estudo 3

Construtores

Seção 1 - Construtores

42 Unidade de estudo 4

Sobrecarga de

Métodos

Seção 1 - Sobrecarga de métodos 13 14 15 20

46 Unidade de estudo 5

Pacotes, como

Organizar suas

Classes

Seção 1 - Pacotes, como

organizar suas classes

50 Unidade de estudo 6

Herança

Seção 1 - Reaproveitamento de código Seção 2 - Reescrita de métodos

56 Unidade de estudo 7

Polimorfismo

Seção 1 - Polimorfismo

60 Unidade de estudo 8

Agregação e

Composição

Seção 1 - Agregação e composição

64 Unidade de estudo 9

Classes Abstratas

Seção 1 - Classes Abstratas

68 Unidade de estudo 10

Interface

Seção 1 - Interface

72 Unidade de estudo 11

Programação

Concorrente

e Threads

Seção 1 - Programação concorrente e threads

Finalizando 79

Referências 81

27 31 37 43 47 51 54 57 61 65 69 73

(9)
(10)

Conteúdo Formativo

Carga horária da dedicação

Carga horária: 90 horas

Competências

Analisar e implementar os princípios da programação orientada a objetos para solução de problemas computacionais.

Conhecimentos

▪ Orientação a objetos: abstração, classes, objetos e instâncias. ▪ Comentários.

▪ Construtores. ▪ Encapsulamento. ▪ Herança.

▪ Interface de desenvolvimento (IDE). ▪ Métodos e atributos.

Habilidades

▪ Diferenciar programação orientada a objetos de programação estruturada. ▪ Aplicar os conceitos de orientação a objetos.

▪ Utilizar interface de desenvolvimento (IDE) de sistemas orientados a objetos.

Atitudes

▪ Organização e zelo na utilização de equipamentos. ▪ Foco no conteúdo trabalhado.

▪ Acesso a sítios relacionados ao tema trabalhado. ▪ Organização e limpeza dos ambientes coletivos.

▪ Dedicação e empenho nas atividades curriculares e extracurriculares. ▪ Capacidade de abstração.

▪ Trabalho em equipe.

▪ Apresentação de novas soluções para situações problemas. ▪ Cumprimento de prazos.

(11)
(12)

Apresentação

Bem-vindo à disciplina de Programação Orientada a Objetos I!

Você tem em mãos, um material que foi preparado para assessorar o aperfeiçoamento de seus conhecimentos como futuro profissional da indústria de Tecnologia da Informação (TI).

A disciplina de Programação Orientada a Objetos tem como principal objetivo prepará-lo para desenvolver sistemas com um novo paradigma de programação, mais fácil de entender, de manutenir e de desenvolver novas funcionalidades.

Para isso, a disciplina apresentará conceitos referentes à programação orientada a objeto, desde declarações simples de variáveis até a utilização de recursos mais complexos, como herança entre classes. Certamente, esse material irá ajudá-lo no desenvolvimento profissional, abordando um tema que é base para a maioria dos grandes sistemas desenvolvidos. Bons estudos!

Dieison Grumovski Dieison Grumovski é gradua-do em Ciência da Computação pela Universidade do Estado de Santa Catarina (UDESC) e pós--graduado em Engenharia da Produção pela Faculdade de Tecnologia Internacional (FA-TEC). Atua no SENAI em Join-ville como instrutor de cursos técnicos em informática, tendo atuado também como instrutor nos cursos de aprendizagem industrial. Ainda no SENAI tra-balhou como pesquisador de-senvolvendo um projeto com a tecnologia de identificação por radio frequência (RFID). Atual-mente, além das atividades de docência, atua como Analista de Sistemas, trabalhando com tec-nologia e inovação na área de Gerenciamento Eletrônico de Documentos (GED) e Gerencia-mento de Processos de Negócio (BPM) na empresa TOTVS S.A. em Joinville.

(13)

Unidade de

estudo 1

Seções de estudo

Seção 1 - Relação com o mundo real Seção 2 - Relação com o mundo da programação

Seção 3 - Classes e objetos Seção 4 - Métodos e atributos

(14)

Introdução a Programação

Orientada a Objeto

SEÇÃO 1

Relação com o mundo

real

Muita coisa mudou desde o início do desenvolvimento de software

para computadores, entre essas mudanças, estão as próprias lin-guagens utilizadas para o desen-volvimento desses sistemas. Nesse momento, vale lembrar da programação estruturada, desen-volvida nos anos 60 e que impul-sionou a criação de softwares mais

complexos, porém, não eram so-mente os sistemas desenvolvidos que podiam ser mais complexos, os projetos tornavam-se muito grandes e difíceis de serem en-tendidos e manutenidos, e, é cla-ro, que isso gerava, e ainda gera, altos custo para muitas empresas. Com o objetivo de solucionar esses problemas, a programação orientada a objeto foi criada e tida como resposta aos problemas en-contrados na programação estru-turada.

A programação orientada o ob-jeto, conhecida pelo termo POO, tem como uma de suas caracte-rísticas levar para o mundo vir-tual um pouco do mundo real, e representar os objetos que aqui existem. Essa representação é re-alizada por meio de classes e atri-butos, onde a classe representa o objeto em si, e os atributos as suas características.

Para entender melhor o conceito da orientação a objeto, observe como exemplo, um objeto do nosso dia a dia.

Figura 1: Ilustração de objetos Fonte: Locadora (2011)

Nenhum copo da imagem acima é igual ao outro, porém, todos são copos, logo, podemos dizer que todos fazem parte da mesma classe e possuem os mesmos atributos. Nesse caso, temos a classe copo e os seus atributos podem ser, altura, diâmetro da base, diâmetro do bocal, peso e volume.

No mundo real, os objetos interagem entre si, o copo precisa de uma mesa para se apoiar, o ser humano utiliza uma cadeira para sentar-se à mesa, e um copo para beber água. Na programação não é diferente, os objetos também interagem entre si, cada um tem um papel e oferece serviços, que são utilizados por outros objetos, e assim o sistema toma forma e se torna funcional.

Na próxima seção, você estudará sobre classes e objetos dentro do mun-do da programação.

(15)

SEÇÃO 2

Relação com o mundo

da programação

Já fizemos um estudo para enten-dermos o que são classes e obje-tos no mundo real, agora, é a vez de entender o que esses termos significam no mundo da infor-mática. Para facilitar, utilizaremos como exemplo para nosso estudo uma videolocadora, identificando algumas classes existentes e seus atributos, que se transformaram em objetos para realizar a troca de mensagens.

Quando você vai até a videoloca-dora com o simples objetivo de locar um filme, você imagina com quantas classes tem contato desde o momento que chega até o mo-mento em que sai com o filme em mãos? Não? Pois essa é uma boa prática para aprender a identificar classes de um sistema. Sabendo disso, vamos praticar!

O primeiro ponto é identificar tudo que se precisa para locar uma mídia em uma locadora. Observe:

Primeiro, define-se em qual videolocadora será realizada a locação

Definido isso, você se des-loca até o des-local e é convidado a fazer um cadastro para que a loja saiba onde você mora, e para que possa entrar em contato, caso seja necessário. Como você é um novo cliente, o atendente solici-tará algumas informações para fazer o cadastro, como alguns dados pessoais e endereço.

Após a realização do cadastro, você poderá se dirigir até a cate-goria de filmes do seu interesse e escolher um filme, que pode ser de qualquer tipo de mídia (DRD,

blue-ray ou outro).

como, nome, tempo de duração, ano de lançamento, categoria, diretor, número de atores, lugar onde foi filmado, tempo de du-ração para ser criado, valor gasto para o desenvolvimento do filme e tudo mais que possa representar uma informação referente a ele. Mas será que todos esses itens são mesmo necessários para o desen-volvimento do sistema? Claro que não. Para que o dono da locadora ou o próprio cliente precisariam saber quanto custou para criar o filme, no momento em que ele es-tiver sendo alugado? Essa é uma informação desnecessária, e, pen-sando dessa forma, a nossa clas-se Filme ficaria com os clas-seguintes atributos:

nome;

tempo de duração;

ano de lançamento;

categoria.

Essas quatro características faci-litam a busca do filme dentro da locadora e ainda permitem forne-cer aos clientes informações, que normalmente lhes interessam, como, o ano de lançamento e a duração do filme.

DICA

Aproveite e defina os atri-butos para cada classe que você identificou para o seu sistema de fábrica de carros e motos, resolvendo o exer-cício 2 do caderno de ativi-dades práticas.

Para fazermos uma descrição mais técnica das classes, podemos utili-zar a UML para representá-las. É importante lembrar que a UML (Unified Modeling Language) “é uma

linguagem utilizada para descre-Com base nessa análise, já é

possí-vel definir alguns itens como clas-ses obrigatórias do nosso sistema. Veja:

Locadora

Cliente

Endereço

Categoria

Filme

Mídia

Funcionário

DICA

Para facilitar o estudo e en-tendimento do material, será utilizado o exemplo da videolocadora. Nos exercí-cios, será empregado o de uma fábrica de carros e mo-tos. Esse processo vai facili-tar o seu desenvolvimento, pois você poderá utilizar os exemplos do material para desenvolver as atividades. E, agora que você entendeu como definir as classes do seu sistema, coloque em prática o conhecimento, re-alizando o exercício 1 do ca-derno de atividades práticas.

Após a identificação das classes, é necessário identificar também os seus atributos. Para isso, responda a pergunta: quais são as caracte-rísticas dessas classe? Ao mesmo tempo em que se responde a essa pergunta, é possível definir as ca-racterísticas necessárias para que o sistema seja desenvolvido. Fa-zendo isso, têm-se novas classes definidas e prontas.

Para entender melhor como res-ponder a essa pergunta, vamos analisar com calma a classe “Fil-me”, da nossa lista de classes. Pensando em um filme, podemos imaginar várias características, tais

(16)

ver, de forma gráfica e padroni-zada, sistemas desenvolvidos uti-lizando o conceito de orientação a objetos.” (BOOCH; RUMBAU-GH; JACOBSON, 2006)

Para fazer uma descrição mais téc-nica das classes utiliza-se a UML, por meio do diagrama de classes, que é representado por um re-tângulo dividido em três partes, onde a primeira indica a classe, a segunda os atributos e a terceira os métodos. Observe como fica a representação da classe Fil-me no diagrama de classe UML.

Figura 2: Diagrama de classe UML para a classe Filme

DICA

Teste o diagrama de classe, realizando o exercício 3 do caderno de atividades práti-cas.

Após você ter definido as classes e seus atributos, é a hora de passá--las para o computador em uma linguagem que a máquina enten-da. Para isso, utilizaremos a lin-guagem de programação Java, que é uma linguagem robusta, segura e multiplataforma, capaz de rodar em qualquer máquina, indepen-dente do sistema operacional.

SEÇÃO 3

Classes e objetos

Até agora, você aprendeu a definir as classes e seus atributos, tornan-do possível o desenvolvimento de um sistema para uma videolocatornan-dora. Agora, veja como criar essas classes, aplicando a linguagem de progra-mação Java, utilizada no desenvolvimento de sistemas orientados a obje-tos. Serão usadas as classes já definidas.

Você já sabe que uma classe é uma representação de um objeto. Agora, vamos repassar isso para o computador, para que por meio dessa classe, possamos entender e utilizar os objetos criados a partir dela. Para criar-mos uma classe, devecriar-mos seguir um padrão, que é o seguinte:

[modificadores de acesso] class NomedaClasse{}

Os modificadores de acesso (serão estudados na unidade de estudo se-guinte) não são obrigatórios. A palavra reservada class, identifica a clas-se, seguida por seu nome. Para identificar onde a classe começa e onde termina, utilizam-se as chaves. Elas definem o bloco da classe, que é onde os atributos serão colocados.

Sabendo isso, em Java, a classe filme definida anteriormente fica assim: class Filme { String nome; String categoria; int duracao; int anoLancamento; }

Seguindo um padrão mundialmente utilizado, sempre escrevemos nomes de classes com a letra inicial maiúscula e nomes de atributos com a letra inicial minúscula. Quando o nome de um atributo for com-posto por mais de uma palavra, com exceção da primeira, as demais palavras devem possuir a primeira letra maiúscula, como, o atributo anoLancamento, onde a letra “L” ficou maiúscula. Seguindo o padrão, também não é permitido o uso de acentos ou da “ç”.

O tipo String, utilizado para definir o nome e a categoria da classe Filme, é uma classe do Java. A String pode ser entendida como um vetor de caracte-res, ou seja, vários caracteres juntos, agrupados.

Como já temos a classe Filme definida no Java, a partir de agora, tudo será baseado em classes, e é por meio destas que os objetos serão criados.

(17)

DICA

Aproveite que você acabou de definir a classe Filmes, e realize o exer-cício 4 do caderno de atividades práticas.

Veja a seguir, a classe Locadora, que servirá apenas para utilizarmos os objetos criados a partir das classes que definimos anteriormente.

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); }

}

Perceba que, nesse exemplo, existe o método main. Os métodos serão estudados mais adiante, por enquanto, basta que você entenda que ele é o responsável por iniciar a execução de um programa Java.

Note que, no exemplo anterior, as classes e métodos são delimitados por chaves. Após o nome da classe e após o final do método, abre-se uma chave, e no final do exemplo fecham-se duas chaves, que indicam o fim do método main e da classe Locadora, respectivamente.

Como existem os tipos int, float, char, entre outros, todas as classes que criamos, se tornam tipos, e os atributos destes, podem receber objeto dessa classe.

No exemplo, criamos uma variável chamada filme01, que é do tipo Fil-me, e corresponde à classe FilFil-me, que criamos no início dessa seção. O responsável por criar o objeto é o “new”, para isso, basta utilizar essa

palavra reservada na frente do nome da classe que deseja criar o objeto, seguido de um abre e fecha parênteses (o significado dos parênteses estudaremos posteriormente). Dessa forma:

new Filme();

Pronto, já sabemos como criar um objeto do tipo Filme. Agora precisa-mos utilizá-lo, para isso, precisaprecisa-mos armazená-lo em uma variável. Foi por esse motivo que criamos a variável filme01 do tipo Filme. Dessa forma você armazena o objeto no atributo filme01. Veja

(18)

De posse do objeto filme01, você pode acessar os atributos da classe Filme. Entenda como isso é feito.

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); filme01.nome = “Avatar”;

filme01.categoria = “Ficção Científica”; filme01.anoLancamento = 2009; filme01.duracao = 166;

} }

Para acessar um atributo de um objeto, basta utilizar o ponto como opera-dor de acesso.

Observando o exemplo, é possível perceber que, por meio do ponto, são acessados todos os atributos da classe Filme e atribuídos valores a eles. Nesse momento, o nosso filme é o “Avatar” que pertence à categoria de ficção científica, lançado no ano de 2009, com duração de 166 minutos.

DICA

Antes de prosseguir, realize os exercícios 5 e 6 do caderno de ativi-dades práticas.

Em um sistema, pode-se criar quantos objetos forem necessários. No nosso exemplo, precisaremos criar vários, um para cada filme cadas-trado no sistema, por isso, basta utiliza a palavra reservada new várias vezes. Observe:

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); filme01.nome = “Avatar”;

filme01.categoria = “Ficção Científica”; filme01.anoLancamento = 2009; filme01.duracao = 166;

Filme filme02; filme02 = new Filme();

//acessar e setar valores aos atributos }

(19)

Nesse exemplo foram criados dois objetos – filme01 e filme02. Note que antes do texto “acessar e setar valores aos atributos”, foram inseri-das duas barras, isso para a linguagem de programação significa comen-tário, logo, o texto colocado foi apenas um comencomen-tário, que ainda faltam acessar e setar os valores dos atributos do objeto filme02.

Até o momento, estamos tratando os atributos do tipo Filme como sendo objetos,para facilitar o entendimento, mas saiba que os atribu-tos de tipos de classes não são objeatribu-tos, eles são uma referência para que o objeto possa ser acessado.

No exemplo a seguir, é correto dizer que o atributo filme01 do tipo Fil-me, possui uma referência para acessar o objeto. E isso ocorre em todo o Java, sempre teremos atributos referência, nunca objetos.

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); }

}

Para facilitar o entendimento, continuaremos chamando de objetos os atri-butos de referência.

Agora sabendo que os atributos guardam as referências para os objetos, vamos ver o que acontece na memória do computador para armazenar e acessar tais objetos. Observe a figura a seguir:

(20)

Nesse exemplo, os atributos do tipo Filme chamados filme01 e filme02, fazem referência a locais diferentes na memória, nesses locais estão ar-mazenados os objetos. Por isso, basta termos armazenado o endereço (referência) dos objetos nos atributos para poder encontrá-los, quando necessário.

Imagine agora se, por algum motivo, você precisasse atribuir um objeto ao outro, o que aconteceria? Analise o exemplo a seguir.

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); filme01.nome = “Avatar”;

filme01.categoria = “Ficção Científica”; filme01.anoLancamento = 2009; filme01.duracao = 166;

Filme filme02; filme02 = new Filme();

filme02.nome = “Quem quer ser um milionário”; filme02.categoria = “Drama”; filme02.anoLancamento = 2009; filme02.duracao = 121; filme01 = filme02; System.out.println(filme01.nome); } }

Lembrando que o comando System.out.println serve para imprimir um valor ou frase para o usuário, qual valor você imagina que será impresso? Avatar ou Quem quer ser um milionário?

Nesse caso a resposta é simples, o valor exibido será “Quem quer ser um milionário”.

Vamos ver na memória o que aconteceu após a execução desse progra-ma. Observando a figura a seguir, note que os dois atributos filme01 e filme02 estão fazendo referência para o mesmo lugar da memória, logo, um dos objetos foi perdido, não temos mais como recuperá-lo.

(21)

Figura 4: Referência dos objetos em memória após atribuição

Agora imagine, se fizermos alguma alteração em qualquer um dos obje-tos, o que irá acontecer? Observe o exemplo:

class Locadora {

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); filme01.nome = “Avatar”;

filme01.categoria = “Ficção Científica”; filme01.anoLancamento = 2009; filme01.duracao = 166;

Filme filme02; filme02 = new Filme();

filme02.nome = “Quem quer ser um milionário”; filme02.categoria = “Drama”; filme02.anoLancamento = 2009; filme02.duracao = 121; filme01 = filme02; filme02.categoria = “Ação”; System.out.println(filme01.categoria); } }

Nesse caso, alteramos a categoria do objeto filme02, e logo abaixo es-tamos imprimindo o valor da categoria do objeto filme01. O que será impresso para o usuário? Ficção científica, drama ou ação?

Na figura anterior, vimos que ao atribuir um atributo referência ao ou-tro, eles farão referência ao mesmo endereço de memória, ou seja, eles

sempre irão acessar o mesmo ob-jeto quando solicitados, portanto, tanto faz se alterarmos o objeto, utilizando o filme01 ou o filme02. O valor acessado por qualquer um deles sempre será igual, nesse caso o valor impresso será ação.

DICA

Faça o teste, realizando o exercício 7 do caderno de atividades práticas.

Na próxima seção, você apren-derá a criar e invocar métodos criados dentro de suas respectivas classes.

SEÇÃO 4

Métodos e atributos

Até o momento você aprendeu a definir uma classe e seus atri-butos, mas e agora? O que fazer com eles?

Dentro de cada classe é preci-so definir o que ela faz, ou seja, o seu comportamento. Definin-do as funções dentro da própria classe, fica fácil encontrar no pro-grama onde os procedimentos são realizados. Essas funções são chamadas de métodos, que são os responsáveis por realizar as ope-rações com os objetos.

Todo método possui uma assina-tura, que vai identificá-lo em todo o sistema. Essa assinatura é com-posta por quatro itens, modifica-dores de acesso, retorno, nome do método e seus parâmetros. Os modificadores de acesso serão es-tudados na unidade de estudo se-guinte. A estrutura dos métodos fica da seguinte forma:

(22)

[modificadores de acesso] retorno nomeDoMetodo(parametros);

Os modificadores de acesso não são obrigatórios. O número de parâme-tros não é limitado, podem ser utilizados quantos forem necessários, e caso não o sejam, o método pode não receber parâmetros.

Dentro da classe Locadora, que estamos utilizando como exemplo, po-demos criar um método para cadastrar um novo filme. Exemplo:

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); loca.cadastrarFilme();

}

void cadastrarFilme(){

Filme filme01; filme01 = new Filme(); filme01.nome = “Avatar”;

filme01.categoria = “Ficção Científica”; filme01.anoLancamento = 2009; filme01.duracao = 166;

} }

A palavra reservada void, utilizada antes do nome do método, significa que quando esse método for chamado, não retornará nada como resposta a quem o chamou.

Se lembrarmos da assinatura do método, fica fácil identificar que no método cadastrarFilme não temos controle de acesso, o retorno é void, pois, o nome do método é cadastrarFilme e não possui parâmetros. No exemplo anterior, além do método main, temos também o cadastrar-Filme, note que para acessar um método também é utilizado o operador ponto. Para que isso fosse possível, foi criado um objeto do tipo Loca-dora que foi utilizado para acessar o método cadastrarFilme. Com isso, podemos acessar o método quantas vezes desejar e criar vários filmes, sem precisar repetir o código responsável por setar o valor nos atributos do objeto.

Nesse momento entendemos uma das principais características da programação orientada a objetos, o reaproveitamento de código.

Os métodos ainda podem receber valores como parâmetros para realizar operações, da forma como fizemos no exemplo anterior, o método ca-dastrarFilme só poderia criar objetos do filme Avatar, mas com a passa-gem de parâmetro, podemos criar qualquer tipo de filme utilizando esse método. O exemplo a seguir mostra isso.

(23)

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166;

loca.cadastrarFilme(nome, categoria, anoLancamento, duracao); }

void cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao)

{

Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; } }

Note que dentro dos parênteses do método, estamos criando alguns atributos para receber valores de quem chama o método. Tais atributos chamamos de parâmetros. Com isso, quem define os valores para os atri-butos do objeto filme01, que está sendo criado, é quem chama o método e não o próprio método.

Além de receber parâmetros, os métodos podem retornar respostas a quem o chamou, isso ocorre sempre no final da execução do método. Para que você entenda melhor, vamos alterar o exemplo anterior para que o método cadastrarFilme, receba valores como parâmetros e retorne uma resposta.

(24)

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166;

boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao); if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

Nesse exemplo, incluímos antes do nome do método o tipo boolean, isso significa que o método cadastrarFilme agora retorna um valor do tipo boolean. Para que isso aconteça, no final do método foi incluída a expressão “return true;” que é a instrução responsável por enviar a quem chamou o método a resposta “true”, que é do tipo boolean defi-nida antes do nome do método.

Dentro do método main, onde chamamos o método cadastrarFilme, criamos um atributo do tipo boolean chamado, cadastrado para receber essa resposta. Para receber a resposta, basta atribuir ao atributo, a cha-mada do método, dessa forma:

Depois podemos utilizar essa resposta para imprimir uma mensagem para o usuário do sistema. Observando o exemplo anterior, podemos verificar a existência de uma condição como uso do “if ”, e logo após o comando System.out.println, que é o responsável por imprimir uma

(25)

if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

Tendo estudado o conceito de métodos, você vai entender agora que os locais onde são criados e, se atribuir valor ou não a um atributo faz diferença. Veja os exemplos e fique atento onde criar e setar valores aos seus atributos.

Atributo de instância: significa que o atributo tem seu valor

especifi-cado no objeto e não dentro da própria classe. Nesse caso, em geral, o atributo possui um valor diferente em cada objeto representante da classe.

Atributo de classe: significa que o atributo tem seu valor especificado

na própria classe e é comum a todos os objetos que ela representar. Atributos globais: são os atributos criados dentro do escopo da classe e são acessíveis em toda a classe, inclusive dentro de qualquer mé-todo dela. Tanto os atributos de instância, quanto os de classe, são também atributos globais.

Atributos locais: são atributos criados dentro de um método ou

blo-cos menores, como estruturas de repetição ou de condição, como for e if respectivamente. Elas só existem dentro daquele bloco, quando o ele acaba, os atributos locais deixam de existir.

Veja um exemplo com os tipos de atributos: class Locadora {

//Atributo de instância e global String nome;

//Atributo de classe e global

String endereço = “Av. 7 de setembro.”;

boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){ //Todos os atributos passados como parâmetros do método são locais (nome, categoria, anoLancamento, duração).

//A atributo filme01 é local Filme filme01;

filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

(26)

DICA

Agora, treine, realizando o exercício 8 do caderno de atividades prá-ticas.

Nessa unidade de estudos, você aprendeu a definir as classes e seus atri-butos, também aprendeu a criar e invocar métodos criados dentro de suas respectivas classes, e a definir o comportamento do cada classe. Na próxima unidade, você aprenderá a controlar o acesso e encapsular. Continue atento! Até lá.

(27)

Unidade de

estudo 2

Seções de estudo

Seção 1 - Controle de Acesso Seção 2 - Encapsulamento

(28)

Acessibilidade

SEÇÃO 1

Controle de acesso

Você já parou para pensar nos recursos que são utilizados para proteger você e a sua casa? Nor-malmente são colocadas cercas, muros altos, cães de guarda, alar-mes, grades nas janelas e portas, entre outros, e todos com o mes-mo objetivo: controlar o acesso e proteger. Na programação não é diferente, precisamos controlar o acesso às classes, atributos e seus métodos, e, para que isso seja pos-sível, utilizam-se os modificado-res de acesso.

Como você já viu na unidade de estudo anterior, os controladores de acesso fazem parte das assina-turas dos métodos, mas eles não são utilizados apenas em méto-dos, podem ser aplicados também a atributos e classes. Eles servem para proteger e restringir o acesso a determinadas partes do nosso sistema.

Imagine que você trabalha em uma empresa com muitos funcio-nários, e que a empresa trabalha com pesquisas científicas, e as descobertas só podem ser conhe-cidas por algumas pessoas. Uma das medidas tomadas para prote-ger essas informações, é bloque-ando o acesso a algumas salas, e autorizando o acesso de apenas algumas pessoas. Uma forma de fazer isso é com uso de senhas para abrir portas, essas senhas da-rão mais ou menos poder de aces-so aos funcionários.

Os modificadores de acesso tam-bém têm esse papel: bloquear o acesso a determinadas classes, métodos e/ou atributos do siste-ma, de forma que outras classes não tenham acesso a um con-teúdo proibido. Para entender melhor, vejamos quais são esses modificadores de acesso e como utilizá-los.

Os modificadores de acesso que você estudará são os seguintes: public, protected, private, friendly, abstract, static e final. A seguir é realizada uma explicação baseada no conceito apresentado por Dei-tel (2005) sobre cada um desses modificadores. Acompanhe.

Public: é o mais simples. Ele dá acesso irrestrito, permite que tudo seja acessado de qualquer parte do seu sistema. Qualquer classe, método e atributo, podem ser acessados de qualquer lugar do programa se fizer uso do mo-dificador de acesso public.

Protected: permite acesso à própria classe, às subclasses (clas-ses filhas) e às clas(clas-ses do mesmo pacote.

Private: é o modificador mais restritivo de todos, permite o acesso somente à própria classe, ou seja, os métodos e atributos só podem ser acessados de den-tro da classe, nenhuma outra tem acesso.

Friendly: é conhecido como default ou package. É o modifi-cador adotado quando não infor-mamos modificadores de acesso. Muitos pensam que quando não informamos, o padrão do Java é o public, mas não é verdade, o modificador de acesso default do Java é o friendly e permite o aces-so de todas as classes do mesmo pacote.

Abstract: definir, por exem-plo, um método como abstrato, significa dizer que esse método será desenvolvido nas subclas-ses, ou seja, na classe onde ele é definido como sendo abstract, vai apenas a assinatura do método. A sua implementação deve ser feita nas classes filhas. Para criar a assinatura de um método usando o abstract, a classe que contém essa assinatura também deve ser abstrata. Classes definidas como sendo abstratas, não podem ser instanciadas.

Static: esse modificador define um atributo como sendo da classe e não da instância da classe. Dessa forma, a cada novo objeto criado (nova instância), não será feita uma cópia desse atributo, ele será compartilhado por todas as instâncias da classe. Com isso, se uma instância realizar alguma al-teração no valor do atributo, essa mudança será aplicada a todas as demais.

(29)

Final: quando esse modificador é aplicado a um atributo, ele não pode ter seu valor alterado, tornando-se uma constante. Quando apli-cado a uma classe, esta não pode ser herdada, e quando apliapli-cado a um método, o método não pode ser redefinido.

Agora que você já conhece os principais modificadores de acesso, como podemos utilizá-los para proteger nosso sistema de locadora? Veja al-guns exemplos.

Na nossa classe Locadora, exemplificada a seguir, não estamos utilizan-do nenhum tipo de modificautilizan-dor de acesso, exceto no métoutilizan-do main, que é o método com a assinatura padrão utilizado pelo Java para dar início à execução do programa. Se quiséssemos que a classe Locadora e seus métodos fossem accessíveis de qualquer lugar do sistema, qual modifica-dor de acesso deveríamos utilizar? Acertou, se você respondeu public.

class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166; boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao); if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

Para torná-la toda pública, é necessário acrescentar a palavra public em dois locais: no início da classe e antes do retorno do método. Fazendo essas mudanças, nosso exemplo ficaria da seguinte forma.

(30)

public class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166;

boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

Sabendo onde aplicar os modifi-cadores, fica fácil utilizar os de-mais. Nos locais onde colocamos a palavra public, basta substituir pelo modificador necessário, po-dendo ser protected, private ou abstract. Os modificadores static e final são utilizados em conjun-to com os demais. Para entender melhor essa utilização conjunta, vamos utilizar a nossa classe Fil-me para exemplificar. class Filme { String nome; String categoria; int duracao; int anoLancamento; }

Na classe Filme apresentada, não temos uso de nenhum modificador de acesso. Imagine que queremos tornar essa classe pública, porém, seus atributos devem ser protegidos de qualquer outra classe do sistema, e

outro diferencial, o ano do filme deve ser compartilhado por todas as

instâncias dessa classe.

Para fazer isso tudo, precisamos em primeiro lugar tornar a classe públi-ca, e, para isso, basta incluir a palavra public no início da classe, depois, precisamos tornar os atributos protegidos de todas as outras classes do sistema, para isso basta incluir a palavra private antes da declaração de todos os atributos e por último, tornar o ano de lançamento do filme compartilhado por todas as instâncias, incluindo o modificador de aces-so static antes do private.

Fazendo todas essas mudanças corretamente, teremos como resultado a classe Filme da seguinte forma:

public class Filme{

private String nome; private String categoria; private int duracao;

private static int anoLancamento;

(31)

Com o uso do modificador static no atributo anoLançamento, todas as instâncias da classe filme terão o mesmo valor sempre para esse atributo. Exemplo:

public class Filme{

private String nome; private String categoria; private int duracao;

private static int anoLancamento; public void testeFilme(){

Filme filme01 = new Filme(); Filme filme02 = new Filme();

filme01.anoLancamento = 2011; filme02.anoLancamento = 2010;

System.out.println(“Ano de lançamento = “ + filme01.anoLancamento); System.out.println(“Ano de lançamento = “ + filme02.anoLancamento); }

}

No exemplo anterior, temos na classe Filme um método de teste chama-do testeFilme(), que está senchama-do utilizachama-do apenas para demonstrar o uso do modificador de acesso. Esse método cria dois objetos, ou seja, duas instâncias da classe Filme. Após criar os objetos serão atribuídos valores ao atributo anoLancamento de ambos os objetos. Logo após é impresso o valor de ambos os atributos dos objetos.

Você sabe quais valores serão impressos? Lembrando que o atributo em questão utiliza o modificador static, você está certo se responder que em ambas as frases impressas aparecerá o ano de 2010.

E você sabe por que isso ocorreu? Porque o conceito de static é de que o atributo é compartilhado por todas as instâncias da classe, isto é, se uma instância tem o valor 2010, todas as outras também o terão, com isso sempre o último valor atribuído ao atributo será utilizado por todas as instâncias.

Foi preciso criar um método de teste dentro da própria classe Filme, para que pudéssemos acessar os atributos dela, isso foi necessário devi-do ao fato de que todevi-dos foram declaradevi-dos como private, e por isso só podem ser acessados de dentro da própria classe.

Da mesma forma que o modificador static é utilizado em conjunto com outros modificadores, o modificador final também deve ser utilizado em conjunto. Confira um exemplo de uso do modificador final.

public class Filme{

private String nome; private String categoria; private int duracao;

private final int anoLancamento = 2011;

(32)

O uso do modificador final obriga que um valor seja atribuído ao atri-buto no momento da criação, por isso precisamos criá-lo e conferir-lhe o valor 2011. Feito isso, esse atributo não poderá mais ser alterado, sempre vai valer 2011.

E o que acontece se tentarmos atribuir valor a um atributo do tipo final como mostrado a seguir?

filme01.anoLancamento = 2011; filme02.anoLancamento = 2010;

Se você respondeu que irá gerar um erro no momento de compilar o programa, você acertou. O compilador Java vai identificar que uma ope-ração incorreta está tentando ser executada e irá gerar um erro, não sen-do possível executar o programa.

Após termos estudado os modificadores de acesso, veremos outra for-ma de tornar nosso sistefor-ma for-mais acessível e seguro, sem esquecer os modificadores de acesso.

DICA

Antes de estudar o encapsulamento, realize os exercícios 9, 10 e 11 do caderno de atividades práticas.

SEÇÃO 2

Encapsulamento

O objetivo de se utilizar o encapsulamento, no desenvolvimento de sis-temas, é agrupar as funcionalidades referentes a um objeto em um único lugar, garantindo a segurança no acesso às informações, facilitando a busca dos programadores por métodos dentro do sistema, seja para con-sultar ou para realizar manutenções.

Imagine que você precisa alterar o método onde é realizado o cadastro de filmes, em qual classe você procuraria? Se não existisse o encapsu-lamento você poderia ficar perdido, e poderiam existir vários locais no seu sistema que realizam essa operação, mas com o encapsulamento o cadastro de filmes é feito por uma única classe, a Locadora, onde o fun-cionário da locadora é que realiza o cadastro de todos os filmes. É por isso que esse método foi colocado na classe Filme.

A ideia do encapsulamento é também fechar o nosso sistema, de forma que quem for utilizar os métodos e atributos saiba para que eles ser-vem, e não o que eles fazem ou o que é feito com eles internamente.

(33)

Imagine que você irá fazer um cadastro de um novo filme, você precisa saber o que o método de cadastro faz internamente? Não. Você só precisa saber que ele vai fazer o cadastro e não como ele faz.

Dessa forma nosso sistema fica mais organizado e com isso mais fácil de entender. Se algum dia outro programador que não participou desde o início do desenvolvimento do sistema precisar realizar uma modificação em algum método, ele não terá tanta dificuldade para encontrar e manu-tenir as funcionalidades do sistema.

Para auxiliar na questão do acesso aos atributos, é comum na orientação a objeto a criação de métodos get e set. Esses métodos são utilizados para dar acesso a atributos declarados como private.

Você deve pensar sempre em dar acesso e não retirar acesso aos atri-butos. O que isso quer dizer? Como padrão crie sempre os atributos das classes como private, assim ninguém vai conseguir acessá-los de fora da classe. Caso você queira permitir o acesso a algum desses atri-butos, utilize os métodos set e get.

Mas o que são métodos set e get?

Os métodos set e get são responsáveis por colocar valor em um atributo ou recuperar o valor de um atributo respectivamente.

Defini-se, que por padrão, sempre se criará os atributos de classes como sendo privados. Portanto, a nossa classe Filme fica assim:

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento;

}

Dessa forma ninguém terá acesso aos atributos dessa classe a não ser ela mesma. Agora você concorda que assim, a classe Filme, não terá utilida-de alguma, pois é a classe Locadora que fazia uso utilida-desses atributos, e com eles declarados como private, ela não terá mais acesso.

É em situações como esta que entra o uso dos métodos get e set. De-vemos criar os métodos de acordo com a necessidade do sistema, para liberar o acesso necessário aos atributos.

Não é obrigatória a criação dos dois métodos, set e get, eles devem ser criados de acordo com a necessidade do sistema.

(34)

No nosso exemplo, necessitamos liberar o acesso a todos os atributos, logo, precisamos criar os métodos get e set para todos os atributos. Fa-zendo isso, a classe Filme ficará assim:

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public String getNome() {

return nome; }

public void setNome(String nome) {

this.nome = nome; }

public String getCategoria() {

return categoria; }

public void setCategoria(String categoria) {

this.categoria = categoria; }

public int getDuracao() {

return duracao; }

public void setDuracao(int duracao) {

this.duracao = duracao; }

public int getAnoLancamento() {

return anoLancamento; }

public void setAnoLancamento(int anoLancamento) {

this.anoLancamento = anoLancamento; }

}

Observando os métodos set e get, identificamos um padrão para o nome

dos métodos, utilizando sempre o set ou get seguido do nome do atribu-to com letra maiúscula. Para o atribuatribu-to nome os méatribu-todos ficam assim:

public String getNome() { return nome;

}

public void setNome(String nome) { this.nome = nome;

}

Observe que o método getNome é responsável por retornar o valor do atributo nome, enquanto que o setNome recebe como parâmetro um valor para ser salvo no atributo nome, e essas são as suas funções, retor-nar e salvar um valor em um determinado atributo.

(35)

No método setNome você pode observar o uso de um novo operador, o this, que é utilizado para indicar que estamos acessando o atributo

da classe e não o atributo que está sendo passado como parâmetro no método, pois ambos têm o mesmo nome.

A palavra chave “this” é utilizada para indicar que estamos acessando o atri-buto ou método da classe em que estamos trabalhando.

O uso do this não é obrigatório, porém é altamente recomendado, pois facilita a leitura do código fonte pelos programadores. Para retirá-lo do método set.nome é preciso trocar o nome do atributo que está sendo passado como parâmetro. Confira o exemplo:

public void setNome(String param) {

nome = param; }

Com o uso dos métodos set e get, você pode controlar se outras classes terão acesso aos atributos ou não. Se você pretender dar acesso apenas a gravação de dados nos atributos, basta criar apenas o método set na sua classe. Porém, se você quer permitir que outras classes apenas recupe-rem o valor dos atributos, basta criar na sua classe o método get. Agora, com os métodos set e get criados e entendidos, temos que alterar também a forma de acessar os atributos. Não é mais possível acessá-los diretamente como estávamos fazendo até agora, daqui em diante tere-mos que chamar os métodos set e get, como tere-mostra o exemplo a seguir: public class Locadora{

public static void main(String[] args) {

Filme filme01; filme01 = new Filme(); //salvando informações filme01.setNome(“Avatar”); filme01.setCategoria(“Ficção Científica”); filme01.setAnoLancamento(2009); filme01.setDuracao(166); //pegando informações System.out.println(“Nome: “ + filme01.getNome()); System.out.println(“Categoria: “ + filme01.getCategoria());

System.out.println(“Ano de lançamento: “ + filme01.getAnoLancamento()); System.out.println(“Duração: “ + filme01.getDuracao());

} }

(36)

DICA

Realize os exercícios do 12 ao 15 do caderno de atividades práticas e perceba que com o uso dos modificadores de acesso, em conjunto com a criação dos métodos set e get, têm-se classes muito mais se-guras e organizadas.

Agora que você já sabe criar os controles de acesso e encapsular, está pronto para aprender o porquê de criar dessa maneira. Então, prepare-se e bom estudo!

(37)

Unidade de

estudo 3

Seções de estudo

(38)

Construtores

SEÇÃO 1

Construtores

Se você observar a criação de um objeto, perceberá algo parecido com a chamada de um método, veja no exemplo a classe Locadora:

public class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166;boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao); if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

Note que no método main criamos um objeto do tipo Locadora e no método cadastrarFilme criamos um objeto do tipo Filme. A criação é realizada com o uso do new, a expressão que representa o objeto é a seguinte:

new Filme();

Sempre se utiliza o nome da classe seguido de abre e fecha parênteses. Você sabe por que é feito isso? É como se fosse chamado um método Filme, pois toda chamada de método, também abre e fecha parênteses.

(39)

Realmente, sempre que se utiliza o new é criado um novo objeto, e para criar esse objeto é necessário chamar o método construtor da classe que se deseja criar.

“Um método construtor nada mais é do que um método com o mesmo nome da classe, exatamente o mesmo nome, obedecendo inclusive as letras maiúsculas e minúsculas” (DEITEL, 2005, p. 68). Veja o exemplo de como ficaria a classe Filme com o método construtor:

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(){

System.out.println(“Filme Criado!”); }

// métodos set e get }

Observando o exemplo você pode pensar que, como não tínhamos os métodos construtores estávamos fazendo errado, mas não estávamos. Mesmo sem serem criadas, todas as classes possuem, por definição, um método construtor vazio. Assim:

Filme(){ }

Por isso, mesmo que você não crie o método construtor dentro da clas-se, acredite, ele esta lá!

Agora você pode ter ficado com outra dúvida: se o Java cria como pa-drão um método construtor para todas as classes, por que você precisa criá-los?

Sempre que se cria um método construtor para uma classe, o método construtor default deixa de ser utilizado, logo o seu método construtor se torna o principal da classe. Imagine que antes de tudo, o seu método será chamado e você poderá fazer qualquer operação nesse momento, você pode iniciar atributos, fazer chamadas a outros métodos, enfim, definir como seu objeto será criado.

No exemplo a seguir, foi criado um método construtor que, antes de criar o objeto do tipo Filme, inicializa o atributo nome com um valor qualquer. Veja:

(40)

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(){

this.nome = “Avatar”; }

// métodos set e get }

Fazendo isso, sempre que um objeto do tipo filme for criado, ele já será criado com o nome Avatar. Fazendo dessa forma, não fica muito usual, uma vez que não existeapenas o filme Avatar, mas sim vários filmes que serão cadastrados. Então que outra forma de setar valor para esse atributo pode ser usada?

O método construtor aceita a passagem de parâmetros. Observe o exemplo:

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(String nome){

this.nome = nome; }

// métodos set e get }

Nesse caso, podemos garantir que sempre que um objeto do tipo filme for criado, ele possuirá um nome, pois isso é feito no seu construtor, e se um nome não for passado a ele, o objeto não será criado.

A forma de criar esse objeto agora mudou um pouco, devido a passagem do parâmetro, na nossa classe Locadora a criação do objeto Filme fica conforme o exemplo a seguir:

(41)

public class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”; int anoLancamento = 2009;

int duracao = 166;

boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao); if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme(nome); filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; } }

Observe que nosso método main não foi alterado, apenas o método ca-dastrarFilme sofreu alterações. A criação do objeto Filme agora recebeu um parâmetro, correspondente ao nome do Filme e não é mais necessá-rio setar valor para o atributo nome da classe Filme, uma vez que agora isso é feito dentro do método construtor.

Apesar de ser chamado de método construtor, ele não é um simples método. Pode-se dizer que é um método especial, pois não pode pos-suir retorno e só pode ser chamado no momento de criação de um objeto.

Uma classe pode ter quantos métodos forem necessários para sua utili-zação, e não é diferente para métodos construtores, que permitem mais de um método construtor em uma mesma classe. Veja o exemplo:

(42)

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(String nome){

this.nome = nome; }

public Filme(String nome, String categoria){

this.nome = nome; this.categoria = categoria;

}

// métodos set e get }

Nesse caso criamos dois métodos construtores, onde um recebe ape-nas o nome do filme como parâmetro, e o segundo recebe o nome e a categoria. Dependendo da necessidade, pode-se utilizar um ou outro para criar nossos objetos do tipo Filme e, para utilizá-los basta fazer da seguinte forma:

Filme filme01 = new Filme(nome);

ou

Filme filme01 = new Filme(nome, categoria);

É possível também chamar um construtor de dentro de outro, lembran-do lembran-do conceito lembran-do métolembran-do construtor que diz que ele só pode ser cha-mado durante a criação do objeto, e, como está sendo criado dentro de outro método construtor então pode ser chamado de dentro deste. Observe o exemplo.

public class Filme{

private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(String nome){

this.nome = nome; }

public Filme(String nome, String categoria){

// Chamada do primeiro método construtor

this(nome);

this.categoria = categoria;

}

// métodos set e get }

Os métodos construtores são muito importantes, pois com eles é possível controlar e definir como um objeto será criado, e se será realizada alguma operação no momento de sua criação.

DICA

Os exercícios 16, 17 e 18 do caderno de atividades prá-ticas são sobre os métodos construtores. Que tal resol-vê-los e testar o que acabou de aprender?

Você viu que é possível criar mé-todos com o mesmo nome em uma mesma classe, utilizando os métodos construtores, que pos-suem o mesmo nome e podem ser criados mais de um na mesma classe. Na próxima unidade de es-tudos você estudará as sobrecar-gas de métodos. Até lá!

(43)

Unidade de

estudo 4

Seções de estudo

(44)

Sobrecarga de Métodos

SEÇÃO 1

Sobrecarga de métodos

O fato de criarmos métodos com o mesmo nome em uma mesma classe é chamado de sobrecarga de métodos, ou ainda de overloading.

O que não pode existir em uma mesma classe, são métodos com assina-turas iguais. O que isso quer dizer? Quer dizer que não se pode ter dois métodos com o mesmo nome, e com os mesmos tipos e números de parâmetros. Observe o diagrama a seguir para entender melhor o con-ceito de sobrecarga.

Figura 5: Diagrama de classe UML com sobrecarga de métodos

Nesse diagrama apresentado pode-se entender melhor esse conceito de sobrecarga. Há três métodos, todos com o mesmo nome, porém, com algumas sobrecargas: os tipos dos parâmetros entre o primeiro e o segundo método e a quantidade de parâmetros passados no quarto método.

A sobrecarga de métodos cadastrarFilme ficaria da seguinte forma se desenvolvido na linguagem Java:

(45)

public class Locadora {

public static void main(String[] args) {

Locadora loca = new Locadora(); String nome = “Avatar”;

String categoria = “Ficção Científica”;

int anoLancamento = 2009;

int duracao = 166; boolean cadastrado;

cadastrado = loca.cadastrarFilme(nome, categoria, anoLancamento, duracao);

if(cadastrado == true){

System.out.print(“Filme cadastrado com sucesso.”); }

}

public boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){

Filme filme01;

filme01 = new Filme(nome); filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; }

public boolean cadastrarFilme(String nome, String categoria, String anoLancamento, String

du-racao){

//implementação do método }

public boolean cadastrarFilme(String nome){

//implementação do método }

}

DICA

Como os métodos terão o mesmo nome e, provavelmente, serão utilizados para realização de tarefas semelhantes, é importante es-colher um nome mais apropriado que identifique todas as tarefas de modo a não gerar confusão no momento de sua utilização.

E como saber qual método está sendo chamando no momento da exe-cução quando há nomes repetidos?

Você não precisa se preocupar com isso pois, quem define, é o compila-dor, levando em consideração as diferenças dos métodos para utilizá-los de acordo com suas características, por exemplo:

(46)

Nesse caso, temos os quatro parâmetros como sendo do tipo String. O compilador identificou e utilizou o segundo método criado na classe Locadora, que é o que recebe como parâmetro os quatro parâmetros do tipo String.

Você sabe que método da classe locadora seria chamado se, ao invés do exemplo anterior, fosse feito da seguinte maneira?

boolean retorno = cadastrarFilme(“Avatar”);

Neste caso seria chamado o último método, pois, ele é o único que rece-be apenas um parâmetro.

Tenha bastante cuidado ao fazer sobrecarga com o mesmo número de parâ-metros, pois o compilador diferencia o tipo dos parâparâ-metros, e não o nome deles.

O exemplo a seguir não caracteriza uma sobrecarga.

public boolean cadastrarFilme(String nome, String categoria, String anoLancamento, String duracao){

//implementação do método }

public boolean cadastrarFilme(String nome, String categoria, String ano, String tempo){

//implementação do método }

Nesse exemplo apresentado, foram alterados os nomes de dois parâ-metros, de anoLancamento para ano, e de duração para tempo. Essa mudança não caracteriza uma sobrecarga, e o seu programa não irá fun-cionar, pois existem dois métodos exatamente iguais, e isso não é per-mitido.

DICA

Utilizando o caso da fábrica de carros e motos, teste a sobrecarga, realizando os exercícios 19 e 20 do caderno de atividade práticas.

Na próxima unidade de estudos você aprenderá como organizar as suas classes por meio de pacotes. Prepare-se!

(47)

Unidade de

estudo 5

Seções de estudo

Seção 1 - Pacotes, como organizar suas classes

(48)

Pacotes, como Organizar

suas Classes

SEÇÃO 1

Pacotes, como organizar

suas classes

Para falar dos pacotes em Java, vamos fazer uma analogia com as pastas que você cria costumei-ramente no sistema operacional. Imagine que você possua apenas uma pasta em todo seu compu-tador, como você faria para or-ganizar suas coisas? Certamente colocaria suas músicas em uma pasta, seus trabalho da disciplina de POO em outra pasta, e assim por diante.

Agora, imagine se essa separa-ção de pastas não fosse possível e tudo tivesse que ficar em um mesmo lugar, tudo misturado. Se-ria horrível, não é mesmo? Ainda bem que podemos organizar tudo em diretórios, fica muito mais fácil encontrar os documentos. Agora pense na seguinte situação: você e alguns amigos foram fazer um passeio e tiraram várias fotos com a sua câmera digital, e agora todos os seus amigos estão pedin-do uma cópia dessas fotos. Você pode simplesmente copiar a pas-ta de uma só vez e repassá-la aos seus amigos – o que é muito fácil – ou você pode ficar procurando as fotos em meio a outros docu-mentos e copiar, foto por foto, com o risco de esquecer alguma pelo caminho.

Na programação isso não é diferente. Não vamos criar todas as nossas classes dentro de um único diretório, mas sim, dividi-las de acordo com suas funcionalidades e necessidades do projeto.

Os diretórios dentro da programação são chamados de pacotes, ou

package. Imagine que temos uma classe salva dentro do seguinte

dire-tório no sistema operacional:

\br\com\poo\locadora

Isso significa que nossa classe está dentro do seguinte package:

br.com.poo.locadora

Observe que na estrutura de diretórios do sistema operacional, os no-mes das pastas são separados por barras “\”, e os packages são divididos por pontos “.”. Da mesma formaque existem padrões, no momento de criar nomes de classes, métodos e variáveis, existe um padrão para cria-ção de pacotes, nesse caso, todos os pacotes devem ser escritos apenas com letras minúsculas, independente se os nomes são compostos por mais de uma palavra.

Deve-se referenciar o pacote, onde a classe está gravada e no início des-ta, informando sempre a palavra package seguida do caminho completo do pacote. Para entender melhor, veja esse exemplo: imagine que a classe Pessoa encontrasse dentro do pacote “br.com.poo.entidade”. Tal classe ficaria assim:

(49)

package br.com.poo.entidade.Pessoa; public class Pessoa {

private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo;

//implementação dos métodos }

Dentro de um mesmo pacote, podem estar quantas classes forem neces-sárias, e todas têm acesso direto umas as outras - é o que estava sendo feito até o momento - pois todas estavam em um mesmo pacote. Se quiséssemos acessar a classe Pessoa, de dentro da classe Locadora, imaginando que nesse momento elas estão no mesmo pacote, poderí-amos fazer um acesso direto por meio de “Pessoa pessoa = new

Pes-soa();”. Confira:

package br.com.poo.entidade.Locadora; public class Locadora{

public static void main(String[] args) {

Pessoa pessoa = new Pessoa();

pessoa.getEndereco().setBairro(“Bom Retiro”); pessoa.getEndereco().setCep(“89222-365”); //...

} }

Imagine que colocamos a classe Locadora dentro do pacote br.com.poo. locadora. Como fazer para acessar a classe Pessoa de dentro da classe Locadora? Como elas estão em pacotes diferentes, não há mais o acesso direto entre as classes, como fazer para acessar as classes que não estão no mesmo pacote?

Para que funcione corretamente, pode-se informar o caminho completo do pacote da classe que se quer acessar, fazendo da seguinte forma:

br.com.poo.entidade.Pessoa pessoa = new br.com.poo.entidade.Pessoa();

Fazendo dessa forma, não fica nem um pouco elegante o código fonte, e toda vez que se quiser fazer referência à classe Pessoa, seria necessário escrever o caminho completo. Nada prático, não acha?

Referências

Documentos relacionados

As crianças com hipertrofia obstrutiva têm doseamentos de IgA sérica mais baixos que aquelas com infecções de repetição, mas dentro dos valores normais para a idade, não se

- Se o estagiário, ou alguém com contacto direto, tiver sintomas sugestivos de infeção respiratória (febre, tosse, expetoração e/ou falta de ar) NÃO DEVE frequentar

A despeito do compromisso firmado, entendeu o Tribunal de origem pela possibilidade de qualquer das partes recorrer ao Poder Judiciário, independentemente do

Controlador de alto nível (por ex.: PLC) Cabo da válvula Tubo de alimentação do ar de 4 mm Pr essão do fluido Regulador de pressão de precisão Regulador de pressão de

8.1 - O arrematante terá o prazo máximo de 05 (cinco) dias úteis, contados da data do Leilão Público, para comparecer à Agência contratante, especificada na Proposta do

Compreendendo- se que o estudo dos eventos do século XX podem ser relevantes e esclarecedores para a compreensão da história e da sociedade de hoje, e levando-se em conta o

• Para a realização de obras em planos horizontais ou verticais ou obras com uma inclinação em uma ou duas direções • Desempenho em obras com visível laser vermelho (NL400)

Os achados dos estudos indicam que a analgesia preemptiva é uma das maneiras mais confortáveis de tratamento para dor pós-operatória, estendendo-se também para o