Apostila de Programação OO - SENAI.pdf

84

Transcript of Apostila de Programação OO - SENAI.pdf

  • Curso Tcnico em Informtica

    Programao Orientada a Objetos I

  • Robson Braga de AndradePresidente da Confederao Nacional da Indstria

    Rafael LucchesiDiretor do Departamento Nacional do SENAI

    Regina Maria de Ftima TorresDiretora de Operaes do Departamento Nacional do SENAI

    Alcantaro CorraPresidente da Federao da Indstria do Estado de Santa Catarina

    Srgio Roberto ArrudaDiretor Regional do SENAI/SC

    Antnio Jos CarradoreDiretor de Educao e Tecnologia do SENAI/SC

    Marco Antnio DociattiDiretor de Desenvolvimento Organizacional do SENAI/SC

  • Confederao Nacional da Indstria

    Servio Nacional de Aprendizagem Industrial

    Curso Tcnico em Informtica

    Programao Orientada a Objetos I

    Dieison Grumovski

    Florianpolis/SC2011

  • proibida a reproduo total ou parcial deste material por qualquer meio ou sistema sem o prvio consentimento do editor.

    AutorDieison Grumovski

    FotografiasBanco de Imagens SENAI/SChttp://www.sxc.hu/http://office.microsoft.com/en-us/ images/http://www.morguefile.com/http://www.bancodemidia.cni.org.br/

    SENAI/SC Servio Nacional de Aprendizagem IndustrialRodovia Admar Gonzaga, 2.765 Itacorubi Florianpolis/SCCEP: 88034-001Fone: (48) 0800 48 12 12www.sc.senai.br

  • Prefcio

    Voc faz parte da maior instituio de educao profissional do estado. Uma rede de Educao e Tecnologia, formada por 35 unidades conecta-das e estrategicamente instaladas em todas as regies de Santa Catarina.

    No SENAI, o conhecimento a mais realidade. A proximidade com as necessidades da indstria, a infraestrutura de primeira linha e as aulas tericas, e realmente prticas, so a essncia de um modelo de Educao por Competncias que possibilita ao aluno adquirir conhecimentos, de-senvolver habilidade e garantir seu espao 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 instituio que, desde 1954, se preocupa em oferecer um modelo de educao atual e de qualidade.

    Estruturado com o objetivo de atualizar constantemente os mtodos de ensino-aprendizagem da instituio, o Programa Educao em Movi-mento promove a discusso, a reviso e o aprimoramento dos processos de educao do SENAI. Buscando manter o alinhamento com as neces-sidades do mercado, ampliar as possibilidades do processo educacional, oferecer recursos didticos de excelncia e consolidar o modelo de Edu-cao por Competncias, em todos os seus cursos.

    nesse contexto que este livro foi produzido e chega s suas mos. Todos os materiais didticos do SENAI Santa Catarina so produes colaborativas dos professores mais qualificados e experientes, e contam com ambiente virtual, mini-aulas e apresentaes, muitas com anima-es, tornando a aula mais interativa e atraente.

    Mais de 1,6 milhes de alunos j escolheram o SENAI. Voc faz parte deste universo. Seja bem-vindo e aproveite por completo a Indstria do Conhecimento.

  • Sumrio

    Contedo Formativo 9

    Apresentao 11

    12 Unidade de estudo 1

    Introduo a Programao Orientada a Objeto

    Seo 1 - Relao com o mundo real

    Seo 2 - Relao com o mundo da programao

    Seo 3 - Classes e objetos

    Seo 4 - Mtodos e atributos

    26 Unidade de estudo 2

    Acessibilidade

    Seo 1 - Controle de acesso

    Seo 2 - Encapsulamento

    36 Unidade de estudo 3

    Construtores

    Seo 1 - Construtores

    42 Unidade de estudo 4

    Sobrecarga de Mtodos

    Seo 1 - Sobrecarga de mtodos

    13

    14

    15

    20

    46 Unidade de estudo 5

    Pacotes, como Organizar suas Classes

    Seo 1 - Pacotes, como organizar suas classes

    50 Unidade de estudo 6

    Herana

    Seo 1 - Reaproveitamento de cdigo

    Seo 2 - Reescrita de mtodos

    56 Unidade de estudo 7

    Polimorfismo

    Seo 1 - Polimorfismo

    60 Unidade de estudo 8

    Agregao e Composio

    Seo 1 - Agregao e composio

    64 Unidade de estudo 9

    Classes Abstratas

    Seo 1 - Classes Abstratas

    68 Unidade de estudo 10

    Interface

    Seo 1 - Interface

    72 Unidade de estudo 11

    Programao Concorrente e Threads

    Seo 1 - Programao

    concorrente e threads

    Finalizando 79

    Referncias 81

    27

    31

    37

    43

    47

    51

    54

    57

    61

    65

    69

    73

  • 8 CURSOS TCNICOS SENAI

  • Contedo Formativo

    9PROGRAMAO ORIENTADA A OBJETOS I

    Carga horria da dedicao

    Carga horria: 90 horas

    Competncias

    Analisar e implementar os princpios da programao orientada a objetos para soluo de problemas computacionais.

    Conhecimentos

    Orientao a objetos: abstrao, classes, objetos e instncias.

    Comentrios.

    Construtores.

    Encapsulamento.

    Herana.

    Interface de desenvolvimento (IDE).

    Mtodos e atributos.

    Habilidades

    Diferenciar programao orientada a objetos de programao estruturada.

    Aplicar os conceitos de orientao a objetos.

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

    Atitudes

    Organizao e zelo na utilizao de equipamentos.

    Foco no contedo trabalhado.

    Acesso a stios relacionados ao tema trabalhado.

    Organizao e limpeza dos ambientes coletivos.

    Dedicao e empenho nas atividades curriculares e extracurriculares.

    Capacidade de abstrao.

    Trabalho em equipe.

    Apresentao de novas solues para situaes problemas.

    Cumprimento de prazos.

    Anlise crtica de suas produes.

  • Apresentao

    PROGRAMAO ORIENTADA A OBJETOS I

    Bem-vindo disciplina de Programao Orientada a Objetos I!

    Voc tem em mos, um material que foi preparado para assessorar o aperfeioamento de seus conhecimentos como futuro profissional da indstria de Tecnologia da Informao (TI).

    A disciplina de Programao Orientada a Objetos tem como principal objetivo prepar-lo para desenvolver sistemas com um novo paradigma de programao, mais fcil de entender, de manutenir e de desenvolver novas funcionalidades.

    Para isso, a disciplina apresentar conceitos referentes programao orientada a objeto, desde declaraes simples de variveis at a utilizao de recursos mais complexos, como herana 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 Cincia da Computao pela Universidade do Estado de Santa Catarina (UDESC) e ps--graduado em Engenharia da Produo pela Faculdade de Tecnologia Internacional (FA-TEC). Atua no SENAI em Join-ville como instrutor de cursos tcnicos em informtica, tendo atuado tambm como instrutor nos cursos de aprendizagem industrial. Ainda no SENAI tra-balhou como pesquisador de-senvolvendo um projeto com a tecnologia de identificao por radio frequncia (RFID). Atual-mente, alm das atividades de docncia, atua como Analista de Sistemas, trabalhando com tec-nologia e inovao na rea de Gerenciamento Eletrnico de Documentos (GED) e Gerencia-mento de Processos de Negcio (BPM) na empresa TOTVS S.A. em Joinville.

    11

  • Unidade de estudo 1

    Sees de estudo

    Seo 1 - Relao com o mundo realSeo 2 - Relao com o mundo da programaoSeo 3 - Classes e objetosSeo 4 - Mtodos e atributos

  • 13PROGRAMAO ORIENTADA A OBJETOS I

    Introduo a Programao Orientada a Objeto

    SEO 1Relao com o mundo real

    Muita coisa mudou desde o incio do desenvolvimento de software para computadores, entre essas mudanas, esto as prprias lin-guagens utilizadas para o desen-volvimento desses sistemas.

    Nesse momento, vale lembrar da programao estruturada, desen-volvida nos anos 60 e que impul-sionou a criao de softwares mais complexos, porm, no eram so-mente os sistemas desenvolvidos que podiam ser mais complexos, os projetos tornavam-se muito grandes e difceis 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 programao orientada a objeto foi criada e tida como resposta aos problemas en-contrados na programao estru-turada.

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

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

    Figura 1: Ilustrao de objetos

    Fonte: Locadora (2011)

    Nenhum copo da imagem acima igual ao outro, porm, todos so 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, dimetro da base, dimetro 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 programao no diferente, os objetos tambm interagem entre si, cada um tem um papel e oferece servios, que so utilizados por outros objetos, e assim o sistema toma forma e se torna funcional.

    Na prxima seo, voc estudar sobre classes e objetos dentro do mun-do da programao.

  • 14 CURSOS TCNICOS SENAI

    SEO 2Relao com o mundo da programao

    J fizemos um estudo para enten-dermos o que so classes e obje-tos no mundo real, agora, a vez de entender o que esses termos significam no mundo da infor-mtica. 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 mos? No? Pois essa uma boa prtica para aprender a identificar classes de um sistema. Sabendo disso, vamos praticar!

    O primeiro ponto identificar tudo que se precisa para locar uma mdia em uma locadora. Observe:

    Primeiro, define-se em qual videolocadora ser realizada a locao

    Definido isso, voc se des-loca at o local e convidado a fazer um cadastro para que a loja saiba onde voc mora, e para que possa entrar em contato, caso seja necessrio. Como voc um novo cliente, o atendente solici-tar algumas informaes para fazer o cadastro, como alguns dados pessoais e endereo.

    Aps a realizao 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 mdia (DRD, blue-ray ou outro).

    como, nome, tempo de durao, ano de lanamento, categoria, diretor, nmero de atores, lugar onde foi filmado, tempo de du-rao para ser criado, valor gasto para o desenvolvimento do filme e tudo mais que possa representar uma informao referente a ele.

    Mas ser que todos esses itens so mesmo necessrios para o desen-volvimento do sistema? Claro que no. Para que o dono da locadora ou o prprio cliente precisariam saber quanto custou para criar o filme, no momento em que ele es-tiver sendo alugado? Essa uma informao desnecessria, e, pen-sando dessa forma, a nossa clas-se Filme ficaria com os seguintes atributos:

    nome; tempo de durao; ano de lanamento; categoria.

    Essas quatro caractersticas faci-litam a busca do filme dentro da locadora e ainda permitem forne-cer aos clientes informaes, que normalmente lhes interessam, como, o ano de lanamento e a durao do filme.

    DICA Aproveite e defina os atri-butos para cada classe que voc identificou para o seu sistema de fbrica de carros e motos, resolvendo o exer-ccio 2 do caderno de ativi-dades prticas.

    Para fazermos uma descrio mais tcnica 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 anlise, j poss-vel definir alguns itens como clas-ses obrigatrias do nosso sistema. Veja:

    Locadora Cliente Endereo Categoria Filme Mdia Funcionrio

    DICA Para facilitar o estudo e en-tendimento do material, ser utilizado o exemplo da videolocadora. Nos exerc-cios, ser empregado o de uma fbrica 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 prtica o conhecimento, re-alizando o exerccio 1 do ca-derno de atividades prticas.

    Aps a identificao das classes, necessrio identificar tambm os seus atributos. Para isso, responda a pergunta: quais so as caracte-rsticas dessas classe? Ao mesmo tempo em que se responde a essa pergunta, possvel definir as ca-ractersticas necessrias para que o sistema seja desenvolvido. Fa-zendo isso, tm-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 vrias caractersticas, tais

  • 15PROGRAMAO ORIENTADA A OBJETOS I

    ver, de forma grfica e padroni-zada, sistemas desenvolvidos uti-lizando o conceito de orientao a objetos. (BOOCH; RUMBAU-GH; JACOBSON, 2006)

    Para fazer uma descrio mais tc-nica das classes utiliza-se a UML, por meio do diagrama de classes, que representado por um re-tngulo dividido em trs partes, onde a primeira indica a classe, a segunda os atributos e a terceira os mtodos. Observe como fica a representao 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 exerccio 3 do caderno de atividades prti-cas.

    Aps voc ter definido as classes e seus atributos, a hora de pass--las para o computador em uma linguagem que a mquina enten-da. Para isso, utilizaremos a lin-guagem de programao Java, que uma linguagem robusta, segura e multiplataforma, capaz de rodar em qualquer mquina, indepen-dente do sistema operacional.

    SEO 3Classes e objetos

    At agora, voc aprendeu a definir as classes e seus atributos, tornan-do possvel o desenvolvimento de um sistema para uma videolocadora. Agora, veja como criar essas classes, aplicando a linguagem de progra-mao Java, utilizada no desenvolvimento de sistemas orientados a obje-tos. Sero usadas as classes j definidas.

    Voc j sabe que uma classe uma representao 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, devemos seguir um padro, que o seguinte:

    [modificadores de acesso] class NomedaClasse{}

    Os modificadores de acesso (sero estudados na unidade de estudo se-guinte) no so obrigatrios. A palavra reservada class, identifica a clas-se, seguida por seu nome. Para identificar onde a classe comea e onde termina, utilizam-se as chaves. Elas definem o bloco da classe, que onde os atributos sero colocados.

    Sabendo isso, em Java, a classe filme definida anteriormente fica assim:

    class Filme { String nome; String categoria; int duracao; int anoLancamento;}

    Seguindo um padro mundialmente utilizado, sempre escrevemos nomes de classes com a letra inicial maiscula e nomes de atributos com a letra inicial minscula. Quando o nome de um atributo for com-posto por mais de uma palavra, com exceo da primeira, as demais palavras devem possuir a primeira letra maiscula, como, o atributo anoLancamento, onde a letra L ficou maiscula. Seguindo o padro, tambm no 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, vrios 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 sero criados.

  • 16 CURSOS TCNICOS SENAI

    DICA Aproveite que voc acabou de definir a classe Filmes, e realize o exer-ccio 4 do caderno de atividades prticas.

    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 mtodo main. Os mtodos sero estudados mais adiante, por enquanto, basta que voc entenda que ele o responsvel por iniciar a execuo de um programa Java.

    Note que, no exemplo anterior, as classes e mtodos so delimitados por chaves. Aps o nome da classe e aps o final do mtodo, abre-se uma chave, e no final do exemplo fecham-se duas chaves, que indicam o fim do mtodo 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 varivel chamada filme01, que do tipo Fil-me, e corresponde classe Filme, que criamos no incio dessa seo.

    O responsvel 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 parnteses (o significado dos parnteses estudaremos posteriormente). Dessa forma:

    new Filme();

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

    filme01 = new Filme();

  • 17PROGRAMAO ORIENTADA A OBJETOS I

    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 = Fico Cientfica; 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, possvel perceber que, por meio do ponto, so acessados todos os atributos da classe Filme e atribudos valores a eles. Nesse momento, o nosso filme o Avatar que pertence categoria de fico cientfica, lanado no ano de 2009, com durao de 166 minutos.

    DICA Antes de prosseguir, realize os exerccios 5 e 6 do caderno de ativi-dades prticas.

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

    class Locadora { public static void main(String[] args) { Filme filme01; filme01 = new Filme(); filme01.nome = Avatar; filme01.categoria = Fico Cientfica; filme01.anoLancamento = 2009; filme01.duracao = 166; Filme filme02; filme02 = new Filme(); //acessar e setar valores aos atributos }}

  • 18 CURSOS TCNICOS SENAI

    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 programao significa comen-trio, logo, o texto colocado foi apenas um comentrio, 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 no so objetos, eles so uma referncia para que o objeto possa ser acessado.

    No exemplo a seguir, correto dizer que o atributo filme01 do tipo Fil-me, possui uma referncia para acessar o objeto. E isso ocorre em todo o Java, sempre teremos atributos referncia, 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 referncia.

    Agora sabendo que os atributos guardam as referncias para os objetos, vamos ver o que acontece na memria do computador para armazenar e acessar tais objetos. Observe a figura a seguir:

    Figura 3: Referncia dos objetos em memria

  • 19PROGRAMAO ORIENTADA A OBJETOS I

    Nesse exemplo, os atributos do tipo Filme chamados filme01 e filme02, fazem referncia a locais diferentes na memria, nesses locais esto ar-mazenados os objetos. Por isso, basta termos armazenado o endereo (referncia) dos objetos nos atributos para poder encontr-los, quando necessrio.

    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 = Fico Cientfica; filme01.anoLancamento = 2009; filme01.duracao = 166; Filme filme02; filme02 = new Filme(); filme02.nome = Quem quer ser um milionrio; 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 usurio, qual valor voc imagina que ser impresso? Avatar ou Quem quer ser um milionrio?

    Nesse caso a resposta simples, o valor exibido ser Quem quer ser um milionrio.

    Vamos ver na memria o que aconteceu aps a execuo desse progra-ma. Observando a figura a seguir, note que os dois atributos filme01 e filme02 esto fazendo referncia para o mesmo lugar da memria, logo, um dos objetos foi perdido, no temos mais como recuper-lo.

  • 20 CURSOS TCNICOS SENAI

    Figura 4: Referncia dos objetos em memria aps atribuio

    Agora imagine, se fizermos alguma alterao 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 = Fico Cientfica; filme01.anoLancamento = 2009; filme01.duracao = 166; Filme filme02; filme02 = new Filme(); filme02.nome = Quem quer ser um milionrio; filme02.categoria = Drama; filme02.anoLancamento = 2009; filme02.duracao = 121; filme01 = filme02; filme02.categoria = Ao; 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 usurio? Fico cientfica, drama ou ao?

    Na figura anterior, vimos que ao atribuir um atributo referncia ao ou-tro, eles faro referncia ao mesmo endereo de memria, ou seja, eles

    sempre iro 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 ao.

    DICA Faa o teste, realizando o exerccio 7 do caderno de atividades prticas.

    Na prxima seo, voc apren-der a criar e invocar mtodos criados dentro de suas respectivas classes.

    SEO 4Mtodos 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 funes dentro da prpria classe, fica fcil encontrar no pro-grama onde os procedimentos so realizados. Essas funes so chamadas de mtodos, que so os responsveis por realizar as ope-raes com os objetos.

    Todo mtodo 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 mtodo e seus parmetros. Os modificadores de acesso sero es-tudados na unidade de estudo se-guinte. A estrutura dos mtodos fica da seguinte forma:

  • 21PROGRAMAO ORIENTADA A OBJETOS I

    [modificadores de acesso] retorno nomeDoMetodo(parametros);

    Os modificadores de acesso no so obrigatrios. O nmero de parme-tros no limitado, podem ser utilizados quantos forem necessrios, e caso no o sejam, o mtodo pode no receber parmetros.

    Dentro da classe Locadora, que estamos utilizando como exemplo, po-demos criar um mtodo 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 = Fico Cientfica; filme01.anoLancamento = 2009; filme01.duracao = 166; }}

    A palavra reservada void, utilizada antes do nome do mtodo, significa que

    quando esse mtodo for chamado, no retornar nada como resposta a

    quem o chamou.

    Se lembrarmos da assinatura do mtodo, fica fcil identificar que no mtodo cadastrarFilme no temos controle de acesso, o retorno void, pois, o nome do mtodo cadastrarFilme e no possui parmetros.

    No exemplo anterior, alm do mtodo main, temos tambm o cadastrar-Filme, note que para acessar um mtodo tambm utilizado o operador ponto. Para que isso fosse possvel, foi criado um objeto do tipo Loca-dora que foi utilizado para acessar o mtodo cadastrarFilme. Com isso, podemos acessar o mtodo quantas vezes desejar e criar vrios filmes, sem precisar repetir o cdigo responsvel por setar o valor nos atributos do objeto.

    Nesse momento entendemos uma das principais caractersticas da programao orientada a objetos, o reaproveitamento de cdigo.

    Os mtodos ainda podem receber valores como parmetros para realizar operaes, da forma como fizemos no exemplo anterior, o mtodo ca-dastrarFilme s poderia criar objetos do filme Avatar, mas com a passa-gem de parmetro, podemos criar qualquer tipo de filme utilizando esse mtodo. O exemplo a seguir mostra isso.

  • 22 CURSOS TCNICOS SENAI

    class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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 parnteses do mtodo, estamos criando alguns atributos para receber valores de quem chama o mtodo. Tais atributos chamamos de parmetros. Com isso, quem define os valores para os atri-butos do objeto filme01, que est sendo criado, quem chama o mtodo e no o prprio mtodo.

    Alm de receber parmetros, os mtodos podem retornar respostas a quem o chamou, isso ocorre sempre no final da execuo do mtodo. Para que voc entenda melhor, vamos alterar o exemplo anterior para que o mtodo cadastrarFilme, receba valores como parmetros e retorne uma resposta.

  • 23PROGRAMAO ORIENTADA A OBJETOS I

    class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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, inclumos antes do nome do mtodo o tipo boolean, isso significa que o mtodo cadastrarFilme agora retorna um valor do tipo boolean. Para que isso acontea, no final do mtodo foi includa a expresso return true; que a instruo responsvel por enviar a quem chamou o mtodo a resposta true, que do tipo boolean defi-nida antes do nome do mtodo.

    Dentro do mtodo main, onde chamamos o mtodo 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 mtodo, dessa forma:

    Depois podemos utilizar essa resposta para imprimir uma mensagem para o usurio do sistema. Observando o exemplo anterior, podemos verificar a existncia de uma condio como uso do if , e logo aps o comando System.out.println, que o responsvel por imprimir uma mensagem para o usurio. Observe.

  • 24 CURSOS TCNICOS SENAI

    if(cadastrado == true){ System.out.print(Filme cadastrado com sucesso.);}

    Tendo estudado o conceito de mtodos, voc vai entender agora que os locais onde so criados e, se atribuir valor ou no a um atributo faz diferena. Veja os exemplos e fique atento onde criar e setar valores aos seus atributos.

    Atributo de instncia: significa que o atributo tem seu valor especifi-cado no objeto e no dentro da prpria 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 prpria classe e comum a todos os objetos que ela representar.Atributos globais: so os atributos criados dentro do escopo da classe e so acessveis em toda a classe, inclusive dentro de qualquer m-todo dela. Tanto os atributos de instncia, quanto os de classe, so tambm atributos globais.Atributos locais: so atributos criados dentro de um mtodo ou blo-cos menores, como estruturas de repetio ou de condio, 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 instncia e global String nome; //Atributo de classe e global String endereo = Av. 7 de setembro.; boolean cadastrarFilme(String nome, String categoria, int anoLancamento, int duracao){ //Todos os atributos passados como parmetros do mtodo so locais (nome, categoria, anoLancamento, durao).

    //A atributo filme01 local Filme filme01; filme01 = new Filme(); filme01.nome = nome; filme01.categoria = categoria; filme01.anoLancamento = anoLancamento; filme01.duracao = duracao; return true; }}

  • 25PROGRAMAO ORIENTADA A OBJETOS I

    DICA Agora, treine, realizando o exerccio 8 do caderno de atividades pr-ticas.

    Nessa unidade de estudos, voc aprendeu a definir as classes e seus atri-butos, tambm aprendeu a criar e invocar mtodos criados dentro de suas respectivas classes, e a definir o comportamento do cada classe.

    Na prxima unidade, voc aprender a controlar o acesso e encapsular. Continue atento! At l.

  • Unidade de estudo 2

    Sees de estudo

    Seo 1 - Controle de AcessoSeo 2 - Encapsulamento

  • 27PROGRAMAO ORIENTADA A OBJETOS I

    Acessibilidade

    SEO 1Controle de acesso

    Voc j parou para pensar nos recursos que so utilizados para proteger voc e a sua casa? Nor-malmente so colocadas cercas, muros altos, ces de guarda, alar-mes, grades nas janelas e portas, entre outros, e todos com o mes-mo objetivo: controlar o acesso e proteger. Na programao no diferente, precisamos controlar o acesso s classes, atributos e seus mtodos, e, para que isso seja pos-svel, 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 mtodos, mas eles no so utilizados apenas em mto-dos, podem ser aplicados tambm 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-nrios, e que a empresa trabalha com pesquisas cientficas, e as descobertas s podem ser conhe-cidas por algumas pessoas. Uma das medidas tomadas para prote-ger essas informaes, 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-ro mais ou menos poder de aces-so aos funcionrios.

    Os modificadores de acesso tam-bm tm esse papel: bloquear o acesso a determinadas classes, mtodos e/ou atributos do siste-ma, de forma que outras classes no tenham acesso a um con-tedo proibido. Para entender melhor, vejamos quais so esses modificadores de acesso e como utiliz-los.

    Os modificadores de acesso que voc estudar so os seguintes: public, protected, private, friendly, abstract, static e final. A seguir realizada uma explicao 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, mtodo e atributo, podem ser acessados de qualquer lugar do programa se fizer uso do mo-dificador de acesso public.

    Protected: permite acesso prpria classe, s subclasses (clas-ses filhas) e s classes do mesmo pacote.

    Private: o modificador mais restritivo de todos, permite o acesso somente prpria classe, ou seja, os mtodos 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 no infor-mamos modificadores de acesso. Muitos pensam que quando no informamos, o padro do Java o public, mas no 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 mtodo como abstrato, significa dizer que esse mtodo ser desenvolvido nas subclas-ses, ou seja, na classe onde ele definido como sendo abstract, vai apenas a assinatura do mtodo. A sua implementao deve ser feita nas classes filhas. Para criar a assinatura de um mtodo usando o abstract, a classe que contm essa assinatura tambm deve ser abstrata. Classes definidas como sendo abstratas, no podem ser instanciadas.

    Static: esse modificador define um atributo como sendo da classe e no da instncia da classe. Dessa forma, a cada novo objeto criado (nova instncia), no ser feita uma cpia desse atributo, ele ser compartilhado por todas as instncias da classe. Com isso, se uma instncia realizar alguma al-terao no valor do atributo, essa mudana ser aplicada a todas as demais.

  • 28 CURSOS TCNICOS SENAI

    Final: quando esse modificador aplicado a um atributo, ele no pode ter seu valor alterado, tornando-se uma constante. Quando apli-cado a uma classe, esta no pode ser herdada, e quando aplicado a um mtodo, o mtodo no 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, no estamos utilizan-do nenhum tipo de modificador de acesso, exceto no mtodo main, que o mtodo com a assinatura padro utilizado pelo Java para dar incio execuo do programa. Se quisssemos que a classe Locadora e seus mtodos fossem accessveis de qualquer lugar do sistema, qual modifica-dor de acesso deveramos utilizar? Acertou, se voc respondeu public.

    class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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 pblica, necessrio acrescentar a palavra public em dois locais: no incio da classe e antes do retorno do mtodo. Fazendo essas mudanas, nosso exemplo ficaria da seguinte forma.

  • 29PROGRAMAO ORIENTADA A OBJETOS I

    public class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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 fcil utilizar os de-mais. Nos locais onde colocamos a palavra public, basta substituir pelo modificador necessrio, po-dendo ser protected, private ou abstract. Os modificadores static e final so utilizados em conjun-to com os demais. Para entender melhor essa utilizao conjunta, vamos utilizar a nossa classe Fil-me para exemplificar.

    class Filme { String nome; String categoria; int duracao; int anoLancamento;}

    Na classe Filme apresentada, no temos uso de nenhum modificador de acesso. Imagine que queremos tornar essa classe pblica, porm, seus atributos devem ser protegidos de qualquer outra classe do sistema, e outro diferencial, o ano do filme deve ser compartilhado por todas as instncias dessa classe.

    Para fazer isso tudo, precisamos em primeiro lugar tornar a classe pbli-ca, e, para isso, basta incluir a palavra public no incio da classe, depois, precisamos tornar os atributos protegidos de todas as outras classes do sistema, para isso basta incluir a palavra private antes da declarao de todos os atributos e por ltimo, tornar o ano de lanamento do filme compartilhado por todas as instncias, incluindo o modificador de aces-so static antes do private.

    Fazendo todas essas mudanas 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;}

  • 30 CURSOS TCNICOS SENAI

    Com o uso do modificador static no atributo anoLanamento, todas as instncias da classe filme tero 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 lanamento = + filme01.anoLancamento); System.out.println(Ano de lanamento = + filme02.anoLancamento);

    }}

    No exemplo anterior, temos na classe Filme um mtodo de teste chama-do testeFilme(), que est sendo utilizado apenas para demonstrar o uso do modificador de acesso. Esse mtodo cria dois objetos, ou seja, duas instncias da classe Filme. Aps criar os objetos sero atribudos valores ao atributo anoLancamento de ambos os objetos. Logo aps impresso o valor de ambos os atributos dos objetos.

    Voc sabe quais valores sero impressos? Lembrando que o atributo em questo 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 instncias da classe, isto , se uma instncia tem o valor 2010, todas as outras tambm o tero, com isso sempre o ltimo valor atribudo ao atributo ser utilizado por todas as instncias.

    Foi preciso criar um mtodo de teste dentro da prpria classe Filme, para que pudssemos acessar os atributos dela, isso foi necessrio devi-do ao fato de que todos foram declarados como private, e por isso s podem ser acessados de dentro da prpria classe.

    Da mesma forma que o modificador static utilizado em conjunto com outros modificadores, o modificador final tambm 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;}

  • 31PROGRAMAO ORIENTADA A OBJETOS I

    O uso do modificador final obriga que um valor seja atribudo ao atri-buto no momento da criao, por isso precisamos cri-lo e conferir-lhe o valor 2011. Feito isso, esse atributo no 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-rao incorreta est tentando ser executada e ir gerar um erro, no sen-do possvel executar o programa.

    Aps termos estudado os modificadores de acesso, veremos outra for-ma de tornar nosso sistema mais acessvel e seguro, sem esquecer os modificadores de acesso.

    DICA Antes de estudar o encapsulamento, realize os exerccios 9, 10 e 11 do caderno de atividades prticas.

    SEO 2Encapsulamento

    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 segurana no acesso s informaes, facilitando a busca dos programadores por mtodos dentro do sistema, seja para con-sultar ou para realizar manutenes.

    Imagine que voc precisa alterar o mtodo onde realizado o cadastro de filmes, em qual classe voc procuraria? Se no existisse o encapsu-lamento voc poderia ficar perdido, e poderiam existir vrios locais no seu sistema que realizam essa operao, mas com o encapsulamento o cadastro de filmes feito por uma nica classe, a Locadora, onde o fun-cionrio da locadora que realiza o cadastro de todos os filmes. por isso que esse mtodo foi colocado na classe Filme.

    A ideia do encapsulamento tambm fechar o nosso sistema, de forma que quem for utilizar os mtodos e atributos saiba para que eles ser-vem, e no o que eles fazem ou o que feito com eles internamente.

  • 32 CURSOS TCNICOS SENAI

    Imagine que voc ir fazer um cadastro de um novo filme, voc precisa saber o que o mtodo de cadastro faz internamente? No. Voc s precisa saber que ele vai fazer o cadastro e no como ele faz.

    Dessa forma nosso sistema fica mais organizado e com isso mais fcil de entender. Se algum dia outro programador que no participou desde o incio do desenvolvimento do sistema precisar realizar uma modificao em algum mtodo, ele no ter tanta dificuldade para encontrar e manu-tenir as funcionalidades do sistema.

    Para auxiliar na questo do acesso aos atributos, comum na orientao a objeto a criao de mtodos get e set. Esses mtodos so utilizados para dar acesso a atributos declarados como private.

    Voc deve pensar sempre em dar acesso e no retirar acesso aos atri-butos. O que isso quer dizer? Como padro crie sempre os atributos das classes como private, assim ningum vai conseguir acess-los de fora da classe. Caso voc queira permitir o acesso a algum desses atri-butos, utilize os mtodos set e get.

    Mas o que so mtodos set e get?

    Os mtodos set e get so responsveis por colocar valor em um atributo ou

    recuperar o valor de um atributo respectivamente.

    Defini-se, que por padro, 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 ningum ter acesso aos atributos dessa classe a no ser ela mesma. Agora voc concorda que assim, a classe Filme, no ter utilida-de alguma, pois a classe Locadora que fazia uso desses atributos, e com eles declarados como private, ela no ter mais acesso.

    em situaes como esta que entra o uso dos mtodos get e set. De-vemos criar os mtodos de acordo com a necessidade do sistema, para liberar o acesso necessrio aos atributos.

    No obrigatria a criao dos dois mtodos, set e get, eles devem ser criados de acordo com a necessidade do sistema.

  • 33PROGRAMAO ORIENTADA A OBJETOS I

    No nosso exemplo, necessitamos liberar o acesso a todos os atributos, logo, precisamos criar os mtodos 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 mtodos set e get, identificamos um padro para o nome dos mtodos, utilizando sempre o set ou get seguido do nome do atribu-to com letra maiscula. Para o atributo nome os mtodos ficam assim:

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

    Observe que o mtodo getNome responsvel por retornar o valor do atributo nome, enquanto que o setNome recebe como parmetro um valor para ser salvo no atributo nome, e essas so as suas funes, retor-nar e salvar um valor em um determinado atributo.

  • 34 CURSOS TCNICOS SENAI

    No mtodo setNome voc pode observar o uso de um novo operador, o this, que utilizado para indicar que estamos acessando o atributo da classe e no o atributo que est sendo passado como parmetro no mtodo, pois ambos tm o mesmo nome.

    A palavra chave this utilizada para indicar que estamos acessando o atri-

    buto ou mtodo da classe em que estamos trabalhando.

    O uso do this no obrigatrio, porm altamente recomendado, pois facilita a leitura do cdigo fonte pelos programadores. Para retir-lo do mtodo set.nome preciso trocar o nome do atributo que est sendo passado como parmetro. Confira o exemplo:

    public void setNome(String param) { nome = param;}

    Com o uso dos mtodos set e get, voc pode controlar se outras classes tero acesso aos atributos ou no. Se voc pretender dar acesso apenas a gravao de dados nos atributos, basta criar apenas o mtodo set na sua classe. Porm, se voc quer permitir que outras classes apenas recupe-rem o valor dos atributos, basta criar na sua classe o mtodo get.

    Agora, com os mtodos set e get criados e entendidos, temos que alterar tambm a forma de acessar os atributos. No mais possvel acess-los diretamente como estvamos fazendo at agora, daqui em diante tere-mos que chamar os mtodos set e get, como mostra o exemplo a seguir:

    public class Locadora{ public static void main(String[] args) { Filme filme01; filme01 = new Filme();

    //salvando informaes filme01.setNome(Avatar); filme01.setCategoria(Fico Cientfica); filme01.setAnoLancamento(2009); filme01.setDuracao(166); //pegando informaes System.out.println(Nome: + filme01.getNome()); System.out.println(Categoria: + filme01.getCategoria()); System.out.println(Ano de lanamento: + filme01.getAnoLancamento()); System.out.println(Durao: + filme01.getDuracao()); }}

  • 35PROGRAMAO ORIENTADA A OBJETOS I

    DICA Realize os exerccios do 12 ao 15 do caderno de atividades prticas e perceba que com o uso dos modificadores de acesso, em conjunto com a criao dos mtodos set e get, tm-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. Ento, prepare-se e bom estudo!

  • Unidade de estudo 3

    Sees de estudo

    Seo 1 - Construtores

  • 37PROGRAMAO ORIENTADA A OBJETOS I

    Construtores

    SEO 1Construtores

    Se voc observar a criao de um objeto, perceber algo parecido com a chamada de um mtodo, veja no exemplo a classe Locadora:

    public class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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 mtodo main criamos um objeto do tipo Locadora e no mtodo cadastrarFilme criamos um objeto do tipo Filme. A criao realizada com o uso do new, a expresso que representa o objeto a seguinte:

    new Filme();

    Sempre se utiliza o nome da classe seguido de abre e fecha parnteses. Voc sabe por que feito isso? como se fosse chamado um mtodo Filme, pois toda chamada de mtodo, tambm abre e fecha parnteses.

  • 38 CURSOS TCNICOS SENAI

    Realmente, sempre que se utiliza o new criado um novo objeto, e para criar esse objeto necessrio chamar o mtodo construtor da classe que se deseja criar.

    Um mtodo construtor nada mais do que um mtodo com o mesmo nome da classe, exatamente o mesmo nome, obedecendo inclusive as letras maisculas e minsculas (DEITEL, 2005, p. 68). Veja o exemplo de como ficaria a classe Filme com o mtodo construtor:

    public class Filme{ private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(){ System.out.println(Filme Criado!); } // mtodos set e get}

    Observando o exemplo voc pode pensar que, como no tnhamos os mtodos construtores estvamos fazendo errado, mas no estvamos. Mesmo sem serem criadas, todas as classes possuem, por definio, um mtodo construtor vazio. Assim:

    Filme(){}

    Por isso, mesmo que voc no crie o mtodo construtor dentro da clas-se, acredite, ele esta l!

    Agora voc pode ter ficado com outra dvida: se o Java cria como pa-dro um mtodo construtor para todas as classes, por que voc precisa cri-los?

    Sempre que se cria um mtodo construtor para uma classe, o mtodo construtor default deixa de ser utilizado, logo o seu mtodo construtor se torna o principal da classe. Imagine que antes de tudo, o seu mtodo ser chamado e voc poder fazer qualquer operao nesse momento, voc pode iniciar atributos, fazer chamadas a outros mtodos, enfim, definir como seu objeto ser criado.

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

  • 39PROGRAMAO ORIENTADA A OBJETOS I

    public class Filme{ private String nome; private String categoria; private int duracao; private int anoLancamento; public Filme(){ this.nome = Avatar; }

    // mtodos 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, no fica muito usual, uma vez que no existe apenas o filme Avatar, mas sim vrios filmes que sero cadastrados. Ento que outra forma de setar valor para esse atributo pode ser usada?

    O mtodo construtor aceita a passagem de parmetros. 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; }

    // mtodos 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 no for passado a ele, o objeto no ser criado.

    A forma de criar esse objeto agora mudou um pouco, devido a passagem do parmetro, na nossa classe Locadora a criao do objeto Filme fica conforme o exemplo a seguir:

  • 40 CURSOS TCNICOS SENAI

    public class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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 mtodo main no foi alterado, apenas o mtodo ca-dastrarFilme sofreu alteraes. A criao do objeto Filme agora recebeu um parmetro, correspondente ao nome do Filme e no mais necess-rio setar valor para o atributo nome da classe Filme, uma vez que agora isso feito dentro do mtodo construtor.

    Apesar de ser chamado de mtodo construtor, ele no um simples mtodo. Pode-se dizer que um mtodo especial, pois no pode pos-suir retorno e s pode ser chamado no momento de criao de um objeto.

    Uma classe pode ter quantos mtodos forem necessrios para sua utili-zao, e no diferente para mtodos construtores, que permitem mais de um mtodo construtor em uma mesma classe. Veja o exemplo:

  • 41PROGRAMAO ORIENTADA A OBJETOS I

    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; }

    // mtodos set e get}

    Nesse caso criamos dois mtodos construtores, onde um recebe ape-nas o nome do filme como parmetro, 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);ouFilme filme01 = new Filme(nome, categoria);

    possvel tambm chamar um construtor de dentro de outro, lembran-do do conceito do mtodo construtor que diz que ele s pode ser cha-mado durante a criao do objeto, e, como est sendo criado dentro de outro mtodo construtor ento 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 mtodo construtor this(nome); this.categoria = categoria; }

    // mtodos set e get}

    Os mtodos construtores so muito importantes, pois com eles possvel controlar e definir como um objeto ser criado, e se ser realizada alguma operao no momento de sua criao.

    DICA Os exerccios 16, 17 e 18 do caderno de atividades pr-ticas so sobre os mtodos construtores. Que tal resol-v-los e testar o que acabou de aprender?

    Voc viu que possvel criar m-todos com o mesmo nome em uma mesma classe, utilizando os mtodos construtores, que pos-suem o mesmo nome e podem ser criados mais de um na mesma classe. Na prxima unidade de es-tudos voc estudar as sobrecar-gas de mtodos. At l!

  • Unidade de estudo 4

    Sees de estudo

    Seo 1 - Sobrecarga de mtodos

  • 43PROGRAMAO ORIENTADA A OBJETOS I

    Sobrecarga de Mtodos

    SEO 1Sobrecarga de mtodos

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

    O que no pode existir em uma mesma classe, so mtodos com assina-turas iguais. O que isso quer dizer? Quer dizer que no se pode ter dois mtodos com o mesmo nome, e com os mesmos tipos e nmeros de parmetros. Observe o diagrama a seguir para entender melhor o con-ceito de sobrecarga.

    Figura 5: Diagrama de classe UML com sobrecarga de mtodos

    Nesse diagrama apresentado pode-se entender melhor esse conceito de sobrecarga. H trs mtodos, todos com o mesmo nome, porm, com algumas sobrecargas: os tipos dos parmetros entre o primeiro e o segundo mtodo e a quantidade de parmetros passados no quarto mtodo.

    A sobrecarga de mtodos cadastrarFilme ficaria da seguinte forma se desenvolvido na linguagem Java:

  • 44 CURSOS TCNICOS SENAI

    public class Locadora { public static void main(String[] args) { Locadora loca = new Locadora(); String nome = Avatar; String categoria = Fico Cientfica; 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){ //implementao do mtodo }

    public boolean cadastrarFilme(String nome){ //implementao do mtodo }}

    DICA Como os mtodos tero o mesmo nome e, provavelmente, sero utilizados para realizao de tarefas semelhantes, importante es-colher um nome mais apropriado que identifique todas as tarefas de modo a no gerar confuso no momento de sua utilizao.

    E como saber qual mtodo est sendo chamando no momento da exe-cuo quando h nomes repetidos?

    Voc no precisa se preocupar com isso pois, quem define, o compila-dor, levando em considerao as diferenas dos mtodos para utiliz-los de acordo com suas caractersticas, por exemplo:

    boolean retorno = cadastrarFilme(Avatar, Fico Cientfica, 2009, 166);

  • 45PROGRAMAO ORIENTADA A OBJETOS I

    Nesse caso, temos os quatro parmetros como sendo do tipo String. O compilador identificou e utilizou o segundo mtodo criado na classe Locadora, que o que recebe como parmetro os quatro parmetros do tipo String.

    Voc sabe que mtodo da classe locadora seria chamado se, ao invs do exemplo anterior, fosse feito da seguinte maneira?

    boolean retorno = cadastrarFilme(Avatar);

    Neste caso seria chamado o ltimo mtodo, pois, ele o nico que rece-be apenas um parmetro.

    Tenha bastante cuidado ao fazer sobrecarga com o mesmo nmero de par-

    metros, pois o compilador diferencia o tipo dos parmetros, e no o nome

    deles.

    O exemplo a seguir no caracteriza uma sobrecarga.

    public boolean cadastrarFilme(String nome, String categoria, String anoLancamento, String duracao){ //implementao do mtodo }

    public boolean cadastrarFilme(String nome, String categoria, String ano, String tempo){ //implementao do mtodo }

    Nesse exemplo apresentado, foram alterados os nomes de dois par-metros, de anoLancamento para ano, e de durao para tempo. Essa mudana no caracteriza uma sobrecarga, e o seu programa no ir fun-cionar, pois existem dois mtodos exatamente iguais, e isso no per-mitido.

    DICA Utilizando o caso da fbrica de carros e motos, teste a sobrecarga, realizando os exerccios 19 e 20 do caderno de atividade prticas.

    Na prxima unidade de estudos voc aprender como organizar as suas classes por meio de pacotes. Prepare-se!

  • Unidade de estudo 5

    Sees de estudo

    Seo 1 - Pacotes, como organizar suas classes

  • 47PROGRAMAO ORIENTADA A OBJETOS I

    Pacotes, como Organizar suas Classes

    SEO 1Pacotes, 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 msicas em uma pasta, seus trabalho da disciplina de POO em outra pasta, e assim por diante.

    Agora, imagine se essa separa-o de pastas no fosse possvel e tudo tivesse que ficar em um mesmo lugar, tudo misturado. Se-ria horrvel, no mesmo? Ainda bem que podemos organizar tudo em diretrios, fica muito mais fcil encontrar os documentos. Agora pense na seguinte situao: voc e alguns amigos foram fazer um passeio e tiraram vrias fotos com a sua cmera digital, e agora todos os seus amigos esto pedin-do uma cpia dessas fotos. Voc pode simplesmente copiar a pas-ta de uma s vez e repass-la aos seus amigos o que muito fcil 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 programao isso no diferente. No vamos criar todas as nossas classes dentro de um nico diretrio, mas sim, dividi-las de acordo com suas funcionalidades e necessidades do projeto.

    Os diretrios dentro da programao so chamados de pacotes, ou package. Imagine que temos uma classe salva dentro do seguinte dire-trio 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 diretrios do sistema operacional, os no-mes das pastas so separados por barras \, e os packages so divididos por pontos .. Da mesma formaque existem padres, no momento de criar nomes de classes, mtodos e variveis, existe um padro para cria-o de pacotes, nesse caso, todos os pacotes devem ser escritos apenas com letras minsculas, independente se os nomes so compostos por mais de uma palavra.

    Deve-se referenciar o pacote, onde a classe est gravada e no incio 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:

  • 48 CURSOS TCNICOS SENAI

    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; //implementao dos mtodos}

    Dentro de um mesmo pacote, podem estar quantas classes forem neces-srias, e todas tm acesso direto umas as outras - o que estava sendo feito at o momento - pois todas estavam em um mesmo pacote.

    Se quisssemos acessar a classe Pessoa, de dentro da classe Locadora, imaginando que nesse momento elas esto 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 esto em pacotes diferentes, no h mais o acesso direto entre as classes, como fazer para acessar as classes que no esto 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, no fica nem um pouco elegante o cdigo fonte, e toda vez que se quiser fazer referncia classe Pessoa, seria necessrio escrever o caminho completo. Nada prtico, no acha?

  • 49PROGRAMAO ORIENTADA A OBJETOS I

    Para resolver isso, o Java possui uma palavra reservada chamada import, que serve para importar um pacote para dentro da classe onde o import foi utilizado. Com isso no existe a necessidade de digitar todo o cami-nho do pacote de uma classe toda vez que desejarmos fazer referncia a ela.

    Com a classe Locadora em outro diretrio e utilizando o import para fazer acesso classe Pessoa, e com a classe Locadora em outro diretrio, esta ficaria da seguinte forma:

    package br.com.poo.locadora.Locadora;import br.com.poo.entidade.Pessoa;public class Locadora{ public static void main(String[] args) { Pessoa pessoa = new Pessoa(); pessoa.getEndereco().setBairro(Bom Retiro); pessoa.getEndereco().setCep(89222-365); //... }}

    Note que agora, o package da classe mostra que o pacote da classe Lo-cadora no mais o entidade, e sim o pacote locadora.

    package br.com.poo.locadora.Locadora;

    J o uso do import, indica que pode-se utilizar a classe Pessoa, que est dentro do pacote br.com.poo.entidade diretamente, como se a classe estivesse dentro do mesmo pacote. A instruo que permite isso :

    import br.com.poo.entidade.Pessoa;

    Fazendo uso desse recurso, continua-se tendo acesso a todas as classes, independentemente delas estarem ou no no mesmo pacote.

    possvel, tambm, importar todas as classes de um pacote de uma s vez. Para isso, basta utilizar o *, que indica que qualquer classe, em um pacote, pode ser acessada. Por exemplo:

    import br.com.poo.entidade.*;

    Nesse caso, se permite o acesso a todas as classes que esto dentro do pacote entidade.

    O import vale tambm para clas-ses externas ao projeto, por exem-plo, se quisermos utilizar uma classe do Java, dentro de alguma das classes, como a ArrayList do Java, que implementa uma lista, para que se tenha acesso a essa classe, ser necessrio, obrigato-riamente, fazer um import dela para a classe em que se quer uti-liz-la. Portanto, o import ficaria da seguinte forma:

    import java.util.ArrayList;

    Fazendo isso, poderamos utilizar uma classe que no est no proje-to, mas est implementada direta-mente pelo prprio Java.

    Note que, nesse caso, importamos apenas a classe ArrayList, que est dentro do pacote util do Java. No obrigatrio importar um pacote inteiro, se voc utilizar so-mente uma classe.

    Nessa unidade, voc viu que po-demos importar todo um pacote, o que d acesso a todas as classes do pacote, ou utilizar o * para importar todas as classes de uma s vez.

    Lembre-se que importante dei-xar o sistema o mais limpo pos-svel, ou seja, importe somente as classes que sero utilizadas para no existir dvidas sobre as clas-ses corretas.

    No sistema, na classe Locadora, se-

    ria importada apenas a classe Pes-

    soa, que a que nos interessa ter

    acesso. Isso o correto a ser feito.

    Na prxima unidade, voc apren-der como reaproveitar cdigos e reescrever mtodos, mas antes de continuar, realize o exerccio 21 do caderno de atividades prticas.

  • Unidade de estudo 6

    Sees de estudo

    Seo 1 - Reaproveitamento de cdigoSeo 2 - Reescrita de mtodos

  • 51PROGRAMAO ORIENTADA A OBJETOS I

    Herana

    SEO 1Reaproveitamento de cdigo

    Os sistemas, de um modo geral, evoluram muito nos ltimos anos e para que essa evoluo aconte-cesse, foi necessrio escrever mui-tas linhas de cdigo fonte. Agora, imagine classes imensas e projetos com centenas de classes; ser que tudo isso era mesmo necessrio? Ser que no h uma forma de reutilizar partes do cdigo fonte e tornar o sistema mais simples? Essa uma das vantagens de se utilizar a herana.

    Antes de entender o que a he-rana na programao, pense na sua vida, o que herana? Pense em caractersticas genticas, j lhe disseram como voc parecido com seu pai ou com sua me? Pois bem, isso herana, seus pais herdaram caractersticas do seus avs, e voc herdou caractersticas dos seus pais.

    A figura a seguir representa a he-rana gentica, que o filho herda caractersticas do pai.

    Figura 6: Diagrama exemplificando a herana gentica

    Tendo claro o conceito de herana, j podemos falar de forma tcnica. Com a herana no preciso repetir atributos ou mtodos, ou seja, no preciso reescrev-los, podendo simplesmente utilizar os atributos de outras classes que j o desenvolveram.

    Porm, para utilizar a herana, no simplesmente sair herdando toda e qualquer classe. Estas precisam ter alguma relao. Vamos buscar no-vamente o exemplo da locadora, para entender melhor esse conceito. Definimos na primeira unidade de estudo que precisaramos de uma classe para definir um cliente, e uma classe para definir um funcionrio. Mas o que essas duas classes tm em comum? Tanto um cliente como um funcionrio so pessoas, logo, tero atributos em comum.

    Os atributos que a classe Cliente e a classe Funcionrio tiverem em comum, voc pode isolar em uma terceira. Assim no ser necessrio duplicar as informaes, o cdigo fica mais centralizado, com isso o sistema fica mais fcil de entender e de manutenir.

    Observe a figura a seguir, para entender melhor como ficaria o nosso exemplo, utilizando o conceito de herana.

    Figura 7: Herdando da classe Pessoa

  • 52 CURSOS TCNICOS SENAI

    Como funcionrios e clientes so pessoas, criamos uma classe chamada Pessoa, para centralizar nela todos os atributos comuns dessas classes.

    Observando a figura 7, se pode identificar os atributos nome, telefone, rg, cpf, estadoCivil e sexo, como sendo os atributos comuns. J na clas-se Funcionario permaneceram apenas os atributos salrio e carteira de trabalho, que so os necessrios para contratar e pagar o funcionrio da locadora, e na classe Cliente, foram colocados apenas o atributo depen-dentes, para indicar se mais algum pode locar um filme no nome desse cliente.

    Se no tivssemos criado a classe Pessoa, todos os atributos desta teriam que ser duplicados na classe Funcionario, e na Cliente, desnecessaria-mente.

    A classe que herda os atributos e mtodos chamada de filha ou sub-classe, nesse caso, as classes Funcionario e Cliente so subclasses da Pessoa. J a classe que herdada, chamada de me ou superclasse. Portanto, a classe Pessoa uma superclasse.

    Relembrando um pouco sobre modificadores de acesso, quando temos um atributo ou mtodo declarado como private, somente a prpria clas-se tem acesso a ele. Isso vale tambm para herana, as subclasses no herdam os atributos e mtodos criados como private. Para que seja pos-svel herdar, necessrio utilizar outros modificadores de acordo com a necessidade, podendo ser, por exemplo, um protected ou public.

    J entendemos o porqu de utilizar a herana, mas como fazer isso no Java? Como dizer ao compilador que voc est utilizando parte do c-digo fonte de outra classe? Para isso existe uma palavra-chave chamada extends, que possibilita fazer uso da herana no Java. Veja no exemplo a seguir, como ficariam as trs classes desenvolvidas no Java.

    public class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; //implementao dos mtodos}

    public class Cliente extends Pessoa{ private String dependentes; //implementao dos mtodos}

    public class Funcionario extends Pessoa { private float salario; private String carteiraTrabalho;

    //implementao dos mtodos}

  • 53PROGRAMAO ORIENTADA A OBJETOS I

    Observe que logo aps o nome da classe, utilizamos a palavra reservada extends, seguida do nome da classe que queremos herdar.Fazendo isso, como se copissemos tudo que est dentro da classe Pessoa e colssemos dentro da classe Funcionario e Cliente, exceto os atributos e mtodos declarados como private.

    Quando criamos um objeto do tipo Funcionario, por exemplo, no pre-cisamos fazer nenhum tipo de referncia classe Pessoa para utilizar seus atributos e mtodos. Veja no exemplo:

    public class Locadora{ public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome(Joo); funcionario.setRg(89898789); funcionario.setCpf(021.234.543-90); funcionario.setTelefone((47)30001122); funcionario.setSexo(Masculino); funcionario.setEstadoCivil(Casado); funcionario.setCarteiraTrabalho(9876234653); funcionario.setSalario(2000); }

    //implementao dos mtodos

    }

    Observando o exemplo, nota-se que no h diferena nenhuma ao aces-sar os atributos que a classe Funcionario est herdando da Pessoa, como se os atributos fossem exclusivamente da classe Funcionario.

    Pode acontecer de se herdar mtodos com determinadas caractersticas, que no queremos utilizar em outras classes, e para refazer esse mtodo, existe um mecanismo chamado de reescrita de mtodos. Esse o assun-to da prxima seo de estudo.

  • 54 CURSOS TCNICOS SENAI

    SEO 2Reescrita de Mtodos

    Nem sempre os mtodos herdados possuem o comportamento que que-ramos. Nesses casos, necessrio reescrev-los. Imagine que na classe Pessoa exista um mtodo para cadastrar o cpf de uma pessoa, porm, esse mtodo no faz nenhum tipo de validao para saber se o nmero informado vlido. Para fazer essa validao, necessrio reescrever o mtodo de cadastro do cpf. Observe:

    public class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; public void cadastroCpf(String cpf){ this.cpf = cpf; }

    //implementao dos mtodos}public class Funcionario extends Pessoa { private float salario; private String carteiraTrabalho;

    public void cadastroCpf(String cpf){ if(cpf.length() >= 11){ super.setCpf(cpf); } else{ System.out.println(CPF invlido.); } }

    //implementao dos mtodos}

    Nesse exemplo, temos um mtodo chamado cadastroCpf na classe Pes-soa, onde ele apenas seta o valor do cpf informado no atributo da classe, sem fazer qualquer tipo de validao.

    Na classe Funcionario, reescrevemos o mtodo de cadastro do cpf fa-zendo uma validao simples com relao ao tamanho do nmero in-formado. Tal documento, para ser vlido, deve possuir pelo menos onze dgitos, logo, se informar menos, o cpf invlido.

  • 55PROGRAMAO ORIENTADA A OBJETOS I

    Agora, sempre que utilizarmos um objeto do tipo Funcionario para acessar o mtodo cadastroCpf, ele invocar o mtodo reescrito e no mais o da superclasse. O mesmo pode ser feito para a classe Cliente.

    Saiba que possvel que exista a necessidade de, em algum momento, chamar o mtodo herdado ao invs do reescrito, basta, para isso, utilizar a palavra reservada super, que faz referncia superclasse, e acessar o mtodo herdado. No exemplo anterior, foi utilizada a palavra super para acessar o mtodo setCpf da superClasse.

    Ateno: A palavra super s pode ser utilizada dentro da subclasse.

    Observe outro exemplo de uso do super.

    public class Funcionario extends Pessoa { private float salario; private String carteiraTrabalho;

    public void cadastroCpf(String cpf){ if(cpf.length() >= 11){ super.cadastroCpf(cpf); } else{ System.out.println(CPF invlido.); } }

    //implementao dos mtodos}

    Nesse exemplo, ao invs de chamar o mtodo setCpf, foi chamado o mtodo cadastroCpf, herdado da superclasse. feita a validao no m-todo reescrito, se estiver tudo certo, chamado o mtodo herdado para fazer o cadastro efetivo.

    A reescrita de mtodos muito importante para mudar o comportamen-to de um mtodo, para se adequar as necessidades da classe que o est herdando.

    DICA Agora, realize os exerccios 22 ao 26 do caderno de atividades prti-cas e teste o que acabou de aprender. Ah! Preste ateno na informa-o do exerccio 25, h um comentrio sobre duas expresses novas. Continue atento!

  • Unidade de estudo 7

    Sees de estudo

    Seo 1 - Polimorfismo

  • 57PROGRAMAO ORIENTADA A OBJETOS I

    Polimorfismo

    SEO 1Polimorfismo

    Se entrar algum na locadora e pedir para falar com alguma pessoa, esta pode ser tanto um cliente como um funcionrio, certo? Afinal, cliente e funcionrio so pessoas. Com base nessa ideia, se pode fazer a seguinte operao no nosso sistema:

    public class Locadora{ public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome(Joo); funcionario.setRg(89898789); funcionario.setCpf(021.234.543-90); funcionario.setTelefone((47)30001122); funcionario.setSexo(Masculino); funcionario.setEstadoCivil(Casado); funcionario.setCarteiraTrabalho(9876234653); funcionario.setSalario(2000);

    Pessoa pessoa = new Pessoa(); pessoa = funcionario;

    }

    //implementao dos mtodos

    }

    A operao realizada s possvel graas ao polimorfismo, que a capaci-

    dade de fazer referncia a um objeto de formas diferentes.

    No exemplo, estamos nos referenciando a um funcionrio como sen-do uma pessoa. Mas tome cuidado, um objeto pode fazer referncia a outros objetos, porm, ele nunca muda de tipo. Se ele foi criado como sendo um objeto do tipo Funcionario, ele sempre vai ser assim, at que seja destrudo.

    Veja outro exemplo para entender melhor. Imagine que na classe Pes-soa tenha um mtodo chamado queTipoSou, que imprime uma frase mostrando de que tipo um determinado objeto. Esse mesmo mtodo criado na classe Funcionario. Fazendo isso, temos as seguintes classes:

  • 58 CURSOS TCNICOS SENAI

    public class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; public void queTipoSou(){ System.out.println(Pessoa!); }

    //implementao dos mtodos}public class Funcionario extends Pessoa { private float salario; private String carteiraTrabalho;

    public void queTipoSou(){ System.out.println(Funcionrio!); }

    //implementao dos mtodos}

    Se criarmos um objeto do tipo Funcionario e um objeto do tipo Pessoa e atribuirmos o objeto Funcionario ao objeto Pessoa, e, aps isso, cha-marmos o mtodo quetipoSou, que frase ser impressa? Funcionrio! ou Pessoa!? Antes de responder a essa pergunta, veja o exemplo:

    public class Locadora{ public static void main(String[] args) { Funcionario funcionario = new Funcionario(); funcionario.setNome(Joo); funcionario.setRg(89898789); funcionario.setCpf(021.234.543-90); funcionario.setTelefone((47)30001122); funcionario.setSexo(Masculino); funcionario.setEstadoCivil(Casado); funcionario.setCarteiraTrabalho(9876234653); funcionario.setSalario(2000);

    Pessoa pessoa = new Pessoa(); pessoa = funcionario;

    pessoa.queTipoSou();

    }

    //implementao dos mtodos

    }

  • 59PROGRAMAO ORIENTADA A OBJETOS I

    Agora temos um objeto do tipo Pessoa, que faz referncia a um objeto do tipo Funcionario. Lembre-se que um objeto sempre ser do tipo que foi criado, nunca muda, at ser destrudo. Logo, se utilizar o objeto do tipo Pessoa para chamar o mtodo queTipoSou, a frase impressa ser Funcionrio, apesar de estar utilizando o objeto pessoa para chamar o mtodo. Quem possibilita isso o polimorfismo.

    O assunto da prxima unidade de estudos agregao e composio. Continue atento e v fazendo os exerccios do caderno de atividades!

  • Unidade de estudo 8

    Sees de estudo

    Seo 1 - Agregao e composio

  • 61PROGRAMAO ORIENTADA A OBJETOS I

    Agregao e Composio

    SEO 1Agregao e Composio

    Assim como na herana, que uma classe estende de outra para utilizar seus atributos e mtodos, a agregao e a composio tambm tm esse mesmo objetivo. Veja agora o que agregao e composio, e qual a diferena entre esses conceitos com relao herana.

    Os conceitos de agregao e composio, inicialmente, podem gerar al-guma dvida, mas, a forma de utilizar exatamente a mesmo, o que muda o momento em que cada um ser utilizado.

    A agregao ou a composio devem ser utilizadas sempre que existir a necessidade de caractersticas de outro objeto, dentro de uma classe. Veja um exemplo, para entender melhor.

    public class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; private String endereco; private String bairro; private String cep; private String cidade; private String complemento; //implementao dos mtodos}

    Nesse exemplo, temos uma classe chamada Pessoa, alguns de seus atri-butos so correspondentes a um endereo, como endereo, bairro, cida-de e cep. Ns poderamos criar outra classe, chamada Endereco, e nesta colocar todos os atributos que esto na classe Pessoa e que se referem a um endereo. Com isso, criaremos uma nova classe, que representa um endereo, e que pode ser utilizada dentro da classe Pessoa, para isso, basta criar um atributo do tipo Endereco dentro da classe Pessoa. Veja.

  • 62 CURSOS TCNICOS SENAI

    public class Endereco { private String rua; private String bairro; private String cidade; private String cep; private String complemento;

    // implementao dos mtodos }

    Agora, com a classe Endereco j criada, possvel retirar todos os atri-butos que representam um endereo e que esto dentro da classe Pessoa. Mas, uma pessoa precisa de um endereo, ento, como fazer? Vamos utilizar a classe que acabamos de criar, chamada Endereco, e fazer uma agregao. A implementao fica desta forma:

    public class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; private Endereco endereco; public Endereco getEndereco() { return endereco; }

    public void setEndereco(Endereco endereco) { this.endereco = endereco; }

    //implementao dos demais mtodos}

    Note que agora temos acesso aos atributos do endereo por meio do atributo declarado, dentro da classe Pessoa do tipo Endereco. Para ter acesso aos atributos, basta fazer o seguinte:

    public class Locadora{ public static void main(String[] args) { Pessoa pessoa = new Pessoa(); pessoa.getEndereco().setBairro(Bom Retiro); pessoa.getEndereco().setCep(89222-365); //... }}

    Observe que, anteriormente, o exemplo foi utilizado como uma agregao, mas ser que esse exemplo no poderia ser conside-rado uma composio? Entenda melhor o conceito de cada um deles.

    Considera-se uma agregao quan-

    do todas as classes utilizadas na

    operao podem existir, sem de-

    pender umas das outras.

    No exemplo, temos uma classe Pessoa e uma classe Endereco, nesse caso, uma pessoa existe sem um endereo e um endereo pode existir sem uma pessoa, logo, a utilizao de um objeto Endereco dentro da classe Pessoa denomi-nado como agregao.

    Para representar uma agregao, podemos utilizar um diagrama que representa a relao entre as classes, onde um losango vazado (no preenchido) utilizado no lado da classe que ir possuir a outra. Veja o exemplo:

  • 63PROGRAMAO ORIENTADA A OBJETOS I

    Figura 8: Exemplo de agregao

    A composio definida quando pelo menos uma das classes no tem sen-

    tido, quando utilizada separadamente da outra.

    Um exemplo muito utilizado, para explicar esse conceito, um pedido de compra. Esse pedido uma classe e um item de compra outra clas-se, porm, um item de compra no pode existir sem que exista um pedi-do de compra, ele dependente do pedido. Por isso, temos a utilizao de uma composio, a classe item de compra no tem sentido quando utilizada separadamente.

    Para ilustrar a composio, podemos utilizar um diagrama, assim como foi utilizado na agregao, porm, a diferena que na composio o losango preenchido. Veja:

    Figura 9: Exemplo de composio

    Fazendo uso da composio e/ou da agregao, podemos centralizar caractersticas que sero utilizadas por vrias outras classes, e que po-dem ou no ser utilizadas separadamente. Dessa forma, se pode facilitar possveis manutenes do sistema e, claro, praticar o reaproveitamento de cdigo.

    E quanto ao fato de utilizar a herana, ao invs de agregao ou compo-sio? Como saber quando utilizar um ou outro conceito?

    A herana utilizada quando uma classe pode ser vista de duas formas, como no exemplo do cliente, que afirmamos que um cliente pode ser uma pessoa.

    No exemplo, que uma pessoa no pode ser, mas pode conter um ende-reo, utiliza-se a agregao ou composio.

    Para facilitar a identificao de qual conceito utilizar, existem dois exem-plos muito utilizados e simples. Basta montar frases utilizando ou contm. Se na frase encaixar o , ento voc deve utilizar a herana.

    Se o contm encaixar melhor na frase, voc deve utilizar ou a agre-gao ou a composio. Exemplo:

    Um cliente uma pessoa. Uma pessoa contm um en-dereo.

    Nos exemplos apresentados no destaque, voc pde notar facil-mente na primeira frase que um cliente uma pessoa e no con-tm uma pessoa, logo, se utiliza herana. J na segunda frase, uma pessoa contm um endereo e no um endereo, logo, , se utili-za a agregao.

    Em vrios momentos do curso, voc acompanhou a informao de que os conceitos podem per-mitir reaproveitamento de cdi-gos j desenvolvidos em outras classes, tornando as aplicaes cada vez mais fceis de compre-ender e manutenir.

    O prximo assunto a ser estuda-do, est ligado a essa funcionalida-de: as classes abstratas. Mas antes de continuar, realize os exerccios 28 e 29 do caderno de atividades prticas.

  • Unidade de estudo 9

    Sees de estudo

    Seo 1 - Classes abstratas

  • 65PROGRAMAO ORIENTADA A OBJETOS I

    Classes Abstratas

    SEO 1Classes abstratas

    As classes abstratas no podem ser utilizadas como instncia direta, ou seja, voc no pode utilizar o new para criar um objeto de uma classe abstrata. Mas para que serve uma classe, se voc no pode instanci-la? Podemos dizer que uma classe abstrata utilizada como um molde para outras classes. Para fazer isso, vamos utilizar a herana. Vamos tra-balhar novamente com as classes Pessoa, Funcionario e Cliente?

    No sistema de locadora, teremos que cadastrar os funcionrios e os clientes da loja. Como funcionrios e clientes so pessoas, faz sentido ter um cadastro de pessoas, mas ao cadastrar preciso saber quem funcionrio e quem cliente. Podemos, ento, utilizar uma classe Pessoa para reunir todas as caractersticas em comum das demais classes, que podem ser consideradas pessoas.

    Fazendo isso, teremos uma classe modelo, que ser a Pessoa, e outras classes que iro estender dessa modelo para reaproveitar suas caracte-rsticas. Para definir uma classe como sendo um modelo, se utiliza a palavra chave abstract. Dentro dessa classe, podemos ou no, ter mto-dos abstratos, assim como, ter mtodos no abstratos. Tornando a classe Pessoa abstrata, ela ficaria assim:

    abstract class Pessoa { private String nome; private String telefone; private String rg; private String cpf; private String estadoCivil; private String sexo; abstract void cadastroCpf(String cpf);

    //implementao dos demais mtodos}

    Agora temos a classe Pessoa como sendo abstrata, note que apenas adi-cionamos a palavra chave abstract no incio da criao da classe. Alm dessa alterao, criamos tambm um mtodo abstrato, o mtodo ca-dastroCpf, isso significa que na classe abstrata Pessoa existe apenas a assinatura do mtodo, e este dever ser implementado nas classes que estenderem da classe Pessoa. Logo, as classes Funcionario e Cliente fi-cam da seguinte forma:

  • 66 CURSOS TCNICOS SENAI

    public class Funcionario extends Pessoa { private float salario; private String carteiraTrabalho;

    public void cadastroCpf(String cpf){ if(cpf.length() >= 11){ super.cadastroCpf(cpf); } else{ System.out.println(CPF do funcionrio invlido.); } }

    //implementao dos demais mtodos}public class Cliente extends Pessoa { private float dependentes;

    public void cadastroCpf(String cpf){ if(cpf.length() >= 11){ super.cadastroCpf(cpf); } else{ System.out.println(CPF do cliente invlido.); } }

    //implementao dos demais mtodos}

    Note que ambas as classes, utilizaram a palavra extends para trabalhar com herana, estendendo da classe Pessoa. Como na classe Pessoa existe um mtodo abstrato, este deve ser implementado em todas as classes filhas da classe Pessoa, e isso foi feito nas duas classes filhas.

    Resumindo, quais so as principais caractersticas das classes abstratas?

    Elas servem como modelo para outras classes. No podem ser instanciadas, ou seja, no se pode utilizar a palavra-

    -chave new para uma classe abstrata.

    Pode-se implementar mtodos abstratos dentro de uma classe abs-trata.

    Mtodos abstratos no possuem implementao, apenas a assinatura do mtodo.

    Pode-se implementar mtodos no abstratos den