Apostila de Programação OO - SENAI PDF
Apostila de Programação OO - SENAI PDF
Apostila de Programação OO - SENAI PDF
Rafael Lucchesi
Diretor do Departamento Nacional do SENAI
Alcantaro Corra
Presidente da Federao da Indstria do Estado de Santa Catarina
Florianpolis/SC 2011
proibida a reproduo total ou parcial deste material por qualquer meio ou sistema sem o prvio consentimento do editor.
Prefcio
Voc faz parte da maior instituio de educao profissional do estado. Uma rede de Educao e Tecnologia, formada por 35 unidades conectadas 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, desenvolver 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 Movimento promove a discusso, a reviso e o aprimoramento dos processos de educao do SENAI. Buscando manter o alinhamento com as necessidades do mercado, ampliar as possibilidades do processo educacional, oferecer recursos didticos de excelncia e consolidar o modelo de Educao 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 animaes, 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 Apresentao 9 11 46 Unidade de estudo 5 Pacotes, como Organizar suas Classes
69 47 Seo 1 - Pacotes, como organizar suas classes
Seo 1 - Interface
Finalizando Referncias
79 81
Polimorfismo
43
Contedo Formativo
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
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 graduado em Cincia da Computao pela Universidade do Estado de Santa Catarina (UDESC) e ps-graduado em Engenharia da Produo pela Faculdade de Tecnologia Internacional (FATEC). Atua no SENAI em Joinville como instrutor de cursos tcnicos em informtica, tendo atuado tambm como instrutor nos cursos de aprendizagem industrial. Ainda no SENAI trabalhou como pesquisador desenvolvendo um projeto com a tecnologia de identificao por radio frequncia (RFID). Atualmente, alm das atividades de docncia, atua como Analista de Sistemas, trabalhando com tecnologia e inovao na rea de Gerenciamento Eletrnico de Documentos (GED) e Gerenciamento 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 real Seo 2 - Relao com o mundo da programao Seo 3 - Classes e objetos Seo 4 - Mtodos e atributos
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 mundo da programao.
13
SEO 2
Com base nessa anlise, j possvel definir alguns itens como classes obrigatrias do nosso sistema. Veja:
DICA
Para facilitar o estudo e entendimento do material, ser utilizado o exemplo da videolocadora. Nos exerccios, ser empregado o de uma fbrica de carros e motos. Esse processo vai facilitar 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, realizando o exerccio 1 do caderno de atividades prticas.
como, nome, tempo de durao, ano de lanamento, categoria, diretor, nmero de atores, lugar onde foi filmado, tempo de durao 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 desenvolvimento 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 estiver sendo alugado? Essa uma informao desnecessria, e, pensando dessa forma, a nossa classe Filme ficaria com os seguintes atributos:
Essas quatro caractersticas facilitam a busca do filme dentro da locadora e ainda permitem fornecer aos clientes informaes, que normalmente lhes interessam, como, o ano de lanamento e a durao do filme.
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 solicitar algumas informaes para fazer o cadastro, como alguns dados pessoais e endereo.
Aps a realizao do cadastro, voc poder se dirigir at a categoria de filmes do seu interesse e escolher um filme, que pode ser de qualquer tipo de mdia (DRD, blue-ray ou outro).
Aps a identificao das classes, necessrio identificar tambm os seus atributos. Para isso, responda a pergunta: quais so as caractersticas dessas classe? Ao mesmo tempo em que se responde a essa pergunta, possvel definir as caractersticas necessrias para que o sistema seja desenvolvido. Fazendo isso, tm-se novas classes definidas e prontas. Para entender melhor como responder a essa pergunta, vamos analisar com calma a classe Filme, da nossa lista de classes. Pensando em um filme, podemos imaginar vrias caractersticas, tais
DICA
Aproveite e defina os atributos para cada classe que voc identificou para o seu sistema de fbrica de carros e motos, resolvendo o exerccio 2 do caderno de atividades prticas.
Para fazermos uma descrio mais tcnica das classes, podemos utilizar a UML para represent-las. importante lembrar que a UML (Unified Modeling Language) uma linguagem utilizada para descre-
14
ver, de forma grfica e padronizada, sistemas desenvolvidos utilizando o conceito de orientao a objetos. (BOOCH; RUMBAUGH; JACOBSON, 2006) Para fazer uma descrio mais tcnica das classes utiliza-se a UML, por meio do diagrama de classes, que representado por um retngulo 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 Filme no diagrama de classe UML.
SEO 3
Classes e objetos
At agora, voc aprendeu a definir as classes e seus atributos, tornando possvel o desenvolvimento de um sistema para uma videolocadora. Agora, veja como criar essas classes, aplicando a linguagem de programao Java, utilizada no desenvolvimento de sistemas orientados a objetos. 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 criarmos uma classe, devemos seguir um padro, que o seguinte:
Os modificadores de acesso (sero estudados na unidade de estudo seguinte) no so obrigatrios. A palavra reservada class, identifica a classe, 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; }
DICA
Teste o diagrama de classe, realizando o exerccio 3 do caderno de atividades prticas. 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 composto 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 .
Aps voc ter definido as classes e seus atributos, a hora de pass-las para o computador em uma linguagem que a mquina entenda. Para isso, utilizaremos a linguagem de programao Java, que uma linguagem robusta, segura e multiplataforma, capaz de rodar em qualquer mquina, independente do sistema operacional.
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 caracteres, 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.
15
DICA
Aproveite que voc acabou de definir a classe Filmes, e realize o exerccio 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 Filme, 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 precisamos 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
16
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 operador 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 atividades prticas.
Em um sistema, pode-se criar quantos objetos forem necessrios. No nosso exemplo, precisaremos criar vrios, um para cada filme cadastrado 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 } }
17
Nesse exemplo foram criados dois objetos filme01 e filme02. Note que antes do texto acessar e setar valores aos atributos, foram inseridas duas barras, isso para a linguagem de programao significa comentrio, 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 atributos 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 Filme, 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(); } }
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:
18
Nesse exemplo, os atributos do tipo Filme chamados filme01 e filme02, fazem referncia a locais diferentes na memria, nesses locais esto armazenados 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 programa. 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.
19
sempre iro acessar o mesmo objeto 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.
Agora imagine, se fizermos alguma alterao em qualquer um dos objetos, o que ir acontecer? Observe o exemplo:
Na prxima seo, voc aprender a criar e invocar mtodos criados dentro de suas respectivas classes.
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); } }
SEO 4
Mtodos e atributos
At o momento voc aprendeu a definir uma classe e seus atributos, mas e agora? O que fazer com eles? Dentro de cada classe preciso definir o que ela faz, ou seja, o seu comportamento. Definindo as funes dentro da prpria classe, fica fcil encontrar no programa onde os procedimentos so realizados. Essas funes so chamadas de mtodos, que so os responsveis por realizar as operaes com os objetos. Todo mtodo possui uma assinatura, que vai identific-lo em todo o sistema. Essa assinatura composta por quatro itens, modificadores de acesso, retorno, nome do mtodo e seus parmetros. Os modificadores de acesso sero estudados na unidade de estudo seguinte. A estrutura dos mtodos fica da seguinte forma:
Nesse caso, alteramos a categoria do objeto filme02, e logo abaixo estamos 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 outro, eles faro referncia ao mesmo endereo de memria, ou seja, eles
20
Os modificadores de acesso no so obrigatrios. O nmero de parmetros 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, podemos 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 cadastrarFilme, note que para acessar um mtodo tambm utilizado o operador ponto. Para que isso fosse possvel, foi criado um objeto do tipo Locadora 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 cadastrarFilme s poderia criar objetos do filme Avatar, mas com a passagem de parmetro, podemos criar qualquer tipo de filme utilizando esse mtodo. O exemplo a seguir mostra isso.
PROGRAMAO ORIENTADA A OBJETOS I 21
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 atributos 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.
22
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; } }
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 definida 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 chamada 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.
23
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 especificado 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 mtodo dela. Tanto os atributos de instncia, quanto os de classe, so tambm atributos globais. Atributos locais: so atributos criados dentro de um mtodo ou blocos 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.
24
DICA
Agora, treine, realizando o exerccio 8 do caderno de atividades prticas.
Nessa unidade de estudos, voc aprendeu a definir as classes e seus atributos, 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.
25
Unidade de estudo 2
Sees de estudo
Seo 1 - Controle de Acesso Seo 2 - Encapsulamento
Acessibilidade
SEO 1
Controle de acesso
Voc j parou para pensar nos recursos que so utilizados para proteger voc e a sua casa? Normalmente so colocadas cercas, muros altos, ces de guarda, alarmes, grades nas janelas e portas, entre outros, e todos com o mesmo 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 possvel, utilizam-se os modificadores de acesso. Como voc j viu na unidade de estudo anterior, os controladores de acesso fazem parte das assinaturas dos mtodos, mas eles no so utilizados apenas em mtodos, 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 funcionrios, e que a empresa trabalha com pesquisas cientficas, e as descobertas s podem ser conhecidas por algumas pessoas. Uma das medidas tomadas para proteger essas informaes, bloqueando 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 daro mais ou menos poder de acesso aos funcionrios. Os modificadores de acesso tambm tm esse papel: bloquear o acesso a determinadas classes, mtodos e/ou atributos do sistema, de forma que outras classes no tenham acesso a um contedo 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 Deitel (2005) sobre cada um desses modificadores. Acompanhe.
Friendly: conhecido como default ou package. o modificador adotado quando no informamos 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 acesso de todas as classes do mesmo pacote. Abstract: definir, por exemplo, um mtodo como abstrato, significa dizer que esse mtodo ser desenvolvido nas subclasses, 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.
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 modificador de acesso public.
prpria classe, s subclasses (classes filhas) e s classes do mesmo pacote.
restritivo de todos, permite o acesso somente prpria classe, ou seja, os mtodos e atributos s podem ser acessados de dentro da classe, nenhuma outra tem acesso.
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 alterao no valor do atributo, essa mudana ser aplicada a todas as demais.
27
Final: quando esse modificador aplicado a um atributo, ele no pode ter seu valor alterado, tornando-se uma constante. Quando aplicado 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 alguns exemplos. Na nossa classe Locadora, exemplificada a seguir, no estamos utilizando 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 modificador 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.
28
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 modificadores, fica fcil utilizar os demais. Nos locais onde colocamos a palavra public, basta substituir pelo modificador necessrio, podendo ser protected, private ou abstract. Os modificadores static e final so utilizados em conjunto com os demais. Para entender melhor essa utilizao conjunta, vamos utilizar a nossa classe Filme 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 pblica, 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 acesso 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; }
29
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 chamado 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 devido 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; }
30
O uso do modificador final obriga que um valor seja atribudo ao atributo 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?
Se voc respondeu que ir gerar um erro no momento de compilar o programa, voc acertou. O compilador Java vai identificar que uma operao incorreta est tentando ser executada e ir gerar um erro, no sendo possvel executar o programa. Aps termos estudado os modificadores de acesso, veremos outra forma 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 2
Encapsulamento
O objetivo de se utilizar o encapsulamento, no desenvolvimento de sistemas, 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 consultar 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 encapsulamento 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 funcionrio 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 servem, e no o que eles fazem ou o que feito com eles internamente.
31
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 manutenir 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 atributos. 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 atributos, utilize os mtodos set e get.
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 utilidade 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. Devemos 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.
32
No nosso exemplo, necessitamos liberar o acesso a todos os atributos, logo, precisamos criar os mtodos get e set para todos os atributos. Fazendo 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 atributo 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, retornar e salvar um valor em um determinado atributo.
33
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 atributo 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:
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 recuperem 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 teremos 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()); } }
34
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 seguras 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!
35
Unidade de estudo 3
Sees de estudo
Seo 1 - Construtores
Construtores
SEO 1
Construtores
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.
37
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 classe, acredite, ele esta l! Agora voc pode ter ficado com outra dvida: se o Java cria como padro 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:
38
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:
39
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 cadastrarFilme sofreu alteraes. A criao do objeto Filme agora recebeu um parmetro, correspondente ao nome do Filme e no mais necessrio 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 possuir retorno e s pode ser chamado no momento de criao de um objeto.
Uma classe pode ter quantos mtodos forem necessrios para sua utilizao, e no diferente para mtodos construtores, que permitem mais de um mtodo construtor em uma mesma classe. Veja o exemplo:
40
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
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 prticas so sobre os mtodos construtores. Que tal resolv-los e testar o que acabou de aprender?
Nesse caso criamos dois mtodos construtores, onde um recebe apenas 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); ou Filme filme01 = new Filme(nome, categoria); possvel tambm chamar um construtor de dentro de outro, lembrando do conceito do mtodo construtor que diz que ele s pode ser chamado 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.
Voc viu que possvel criar mtodos com o mesmo nome em uma mesma classe, utilizando os mtodos construtores, que possuem o mesmo nome e podem ser criados mais de um na mesma classe. Na prxima unidade de estudos voc estudar as sobrecargas de mtodos. At l!
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
41
Unidade de estudo 4
Sees de estudo
Seo 1 - Sobrecarga de mtodos
Sobrecarga de Mtodos
SEO 1
Sobrecarga 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 assinaturas 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 conceito de sobrecarga.
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:
43
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 duracao){ //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 escolher 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 execuo quando h nomes repetidos? Voc no precisa se preocupar com isso pois, quem define, o compilador, levando em considerao as diferenas dos mtodos para utiliz-los de acordo com suas caractersticas, por exemplo:
44
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?
Neste caso seria chamado o ltimo mtodo, pois, ele o nico que recebe apenas um parmetro.
Tenha bastante cuidado ao fazer sobrecarga com o mesmo nmero de parmetros, pois o compilador diferencia o tipo dos parmetros, e no o nome deles.
Nesse exemplo apresentado, foram alterados os nomes de dois parmetros, de anoLancamento para ano, e de durao para tempo. Essa mudana no caracteriza uma sobrecarga, e o seu programa no ir funcionar, pois existem dois mtodos exatamente iguais, e isso no permitido.
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!
45
Unidade de estudo 5
Sees de estudo
Seo 1 - Pacotes, como organizar suas classes
\br\com\poo\locadora
br.com.poo.locadora
Observe que na estrutura de diretrios do sistema operacional, os nomes 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 criao 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 desta, 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:
47
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 necessrias, 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, poderamos fazer um acesso direto por meio de Pessoa pessoa = new Pessoa();. 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:
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?
48
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 caminho 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); //... } }
O import vale tambm para classes externas ao projeto, por exemplo, 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, obrigatoriamente, fazer um import dela para a classe em que se quer utiliz-la. Portanto, o import ficaria da seguinte forma:
import java.util.ArrayList;
Note que agora, o package da classe mostra que o pacote da classe Locadora 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:
Fazendo isso, poderamos utilizar uma classe que no est no projeto, mas est implementada diretamente 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 somente uma classe. Nessa unidade, voc viu que podemos 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 deixar o sistema o mais limpo possvel, ou seja, importe somente as classes que sero utilizadas para no existir dvidas sobre as classes corretas.
No sistema, na classe Locadora, seria importada apenas a classe Pessoa, que a que nos interessa ter acesso. Isso o correto a ser feito.
import br.com.poo.entidade.*;
Nesse caso, se permite o acesso a todas as classes que esto dentro do pacote entidade.
Na prxima unidade, voc aprender como reaproveitar cdigos e reescrever mtodos, mas antes de continuar, realize o exerccio 21 do caderno de atividades prticas.
49
Unidade de estudo 6
Sees de estudo
Seo 1 - Reaproveitamento de cdigo Seo 2 - Reescrita de mtodos
Herana
SEO 1
Reaproveitamento de cdigo
Os sistemas, de um modo geral, evoluram muito nos ltimos anos e para que essa evoluo acontecesse, foi necessrio escrever muitas 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 herana 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 herana gentica, que o filho herda caractersticas do pai. 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 novamente 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.
51
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 classe 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 dependentes, 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, desnecessariamente.
A classe que herda os atributos e mtodos chamada de filha ou subclasse, 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 classe tem acesso a ele. Isso vale tambm para herana, as subclasses no herdam os atributos e mtodos criados como private. Para que seja possvel 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 cdigo 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; }
52 CURSOS TCNICOS SENAI
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 precisamos 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 acessar 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 assunto da prxima seo de estudo.
53
SEO 2
Reescrita de Mtodos
Nem sempre os mtodos herdados possuem o comportamento que queramos. 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 Pessoa, 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 fazendo uma validao simples com relao ao tamanho do nmero informado. Tal documento, para ser vlido, deve possuir pelo menos onze dgitos, logo, se informar menos, o cpf invlido.
54
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.
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 mtodo reescrito, se estiver tudo certo, chamado o mtodo herdado para fazer o cadastro efetivo. A reescrita de mtodos muito importante para mudar o comportamento 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 prticas e teste o que acabou de aprender. Ah! Preste ateno na informao do exerccio 25, h um comentrio sobre duas expresses novas. Continue atento!
55
Unidade de estudo 7
Sees de estudo
Seo 1 - Polimorfismo
Polimorfismo
SEO 1
Polimorfismo
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); } } //implementao dos mtodos Pessoa pessoa = new Pessoa(); pessoa = funcionario;
A operao realizada s possvel graas ao polimorfismo, que a capacidade de fazer referncia a um objeto de formas diferentes.
No exemplo, estamos nos referenciando a um funcionrio como sendo 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 Pessoa 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:
57
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, chamarmos 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); } } //implementao dos mtodos Pessoa pessoa = new Pessoa(); pessoa = funcionario; pessoa.queTipoSou();
58
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!
59
Unidade de estudo 8
Sees de estudo
Seo 1 - Agregao e composio
Agregao e Composio
SEO 1
Agregao 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 alguma 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 atributos so correspondentes a um endereo, como endereo, bairro, cidade 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.
61
public class Endereco { private String rua; private String bairro; private String cidade; private String cep; private String complemento; } // implementao dos mtodos
Observe que, anteriormente, o exemplo foi utilizado como uma agregao, mas ser que esse exemplo no poderia ser considerado uma composio? Entenda melhor o conceito de cada um deles.
Considera-se uma agregao quando todas as classes utilizadas na operao podem existir, sem depender umas das outras.
Agora, com a classe Endereco j criada, possvel retirar todos os atributos 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
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 denominado 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:
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); //... } }
62
Se o contm encaixar melhor na frase, voc deve utilizar ou a agregao ou a composio. Exemplo:
Um cliente uma pessoa. Uma pessoa contm um endereo.
A composio definida quando pelo menos uma das classes no tem sentido, 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 classe, porm, um item de compra no pode existir sem que exista um pedido 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:
Nos exemplos apresentados no destaque, voc pde notar facilmente na primeira frase que um cliente uma pessoa e no contm uma pessoa, logo, se utiliza herana. J na segunda frase, uma pessoa contm um endereo e no um endereo, logo, , se utiliza a agregao. Em vrios momentos do curso, voc acompanhou a informao de que os conceitos podem permitir reaproveitamento de cdigos j desenvolvidos em outras classes, tornando as aplicaes cada vez mais fceis de compreender e manutenir. O prximo assunto a ser estudado, est ligado a essa funcionalidade: as classes abstratas. Mas antes de continuar, realize os exerccios 28 e 29 do caderno de atividades prticas.
Fazendo uso da composio e/ou da agregao, podemos centralizar caractersticas que sero utilizadas por vrias outras classes, e que podem 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 composio? 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 endereo, utiliza-se a agregao ou composio. Para facilitar a identificao de qual conceito utilizar, existem dois exemplos muito utilizados e simples. Basta montar frases utilizando ou contm. Se na frase encaixar o , ento voc deve utilizar a herana.
63
Unidade de estudo 9
Sees de estudo
Seo 1 - Classes abstratas
Classes Abstratas
SEO 1
Classes 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 trabalhar 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 caractersticas. Para definir uma classe como sendo um modelo, se utiliza a palavra chave abstract. Dentro dessa classe, podemos ou no, ter mtodos 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 adicionamos a palavra chave abstract no incio da criao da classe. Alm dessa alterao, criamos tambm um mtodo abstrato, o mtodo cadastroCpf, 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 ficam da seguinte forma:
65
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-
Pode-se implementar mtodos abstratos dentro de uma classe abstrata. Mtodos abstratos no possuem implementao, apenas a assinatura do mtodo. Pode-se implementar mtodos no abstratos dentro de uma classe abstrata.
filhas.
66
Pode-se ainda representar as classes com o uso de uma classe abstrata por meio dediagramas de classes UML. Veja na figura a seguir.
Perceba que esse diagrama aquele apresentado quando estudamos a herana. Sabe por qu? Porque as classes abstratas so utilizadas para se trabalhar com herana e como no podemos instanciar uma classe abstrata, ela utilizada para ser herdada por outras classes. Para no se confundir, lembre sempre que a herana existe, perfeitamente, sem as classes abstratas, mas, as classes abstratas dependem da herana para serem utilizadas. Na prxima unidade de estudo voc aprender a criar as interfaces. Continue atento e bom estudo!
67
Unidade de estudo 10
Sees de estudo
Seo 1 - Interface
Interface
SEO 1
Interface
A linguagem de programao Java no permite que classes herdem de mais de uma classe, ou seja, elas podem ter no mximo uma superclasse. Para suprir essa necessidade de herdar propriedades de mais de uma classe, foi desenvolvido o conceito de interfaces. Diferente das classes abstratas, as interfaces no podem conter implementaes de mtodos e declaraes de atributos que no sejam do tipo public, static e final. As interfaces possuem apenas as assinaturas dos mtodos, por isso dizemos que as elas so como contratos, depois que assinamos, temos a obrigao de implementar todos os mtodos do contrato, ou seja, implementar todas as assinaturas de mtodos que existem na interface. Para criar uma interface, basta substituir a palavra class por interface. Para ilustrar, vamos alterar a nossa classe Pessoa para que ela se torne uma interface, veja o exemplo a seguir:
interface Pessoa { String nome = Maria; } public void cadastroCpf(String cpf); //assinatura dos demais mtodos
Nesse exemplo, no temos mais a palavra class, e sim interface. Quando existir um atributo criado dentro de uma interface, ele j deve ser inicializado, pois, mesmo sem informar, esse atributo final (constante), alm de esttico e pblico. Alm dessas mudanas, os mtodos no podem mais ser implementados. Observe que no exemplo, temos apenas a assinatura do mtodo. Quando utilizamos uma interface em outra classe, dizemos que estamos implementando uma interface, para isso, utilizamos a palavra reservada implements. Observe o exemplo aplicado s classes Funcionario e Cliente.
69
public class Funcionario implements 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 implements 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
Perceba que nas duas classes utilizamos a palavra-chave implements para afirmar que as classes Funcionario e Cliente vo implementar todos os mtodos da interface Pessoa. Uma das vantagens em utilizar interface que se pode implementar mais de uma na mesma classe. Para fazer isso, basta separar por vrgula as interfaces que se deseja implementar, exemplo:
public class Funcionario implements Pessoa, SegundaInterface, TerceiraInterface { //Criao de atributos //implementao dos mtodos }
Nesse exemplo, separamos por vrgula trs interfaces - Pessoa, SegundaInterface e TerceiraInterface, pois, estamos nos responsabilizando por assinar trs contratos, e com isso, temos que implementar os mtodos assinados em todas as interfaces.
70
Deve ficar bem claro que quando se fala em interface, que, aqui, no definido como as coisas so feitas (implementao), mas sim, o que ser feito (assinatura). Na programao orientada a objeto, muito importante pensar dessa forma, fazendo assim, as classes acabam ficando mais fceis de entender e de manutenir.
Diversos autores aconselham amplamente o uso de interfaces, ao invs de herana. A herana, se utilizada sem conhecimento, pode tornar seu cdigo perigoso. J no uso de interfaces, cada classe responsvel pela sua implementao, pois estamos programando voltados interface, o que mais aconselhado.
DICA
Na prxima unidade de estudos, voc vai entender como o computador consegue executar vrias coisas ao mesmo tempo, mas antes, teste o que aprendeu nesta unidade realizando os exerccios 33 e 34 do caderno de atividades prticas. At mais!
71
Unidade de estudo 11
Sees de estudo
Seo 1 - Apndice Programao concorrente e threads
A classe que chamamos de Sistema, implementa a interface Runnable, e ao implementar essa a classe precisa implementar o mtodo run, que responsvel por dar incio execuo da thread. Veja no exemplo a seguir, uma implementao desse mtodo.
73
public class Sistema implements Runnable{ private String nome; //get e set para a varivel nome public void run() { int i = 0; while(i<10){ System.out.println(Sistema executado por + nome + !); i++; } } }
No exemplo, o mtodo run imprimir uma frase dez vezes, informando quem executou o sistema. Para iniciar a thread, basta chamar tal mtodo. Veja no exemplo a seguir.
public class Principal{ public static void main(String[] args) { Sistema sis = new Sistema(); sis.setNome(Maria); new Thread(sis).start(); } }
Devemos criar um objeto da classe Sistema, que a classe que implementa uma thread, feito isso, colocamos um valor para o atributo nome e em seguida criamos uma nova thread para receber o nosso sistema. A chamada ao mtodo start() que vai iniciar a execuo do mtodo run() da classe sistema. Nesse caso, a frase que ser impressa a seguinte:
Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Maria!
Para visualizar a execuo dos sistemas em paralelo, podemos iniciar vrias execues ao mesmo tempo, alterando o mtodo main para iniciar vrios sistemas. Com a alterao, fica assim:
74
public class Principal { public static void main(String[] args) { Sistema sis = new Sistema(); sis.setNome(Maria); new Thread(sis).start(); Sistema sis2 = new Sistema(); sis2.setNome(Joo); new Thread(sis2).start(); Sistema sis3 = new Sistema(); sis3.setNome(Pedro); new Thread(sis3).start(); Sistema sis4 = new Sistema(); sis4.setNome(Julia); new Thread(sis4).start(); } }
Com a alterao realizada no mtodo main, quatro pessoas esto iniciando seus sistemas, nesse caso, sero impressas quarenta frases, s que dessa vez, elas sero impressas intercaladas, pois a execuo dos sistemas realizada em paralelo, devido ao uso das threads. As frases ficam da seguinte forma:
Sistema executado por Maria! Sistema executado por Maria! Sistema executado por Joo! Sistema executado por Pedro! Sistema executado por Maria! Sistema executado por Julia! Sistema executado por Julia! Sistema executado por Pedro! Sistema executado por Joo! Sistema executado por Julia! Sistema executado por Pedro! Sistema executado por Joo! Sistema executado por Maria! Sistema executado por Joo! Sistema executado por Pedro! Sistema executado por Maria! Sistema executado por Maria! ...
75
Observando as frases, podemos perceber que os sistemas esto sendo executados em paralelo, pois se no estivessem primeiro, seriam impressas todas as frases com o nome de Maria, depois todas com o nome Joo, depois as do Pedro e por ltimo as frases da Julia, pois essa foi a ordem que chamamos o mtodo run() no main. Imagine agora, que existem mtodos que no podem ser executados ao mesmo tempo por threads diferentes, pois podem causar inconsistncias de valores no sistema. Para que isso no ocorra, podemos controlar o acesso aos mtodos, ou at mesmo a blocos de cdigos dentro de mtodos, de modo que apenas uma thread execute esse bloco e as demais ficam esperando a sua vez na fila. Para isso, utilizamos a palavra-chave synchronized. Vamos alterar a classe Principal para chamar um mtodo synchronized, e imprimir as nossas frases de execuo do sistema. Veja como ficariam as alteraes
public class Sistema implements Runnable{ private String nome; //get e set para a varivel nome public synchronized void iniciarSistema(){ int i = 0; while(i<10){ System.out.println(Sistema executado por + nome + !); i++; } } public void run() { iniciarSistema(); } }
No exemplo foi criado um novo mtodo, e colocado tudo que estava no mtodo run dentro desse novo mtodo, chamado de iniciarSistema. A diferena que o mtodo foi criado, utilizando a palavra chave synchronized junto ao modificador de acesso. Com essa alterao, ao executar o programa, as frases no ficaram intercaladas, e sim agrupadas de dez em dez, pois o mtodo que imprime as frases s pode ser acessado por meio de uma thread por vez. Pode-se, ainda, deixar apenas uma parte do cdigo como synchronized, veja no exemplo a seguir:
76
public void iniciarSistema(){ synchronized(this){ int i = 0; while(i<10){ System.out.println(Sistema + i + em execuo!); i++; } } //continuao do mtodo }
Nesse caso, mais de uma thread pode chegar at o mtodo iniciarSistema, porm no trecho que est entre o bloco synchronized, apenas uma thread poder ser executada por vez. Utilizando as threads, possvel realizar vrias atividades ao mesmo tempo no mesmo sistema, e ainda controlar quando uma ou mais threads podem acessar um determinado mtodo ou trecho de cdigo do nosso sistema simultaneamente.
77
Finalizando
Parabns, voc acaba de concluir mais uma etapa do Curso Tcnico em Informtica. Durante o estudo voc pde entender que tudo o que est ao nosso redor pode se tornar um objeto e pode ser representado dentro de um sistema. Entendeu que o reaproveitamento de cdigo reduz o tempo de desenvolvimento de um sistema, auxilia no momento de manutenir o sistema e facilita o entendimento, entre outras vantagens. A orientao a objetos empregada em inmeras linguagens e utilizada por grandes empresas. Tendo conhecimento dos conceitos fundamentais da POO, o profissional aprende outras linguagens mais facilmente, sem contar que o conhecimento das prticas da orientao a objeto um grande diferencial no momento de buscar uma vaga no mercado de trabalho. recomendvel que, de vez em quando, voc releia as unidades de estudos e aperfeioe seus conhecimentos buscando outras fontes de informao. Nunca pare de estudar, a informtica est em constante evoluo, e nosso papel acompanh-la para sermos profissionais de sucesso. Sucesso e at uma prxima!
79
Referncias
BOOCH, Grady; RUMBAUGH, James; JACOBSON, Ivar. UML Guia do Usurio. 2. ed. Rio de Janeiro: Campus, 2006. DEITEL, Paul J. Java: como programar. 6. ed. So Paulo: Pearson, 2005. 1152 p. SIERRA, Kathy; BATES, Bert. Use a cabea! Java. Traduo da segunda edio. Rio de janeiro, RJ: Editora Alta Books, 2005. 470 p.
Bibliografia complementar
LUCKOW, Decio Heinzelmann; MELO, Alexandre Altair de. Programao Java Para a Web Aprenda a desenvolver uma aplicao financeira pessoal com as ferramentas mais modernas da plataforma Java. So Paulo: Novatec, 2010. SINTES, Anthony. Aprenda Programao Orientada a Objetos em 21 dias. So Paulo: Makron Books, 2002. SOMMERVILLE, Ian. Engenharia de Software. 8. ed. So Paulo: Pearson, 2007.
81
Design Educacional Evelin Lediani Bao Capa, Ilustraes, Tratamento de Imagens Dimitre Camargo Martins Diego Fernandes Luiz Eduardo Meneghel Diagramao Carlos Filip Lehmkuhl Loccioni Reviso e Fechamento de Arquivos Daniela de Oliveira Costa Juliana Vieira de Lima Reviso Ortogrfica e Normatizao SENAI/SC em Jaragu do Sul
83