You are on page 1of 162

Professor Dr. Edson A.

Oliveira Junior

PROGRAMAO I (JAVA)

GRADUAO ANLISE E DESENVOLVMENTO DE SISTEMAS

MARING-PR 2013

Reitor: Wilson de Matos Silva Vice-Reitor: Wilson de Matos Silva Filho Pr-Reitor de Administrao: Wilson de Matos Silva Filho Pr-Reitor de EAD: Willian Victor Kendrick de Matos Silva Presidente da Mantenedora: Cludio Ferdinandi

NEAD - Ncleo de Educao a Distncia


Diretor Comercial, de Expanso e Novos Negcios: Marcos Gois Diretor de Operaes: Chrystiano Mincoff Coordenao de Marketing: Bruno Jorge Coordenao de Sistemas: Fabrcio Ricardo Lazilha Coordenao de Polos: Reginaldo Carneiro Coordenao de Ps-Graduao, Extenso e Produo de Materiais: Renato Dutra Coordenao de Graduao: Ktia Coelho Coordenao Administrativa/Servios Compartilhados: Evandro Bolsoni Coordenao de Curso: Danillo Xavier Saes Supervisora do Ncleo de Produo de Materiais: Nalva Aparecida da Rosa Moura Capa e Editorao: Daniel Fuverki Hey, Fernando Henrique Mendes, Humberto Garcia da Silva, Jaime de Marchi Junior, Jos Jhonny Coelho, Robson Yuiti Saito e Thayla Daiany Guimares Cripaldi Superviso de Materiais: Ndila de Almeida Toledo Reviso Textual e Normas: Hellyery Agda Gonalves da Silva, Janana Bicudo Kikuchi, Jaquelina Kutsunugi, Keren Pardini, Maria Fernanda Canova Vasconcelos e Nayara Valenciano

Ficha catalogrfica elaborada pela Biblioteca Central - UniCesumar

C397

CENTRO UNIVERSITRIO DE MARING. Ncleo de Educao a distncia: Programao I (JAVA) / Edson A. Oliveira Junior. Maring Pr., 2013. 162 p. Curso de Graduao em Anlise e Desenvolvimento de Sistemas EaD.

1. Programao I. 2. JAVA . EaD. I. Ttulo. CDD - 22 ed. 005.1

As imagens utilizadas neste livro foram obtidas a partir dos sites PHOTOS.COM e SHUTTERSTOCK.COM.

Av. Guedner, 1610 - Jd. Aclimao - (44) 3027-6360 - CEP 87050-390 - Maring - Paran - www.cesumar.br NEAD - Ncleo de Educao a Distncia - bloco 4- (44) 3027-6363 - ead@cesumar.br - www.ead.cesumar.br

PROGRAMAO I (JAVA)
Professor Dr. Edson A. Oliveira Junior

APRESENTAO DO REITOR

Viver e trabalhar em uma sociedade global um grande desafio para todos os cidados. A busca por tecnologia, informao, conhecimento de qualidade, novas habilidades para liderana e soluo de problemas com eficincia tornou-se uma questo de sobrevivncia no mundo do trabalho. Cada um de ns tem uma grande responsabilidade: as escolhas que fizermos por ns e pelos nossos far grande diferena no futuro. Com essa viso, o Centro Universitrio Cesumar assume o compromisso de democratizar o conhecimento por meio de alta tecnologia e contribuir para o futuro dos brasileiros. No cumprimento de sua misso promover a educao de qualidade nas diferentes reas do conhecimento, formando profissionais cidados que contribuam para o desenvolvimento de uma sociedade justa e solidria , o Centro Universitrio Cesumar busca a integrao do ensino-pesquisa-extenso com as demandas institucionais e sociais; a realizao de uma prtica acadmica que contribua para o desenvolvimento da conscincia social e poltica e, por fim, a democratizao do conhecimento acadmico com a articulao e a integrao com a sociedade. Diante disso, o Centro Universitrio Cesumar almeja ser reconhecida como uma instituio universitria de referncia regional e nacional pela qualidade e compromisso do corpo docente; aquisio de competncias institucionais para o desenvolvimento de linhas de pesquisa; consolidao da extenso universitria; qualidade da oferta dos ensinos presencial e a distncia; bem-estar e satisfao da comunidade interna; qualidade da gesto acadmica e administrativa; compromisso social de incluso; processos de cooperao e parceria com o mundo do trabalho, como tambm pelo compromisso e relacionamento permanente com os egressos, incentivando a educao continuada. Professor Wilson de Matos Silva Reitor
PROGRAMAO I (JAVA) | Educao a Distncia

Seja bem-vindo(a), caro(a) acadmico(a)! Voc est iniciando um processo de transformao, pois quando investimos em nossa formao, seja ela pessoal ou profissional, nos transformamos e, consequentemente, transformamos tambm a sociedade na qual estamos inseridos. De que forma o fazemos? Criando oportunidades e/ou estabelecendo mudanas capazes de alcanar um nvel de desenvolvimento compatvel com os desafios que surgem no mundo contemporneo. O Centro Universitrio Cesumar mediante o Ncleo de Educao a Distncia, o(a) acompanhar durante todo este processo, pois conforme Freire (1996): Os homens se educam juntos, na transformao do mundo. Os materiais produzidos oferecem linguagem dialgica e encontram-se integrados proposta pedaggica, contribuindo no processo educacional, complementando sua formao profissional, desenvolvendo competncias e habilidades, e aplicando conceitos tericos em situao de realidade, de maneira a inseri-lo no mercado de trabalho. Ou seja, estes materiais tm como principal objetivo provocar uma aproximao entre voc e o contedo, desta forma possibilita o desenvolvimento da autonomia em busca dos conhecimentos necessrios para a sua formao pessoal e profissional. Portanto, nossa distncia nesse processo de crescimento e construo do conhecimento deve ser apenas geogrfica. Utilize os diversos recursos pedaggicos que o Centro Universitrio Cesumar lhe possibilita. Ou seja, acesse regularmente o AVA Ambiente Virtual de Aprendizagem, interaja nos fruns e enquetes, assista s aulas ao vivo e participe das discusses. Alm disso, lembre-se que existe uma equipe de professores e tutores que se encontra disponvel para sanar suas dvidas e auxili-lo(a) em seu processo de aprendizagem, possibilitando-lhe trilhar com tranquilidade e segurana sua trajetria acadmica. Ento, vamos l! Desejo bons e proveitosos estudos! Professora Ktia Solange Coelho Coordenadora de Graduao do NEAD - UniCesumar

PROGRAMAO I (JAVA) | Educao a Distncia

APRESENTAO
Livro: PROGRAMAO I (JAVA)
Professor Dr. Edson A. Oliveira Junior

Prezado(a) acadmico(a), com grande satisfao que apresento a voc o livro de Programao I (Java). Este material foi elaborado com o objetivo de contribuir em sua formao, especialmente a de desenvolvedor(a) de software. Sou o professor Edson A. de Oliveira Junior, autor deste livro. Voc pode ter certeza que este foi preparado com carinho especial para que voc possa entender o que essa disciplina pode te trazer de benefcio ao longo de sua vida como desenvolvedor(a) e/ou analista de sistemas. Antes de iniciar os seus estudos relacionados a este material, vou me apresentar adequadamente: sou Bacharel em Informtica pela Universidade Estadual de Maring (UEM), Mestre em Cincia da Computao pela Universidade Estadual de Maring (UEM) e Doutor em Cincias de Computao e Matemtica Computacional pelo Instituto de Cincias Matemticas e de Computao (ICMC) da Universidade de So Paulo (USP). Todos esses ttulos foram obtidos na rea de concentrao de Engenharia de Software, em que minha especialidade Linha de Produto de Software e Gerenciamento de Variabilidade, alm de Arquitetura de Software, Desenvolvimento Baseado em Componentes (DBC), Frameworks, Metamodelagem e Modelagem UML. DBC e Frameworks so temas de pesquisa que envolvem no s a modelagem de sistemas, mas a implementao de sistemas e suas arquiteturas. Participo de vrios cursos de Ps-Graduao em diversas instituies de ensino superior como a prpria UEM, UNIPAR, Faculdade Integrado, Unicesumar, Faculdade Alfa, Instituto Paranaense de Ensino e Faculdade Cidade Verde. Possuo as seguintes certificaes da Tecnologia Java: Sun Certified Java Associate, Sun Certified Java Programmer, Sun Certified Java Developer, Sun Certified Web Component Developer e Sun Certified Business Component Developer, todas elas certificadas pela Sun Microsystems entre os anos de 2003 e 2007. Ministro esta disciplina em cursos de treinamento tcnico, graduao e ps-graduao desde o ano de 2000. Inicialmente, o livro abordar conceitos bsicos da linguagem Java, desde a sua criao at o processo de compilao e execuo e, em seguida, sero apresentados os demais conceitos para que voc possa ter uma noo de programao orientada a objetos com a linguagem
PROGRAMAO I (JAVA) | Educao a Distncia

Java. Escrever este material foi um desafio, pois necessrio expressar os conceitos de uma forma clara para que voc, caro(a) aluno(a), possa entender a lgica dos exemplos. Assim, espero que voc goste do que foi colocado aqui. Na Unidade I, teremos a apresentao da histria e evoluo da linguagem Java, desde as suas primeiras verses, em que s existia a linguagem Java puramente e algumas poucas bibliotecas disponveis. Alm disso, ser apresentada a tecnologia Java onde a linguagem Java est inserida atualmente e as principais bibliotecas disponveis para cada plataforma Java de desenvolvimento. O processo de compilao e interpretao de programas Java apresentado, destacando cada fase e os elementos necessrios para que um programa Java possa ser executado. A Unidade II abordar as estruturas bsicas de um programa em Java, como: tipos primitivos, declarao e inicializao de variveis e escopo de variveis. Estruturas de controle, repetio e seleo sero apresentadas para permitir que programas Java possam ser executados de forma a terem fluxos de informaes diferentes em momentos diferentes de sua execuo. Para tanto, estruturas como if, do-while e switch podem ser usadas. Na Unidade III voc entender a diferena entre classes e objetos Java. Voc ver que uma classe Java serve como um modelo para que os objetos (instncias) daquela classe possam ser criados e permitir que o programa Java tenha vida. Mas para entender esses conceitos, sero apresentados os principais elementos que compem uma classe Java: atributos, mtodos, construtores, e o mtodo main. A Unidade IV abordar um dos conceitos mais importantes em programao orientada a objetos, o encapsulamento. Este conceito serve para proteger os dados de uma classe de acessos indevidos por elementos de outras classes ou at mesmo de outros pacotes. Porm, para entender tal conceito, necessrio aprender os chamados modificadores de acesso da linguagem Java: private, public, protected e default. Por fim, na Unidade V sero apresentados outros dois conceitos fundamentais em programao orientada a objetos: herana e polimorfismo. Herana permite criar uma hierarquia de classes que possuem um conjunto de atributos e mtodos comuns, mas com seus tipos prprios. J polimorfismo permite criar tal estrutura, porm exigindo que cada tipo especializado tenha as suas prprias verses de implementao de seus mtodos, que so diferentes dos mtodos herdados.

PROGRAMAO I (JAVA) | Educao a Distncia

Lembre-se sempre que programar uma arte moderna em que aquele que detm o maior poder de abstrao possvel aquele que melhor saber desenvolver os seus programas. tima leitura e sucesso em sua vida de desenvolvedor(a) de software. Professor Dr. Edson A. Oliveira Junior

PROGRAMAO I (JAVA) | Educao a Distncia

SUMRIO
UNIDADE I INTRODUO LINGUAGEM JAVA HISTRICO E EVOLUO DA LINGUAGEM JAVA...............................................................16 A TECNOLOGIA JAVA ............................................................................................................19 O PROCESSO DE COMPILAO E INTERPRETAO DE PROGRAMAS JAVA ...............24 UNIDADE II ESTRUTURAS BSICAS DA LINGUAGEM JAVA O QUE SO TIPOS PRIMITIVOS? .........................................................................................35 DECLARAO E INICIALIZAO DE VARIVEIS................................................................38 ESCOPO DE VARIVEL ........................................................................................................41 ESTRUTURAS DE CONTROLE .............................................................................................46 ESTRUTURAS DE SELEO ................................................................................................47 ESTRUTURAS DE REPETIO ............................................................................................55 UNIDADE III CLASSES X OBJETOS JAVA OBJETOS JAVA ......................................................................................................................87 JAVABEANS OU POJOS ........................................................................................................92 ESTADO E COMPORTAMENTO ............................................................................................98

UNIDADE IV MODIFICADORES JAVA E ENCAPSULAMENTO UTILIZANDO MODIFICADORES DE ACESSO .................................................................... 111 O MODIFICADOR StAtiC .................................................................................................... 116 O MODIFICADOR FinAl ...................................................................................................... 118 O MODIFICADOR ABStRACt .............................................................................................120 CONSTRUTORES JAVA .......................................................................................................122 UNIDADE V HERANA E POLIMORFISMO EM JAVA HERANA .............................................................................................................................131 POLIMORFISMO ..................................................................................................................139

CONCLUSO........................................................................................................................ 151 GABARITO DAS ATIVIDADES DE AUTOESTUDO ............................................................152 REFERNCIAS .....................................................................................................................162

UNIDADE I

INTRODUO LINGUAGEM JAVA


Professor Dr. Edson A. Oliveira Junior Objetivos de Aprendizagem Entender o que a linguagem Java e a sua importncia. Estudar o histrico e a evoluo da linguagem Java, alm das plataformas que englobam a tecnologia Java. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: Histrico e Evoluo da Linguagem Java A Tecnologia Java O Processo de Compilao e Interpretao de Programas em Java

INTRODUO

Caro(a) aluno(a), nesta primeira unidade trataremos alguns conceitos relacionados linguagem Java que sero fundamentais para o entendimento das demais unidades. A tecnologia Java, formada pela linguagem Java mais todas as bibliotecas disponveis para download e uso, tem sido responsvel por grande parte do mercado de desenvolvimento de software comercial e acadmico nas ltimas duas dcadas. Empresas de mdio e grande porte vm adotando tal tecnologia com base em seus poderosos recursos e caractersticas. Java uma linguagem baseada no paradigma de orientao a objetos, o que facilita a manuteno de sistemas Java quando os princpios bsicos de tal paradigma so seguidos.

Fonte: SHUTTERSTOCK.COM

PROGRAMAO I (JAVA) | Educao a Distncia

15

HISTRICO E EVOLUO DA LINGUAGEM JAVA

A linguagem Java foi criada por James Gosling em 1992. A primeira verso estvel da linguagem Java foi o JDK (Java Development Kit) 1.0.2, conhecido por Java 1, em janeiro de 1996 com o codinome Oak. Em fevereiro de 1997, foram adicionadas algumas bibliotecas, como: eventos com base na biblioteca Abstract Window toolkit (AWT), classes internas, conexo com banco de dados via Java Database Connectivity (JDBC) e invocao remota de mtodos. Em dezembro de 1998, foi lanada a J2SE 1.2 (Java Standard Edition), codinome playground e conhecida simplesmente como Java 2. Esta foi a evoluo mais significativa da linguagem Java, j que a tecnologia foi dividida em trs principais plataformas: J2SE (Java 2 Standard Edition), J2EE (Java 2 Enterprise Edition) e J2ME (Java 2 Micro Edition).

16

PROGRAMAO I (JAVA) | Educao a Distncia

Fonte: SHUTTERSTOCK.COM

Ao J2SE foram adicionadas as seguintes bibliotecas: Swing para interface grfica com o cliente, colees (list, Set e Map), e a possibilidade de criao de pontos flutuantes de acordo com o padro IEEE 754. Em maio de 2000, foi lanada a verso 1.3, codinome Kestrel. As mudanas mais notveis foram: invocao remota de mtodo compatvel com CORBA, introduo das bibliotecas JavaSound para tratamento de sons e JNDI (Java naming and Directory interface) para o compartilhamento de recursos. Em fevereiro de 2002, foi lanada a verso 1.4 da J2SE, codinome Merlin, que foi a primeira verso desenvolvida sob a tutela da Java Community Process (JCP). A JCP1 uma comunidade extremamente importante formada por um consrcio de empresas que regulamenta a tecnologia Java de forma geral. Dentre as maiores melhorias, destacam-se: a incluso de expresses regulares, capacidade de lidar com o protocolo iPv6, biblioteca para logging, integrao parsers XML, melhoria nas bibliotecas para criptografia e segurana. Em setembro de 2004 foi lanada a verso J2SE 5.0, codinome Tiger, conhecida como Java 5. Vrias mudanas significativas foram incorporadas nesta nova verso, dentre elas: biblioteca para Generics, eliminando a necessidade de converses entre tipos similares, incluso de uma biblioteca para metadados de uma aplicao, autoboxing/unboxing, que so converses automticas entre tipos primitivos, enumerations, que permitem criar listas de valores ordenados, e a melhoria da estrutura de repetio for para colees e arrays. Em dezembro de 2006, foi lanada a verso Java SE 6, codinome Mustang, conhecida como Java 6. A partir desta verso, as siglas J2SE, J2EE e J2ME foram substitudas pelas siglas Java SE, Java EE e Java ME, respectivamente. Dentre as melhorias, podemos citar: aumento de desempenho da plataforma bsica, suporte ao JDBC 4.0, uma biblioteca dedicada somente ao compilador Java e melhorias no desempenho e segurana da mquina virtual Java.

Saiba mais sobre a JCP em <http://www.jcp.org/en/home/index>. Texto em ingls.

PROGRAMAO I (JAVA) | Educao a Distncia

17

Em julho de 2011, foi lanada a verso Java SE 7, codinome Dolphin, conhecida como Java 7. Algumas caractersticas adicionadas a esta verso: estrutura de seleo switch aceitando strings, e no somente valores inteiros, nova biblioteca para tratar entrada e sada e melhorias nos streams para XML e Unicode. Espera-se para setembro de 2013 a verso Java SE 8 com algumas melhoria adiadas da verso 7. Alm disso, a verso Java SE 9 est em discusso e possivelmente oferecer a possibilidade de programao paralela. Para a verso 10, existem especulaes da possibilidade de remover tipos primitivos, tornando Java uma linguagem totalmente orientada a objetos.

Saiba mais sobre programao paralela Por Domingos Manoel Oran Barros Coelho Jnior Ultimamente os processadores de computadores e notebooks esto sendo fabricados com mais de um ncleo. Isso requer um olhar especial por quem desenvolve software e o deseja fazer com qualidade. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.devmedia.com.br/programacao-paralela/21405>. Acesso em: 03 abr. 2013.

18

PROGRAMAO I (JAVA) | Educao a Distncia

Programao Paralela Multicore Disponvel em: <http://www.youtube.com/watch?v=UjgzYVEG9I0>.

A TECNOLOGIA JAVA

O Java composto por uma srie de vrios produtos de software e especificaes provenientes, originalmente, da Sun Microsystems, e hoje sobre responsabilidade da Oracle. Esses produtos juntos fornecem um sistema para o desenvolvimento e a implantao de softwares em ambientes computacionais multiplataforma.

Fonte: SHUTTERSTOCK.COM

PROGRAMAO I (JAVA) | Educao a Distncia

19

O Java usado em uma ampla variedade de plataformas computacionais, desde sistemas embarcados e telefones celulares at servidores empresariais e supercomputadores. Menos comum, porm ainda usados, esto os Java applets que de vez em quando so utilizados para melhorar a segurana de navegadores Web e computadores de mesa, conhecidos como desktops. Escrever usando a linguagem de programao Java a principal forma de produzir o cdigo que ser implantado na forma de bytecodes Java. Existem, ainda, os compiladores de bytecodes disponveis para gerar cdigo para outras linguagens como Ada, JavaScript, Python e Ruby. Vrias novas linguagens de programao foram projetadas para serem executadas de forma nativa na mquina virtual Java (Java Virtual Machine - JVM), que veremos na seo A Mquina Virtual Java, como Scala, Clojure e Groovy. A sintaxe de Java muito semelhante de C e C + +, porm mais recursos orientados a objetos podem ser modelados. O Java elimina algumas construes de baixo nvel, como ponteiros, alm de possuir um modelo de memria muito simples, em que cada objeto alocado em uma pilha e todas as variveis de tipos de objeto so referncias. O seu gerenciamento de memria feito por meio da coleta de lixo (Garbage Collector) automtica realizada pela JVM. Uma edio da plataforma Java o nome de um pacote de programas relacionados que permite o desenvolvimento e a execuo de programas escritos em Java. A plataforma no especfica para qualquer processador ou sistema operacional. Porm, a sua execuo requer uma JVM e um compilador com um conjunto de bibliotecas que so implementadas para diversos hardwares e sistemas operacionais para que os programas em Java possam ser executados de forma idntica em qualquer ambiente. As seguintes plataformas Java so as mais comuns: Java Card uma tecnologia que permite pequenas aplicaes baseadas em Java (applets) para serem executadas em cartes inteligentes com segurana e similares de memria em pequenos dispositivos.

20

PROGRAMAO I (JAVA) | Educao a Distncia

Java ME (Micro Edition) especifica vrios conjuntos diferentes de bibliotecas (conhecidos como perfis) para dispositivos com armazenamento, exibio e capacidade de energia limitados. Muitas vezes usado para desenvolver aplicativos para dispositivos mveis, PDAs, set-top boxes de TV e impressoras. Java SE (Standard Edition) para uso geral em aplicaes, desktops, servidores e dispositivos similares. Java EE (Enterprise Edition) a soma da plataforma Java SE com as mais diversas outras APIs teis para aplicaes multicamadas e cliente-servidor em empresas. A plataforma Java consiste de vrios programas. Cada programa fornece uma parcela de suas capacidades gerais. Por exemplo, o compilador Java, que converte cdigo-fonte Java em bytecode Java (uma linguagem intermediria para a JVM), fornecido como parte do Java Development Kit (JDK). O Java Runtime Environment (JRE) complementa a JVM com um compilador just-in-time (JIT), que converte bytecodes intermedirios no cdigo de mquina nativo da plataforma alvo. Um extenso conjunto de bibliotecas tambm forma a plataforma Java. Assim, os componentes essenciais da plataforma Java so: o compilador Java, as bibliotecas e o ambiente de tempo de execuo em que o bytecode Java intermedirio executa de acordo com as regras estabelecidas na especificao da mquina virtual. O corao da plataforma Java a mquina virtual, que executa programas de bytecode Java. Este cdigo o mesmo, no importa em que sistema operacional ou hardware o programa est sendo executado. O compilador JIT traduz o bytecode Java em instrues do processador nativo em tempo de execuo e armazena o cdigo nativo em memria durante a execuo. O uso do bytecode como linguagem intermediria permite que os programas Java possam rodar em qualquer plataforma que tenha uma mquina virtual disponvel. O uso de um compilador

PROGRAMAO I (JAVA) | Educao a Distncia

21

JIT permite que aplicaes Java, depois de um pequeno atraso durante o carregamento e uma vez prontas, tendam a ser executadas to rpido como os programas nativos. Desde a verso 1.2 da JRE, a implementao de Java incluiu um compilador just-in-time, em vez de um interpretador. Embora os programas Java sejam multiplataforma ou independente de plataforma, o cdigo da mquina virtual em que estes programas rodam no . Cada plataforma operacional possui a sua prpria JVM. Em muitos sistemas operacionais modernos, um conjunto extenso de cdigo reutilizvel fornecido para simplificar o trabalho do programador. Normalmente, esse cdigo fornecido como um conjunto de bibliotecas carregveis dinamicamente, em tempo de execuo. Como a Plataforma Java no dependente de qualquer sistema operacional especfico, os aplicativos no podem confiar em qualquer biblioteca de sistema operacional pr-existente. Em vez disso, a plataforma Java fornece um conjunto amplo de suas prprias bibliotecas-padro contendo, grande parte, as mesmas funes reutilizveis comumente encontradas em sistemas operacionais modernos. A maior parte do sistema de bibliotecas tambm escrita em Java. Por exemplo, biblioteca Swing desenha a interface do usurio e controla os eventos em si, eliminando muitas diferenas sutis entre diferentes plataformas, como lidar com componentes semelhantes. As bibliotecas Java servem a dois propsitos principais. Primeiro, assim como outras bibliotecas de cdigo-padro, as bibliotecas Java fornecem ao programador um conjunto bem conhecido de funes para realizar tarefas comuns, como a manuteno de listas de itens ou a anlise de uma String complexa. Segundo, as bibliotecas de classe fornecem uma interface abstrata para tarefas que normalmente dependem fortemente dos sistemas de hardware e operacional. Tarefas como acesso rede e acesso a arquivos esto muitas vezes fortemente entrelaadas com as implementaes distintas de cada plataforma. As bibliotecas java.net e java.io implementam uma camada de abstrao em cdigo nativo do sistema operacional, ento fornecido para a interface padro das aplicaes Java.

22

PROGRAMAO I (JAVA) | Educao a Distncia

De acordo com a Oracle, o JRE encontrado em mais de 850 milhes de computadores. A Microsoft no tem fornecido um JRE com seus sistemas operacionais desde que a Sun Microsystems processou a Microsoft por adicionar classes especficas do Windows ao pacote do ambiente de execuo Java. Alguns aplicativos Java esto em uso em desktop, incluindo ambientes de desenvolvimento integrados, como NetBeans e Eclipse, e os clientes de compartilhamento de arquivos como o Limewire e Vuze. O Java tambm usado no ambiente de programao matemtica MATLAB para tornar a interface do usurio mais amigvel. O Java fornece interface de usurio multiplataforma para algumas aplicaes, como o Lotus Notes.

O que a tecnologia Java e por que necessria? Por Oracle, Inc. Java uma linguagem de programao e uma plataforma de computao lanada pela primeira vez pela Sun Microsystems em 1995. a tecnologia que capacita muitos programas da mais alta qualidade, como utilitrios, jogos e aplicativos corporativos, entre muitos outros, por exemplo. O Java executado em mais de 850 milhes de computadores pessoais e em bilhes de dispositivos em todo o mundo, inclusive telefones celulares e dispositivos de televiso. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.java.com/pt_BR/download/faq/whatis_java.xml>. Acesso em: 03 abr. 2013.

PROGRAMAO I (JAVA) | Educao a Distncia

23

Java est em toda parte. Disponvel em: <http://www.youtube.com/watch?v=sd4KPIF8eAo>.

O PROCESSO DE COMPILAO E INTERPRETAO DE PROGRAMAS JAVA

O JDK inclui muitos utilitrios para compilao, depurao e execuo de aplicaes Java. O Compilador Java Uma aplicao Java deve ter pelo menos uma classe que contenha um mtodo chamado main(), o qual contm o primeiro cdigo a ser executado para iniciar a aplicao.

24

PROGRAMAO I (JAVA) | Educao a Distncia

Fonte: SHUTTERSTOCK.COM

A classe, a seguir, um bom exemplo, ela simplesmente mostra a frase Ol, Mundo! na sada padro, que neste caso o console:
public class OlaMundo { public static void main(String[] args) { System.out.println(Ol, Mundo!); } }

O compilador Java simplesmente converte arquivos-fonte Java em bytecodes. O uso do compilador Java o seguinte:
javac [opes] [arquivo fonte]

A forma mais direta como se segue:


javac OlaMundo.java

Isso resultar em um arquivo bytecode com o mesmo nome do arquivo .java, mas com a extenso .class: OlaMundo.class. possvel, ainda, informar a pasta de destino do bytecode com a opo d. O Classpath O Path (caminho em ingls) uma varivel de ambiente de um sistema operacional que fornece a uma aplicao uma lista de pastas onde procurar por algum recurso especfico. O exemplo mais comum o caminho para programas executveis. A varivel de ambiente CLASSPATH de Java uma lista de locais que so visitados na procura por arquivos de classes. Tanto o interpretador Java como o compilador Java usa a CLASSPATH quando procura por pacotes e classes Java. Um elemento de classpath pode ser uma pasta, um arquivo .JAR ou um arquivo .ZIP. A forma exata de configurar a classpath varia de sistema para sistema. Em um sistema baseado no Unix (incluindo o Mac OS X), voc pode configurar a varivel de ambiente CLASSPATH com

PROGRAMAO I (JAVA) | Educao a Distncia

25

uma lista de locais separados por dois pontos. Por exemplo:


% CLASSPATH=/home/ze/Java/classes:/home/maria/lib/foo.jar:. % export CLASSPATH

Nesse exemplo, estamos especificando uma classpath com trs locais: uma pasta chamada classes, um arquivo .JAR e a pasta atual que especificada com um ponto. No sistema Windows, a varivel de ambiente CLASSPATH configurada com uma lista de locais separada por ponto e vrgula. Por exemplo:
C:\> set CLASSPATH=D:\users\joao\Java\classes;E:\apps;

O inicializador Java e outras ferramentas de linha de comando sabem como encontrar as classes essenciais, as quais so includas na instalao Java. As classes nos pacotes java. lang, java.io, java.net, e java.swing, por exemplo, no precisam ser includas na classpath. Para encontrar outras classes, o compilador e o interpretador Java procuram os elementos da classpath na ordem em que foram inseridos. A busca combina os locais e os nomes dos pacotes das classes. Por exemplo, imagine a estrutura de pacote e classe animais.passaros. Galinha. Procurar o local /usr/lib/java includo na classpath, significa procurar por /usr/lib/java/ animais/passaros/Galinha.class. Procurar pelo local /home/maria/classesuteis.jar includo na classpath, significa procurar pelo arquivo /home/maria/classesuteis.jar e dentro dele procurar pelo arquivo compactado animais/passaros/Galinha.class. Se voc deseja compilar sua aplicao com pacotes e classes definidos por voc mesmo(a), ter que dizer JVM onde procurar os pacotes e classes na classpath. Essa incluso da informao de localizao da classe na classpath feita dizendo ao compilador onde a classe ou pacote desejado esto com as opes de linha de comando cp ou classpath. Por exemplo: javac cp terceiros\classes;\home\maria\classesuteis.jar;. AloMundo.java

26

PROGRAMAO I (JAVA) | Educao a Distncia

Essa linha de comando diz que alm das classes core, qualquer classe ou pacote que esteja nos locais citados na lista separada por ponto e vrgula pode ser utilizado na compilao de AloMundo.java. Note que no necessrio incluir na classpath da compilao o local das classes core, como j foi dito, e tambm locais j definidos na varivel de ambiente CLASSPATH. Para conhecer outras opes do compilador javac, basta digitar javac help ou simplesmente javac sem nenhum complemento. Uma lista com as opes ser mostrada. O interpretador Java A interpretao de arquivos bytecode Java a base para a criao de aplicaes Java. A forma de utilizar o aplicativo java.exe para interpretar arquivos de bytecode (.class) a seguinte:
java [-opes] nome_da_classe [argumentos]

Interpretao do bytecode O interpretador Java chamado com o aplicativo java.exe (no Windows). Ele usado para interpretar o bytecode (arquivo .class) e executar o programa. O nome da classe deve ser especificado de forma completa, incluindo pacotes, se houver. Alguns exemplos:
% java animais.passaros.Galinha % java AloMundo

O interpretador procura pela classe na classpath. Por outro lado, voc pode querer definir onde se encontram certos pacotes ou classes que sejam importantes para a interpretao (como classes de apoio). Voc pode encontrar pacotes ou classes em tempo de execuo incluindo a opo cp ou classpath com o interpretador. A utilizao a mesma que no comando javac visto anteriormente.

PROGRAMAO I (JAVA) | Educao a Distncia

27

O interpretador Java pode ser utilizado com a opo jar para executar um arquivo container .JAR. Por exemplo:
% java -jar batalhanaval.jar

Nesse caso, o arquivo .JAR se torna o classpath e a classe que contm o mtodo main() dentro dela considerada o programa a ser executado. A assinatura do mtodo main() O mtodo main() deve possuir a assinatura de mtodo correta. A assinatura de um mtodo um conjunto de informaes que define o mtodo. Ela inclui o nome do mtodo, seus argumentos e o tipo de retorno, assim como o modificador de visibilidade e tipo. O mtodo main() deve ser pblico (public), esttico (static) e receber um array de objetos Strings (textos, nesse caso sem espao) e no deve retornar valor indicando com a palavra reservada void. Assim:
public static void main (String[] argumentos)

O fato de main() ser pblico e esttico simplesmente significa que ele acessvel globalmente e que ele pode ser chamado diretamente pelo nome. Quem o chama o inicializador quando interpretamos o bytecode. O nico argumento do mtodo main() um array de objetos Strings, que serve para armazenar em cada entrada do array os parmetros digitados pelo usurio aps o nome da classe a ser interpretada. O nome do parmetro pode ser escolhido pelo usurio (escolhemos argumentos no exemplo acima); mas o tipo deve ser sempre String[], que significa array de objetos String. Se, por exemplo, interpretamos uma classe que aceita argumentos da seguinte forma:
java ClasseExemplo arroz feijo macarro

28

PROGRAMAO I (JAVA) | Educao a Distncia

Ento teremos a primeira posio do array, argumentos[0] igual a arroz, a segunda posio, argumentos[1] igual a feijo e a terceira posio do array, argumentos[2] igual a macarro. Repare que arrays tm sua indexao comeada por zero.

O processo interpretao e compilao: Entendendo o Java de uma forma diferente Por Oracle, Inc. Entenda como o Java compilado e interpretado neste artigo que ilustra todas as etapas com exemplos prticos. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.devmedia.com.br/processo-de-interpretacao-e-compilacao-entendendo-o-java-de-uma-forma-diferente/24257>.

Codifi cando, compilando e executando um programa Java Disponvel em: <http://www.youtube.com/watch?v=M9LCDfRTyQ0>.

PROGRAMAO I (JAVA) | Educao a Distncia

29

Introduo linguagem Java Captulo 1 do Livro Programao Java com nfase em orientao a objetos Por Douglas R. Mendes Saiba mais sobre o assunto no captulo completo. Disponvel em: <http://www.novateceditora.com.br/livros/javaoo/capitulo9788575221761.pdf>.

CONSIDERAES FINAIS
Nesta primeira unidade, foi apresentada a histria e a evoluo da linguagem Java, os elementos que compem a tecnologia Java e o processo de compilao, interpretao e execuo de um arquivo Java. Esses conceitos so importantes do ponto de vista geral, enquanto voc, caro(a) aluno(a), deve domin-los com o intuito de entender grande parte do que acontece desde o momento em que programamos usando Java at o momento em que o programa criado executado. O Java uma linguagem e uma tecnologia muito poderosa, que pode trazer grandes benefcios ao desenvolvedor, desde que este tenha o domnio dos conhecimentos bsicos. Assim, espero que esta primeira unidade tenha lhe fornecido algum conhecimento novo e que voc possa desfrutar de todo o restante do livro.

ATIVIDADES DE AUTOESTUDO
1. Por que o Java divulga tanto que os seus programas so write once, run everywhere? 2. Quais as principais caractersticas do Java 5? O que mudou nos programas j existentes at o momento do seu lanamento? 3. O que JCP? Como voc pode fazer para submeter uma mudana que voc considera

30

importante para futuras verses de Java?


PROGRAMAO I (JAVA) | Educao a Distncia

4. Quais plataformas compem a tecnologia Java? Fornea uma pequena descrio de cada uma delas. 5. Explique o que bytecode e como ele deve ser lido para permitir que um programa Java seja executado. 6. Explique, com as suas palavras, o processo de compilao, interpretao e execuo de programas Java. Dica: faa uma ilustrao. 7. Por que o classpath to importante para o Java?

O Java uma linguagem totalmente orientada a objetos!

PROGRAMAO I (JAVA) | Educao a Distncia

31

UNIDADE II

ESTRUTURAS BSICAS DA LINGUAGEM JAVA


Professor Dr. Edson A. Oliveira Junior Objetivos de Aprendizagem Estudar as estruturas Bsicas da Linguagem Java. Estudar Tipos Primitivos. Estudar Declarao e Inicializao de Variveis. Estudar Escopo de Variveis. Estudar Estruturas de Controle. Estudar Estruturas de Repetio. Estudar Estruturas de Seleo. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: O que so tipos primitivos Declarao e inicializao de variveis Escopo de varivel Estrutura de controle Estrutura de repetio Estrutura de seleo

INTRODUO
Caro(a) aluno(a), nesta unidade iremos compreender alguns dos elementos bsicos da linguagem Java. Abordaremos os aspectos fundamentais das palavras-chaves, tipos primitivos, variveis e escopo de variveis, que so responsveis por informar como acessar uma varivel de outra classe. Tambm abordaremos estruturas de controle, repetio e seleo. Essas estruturas de controle so uma parte-chave de quase toda linguagem de programao e a linguagem Java oferece vrias maneiras de execut-las. Algumas, como as instrues if e for, so comuns maioria as linguagens. Para a implementao de todos os exemplos, usaremos a plataforma de desenvolvimento NetBeans IDE e a ferramenta Astah Community para realizar todas as modelagens UML de nosso projeto. A UML (Unified Modeling language - Linguagem de Modelagem Unificada) uma linguagem visual utilizada para modelar sistemas computacionais orientados a objeto. Neste trabalho, faremos uso do diagrama de atividades que apresenta muita semelhana com fluxogramas utilizados para desenvolver a lgica de programao e determinar o fluxo de controle de um algoritmo.

O QUE SO TIPOS PRIMITIVOS?


Toda a linguagem de programao possui uma maneira de tratar os dados que sero manipulados em um sistema. Para tanto, esses dados devem ser armazenados em tipos de dados que correspondam ao seu valor. Definir um tipo de dado mais adequado para ser armazenado em uma varivel uma questo de grande importncia para garantir a resoluo do problema. Ao desenvolver um algoritmo, necessrio que se tenha conhecimento prvio do tipo de informao (dado) que ser utilizado

PROGRAMAO I (JAVA) | Educao a Distncia

35

para resolver o problema proposto. Da escolhe-se o tipo adequado para a varivel que representar esse valor. As variveis devem ser declaradas respeitando-se a sintaxe bsica tipo nomeVariavel;. H oito tipos de dados primitivos em Java e vamos compreender um pouco mais sobre cada um a seguir. Tipos Inteiros Os tipos inteiros so para nmeros sem partes fracionrias. Valores negativos so permitidos. O Java fornece os quatro tipos de nmeros inteiros mostrado na tabela abaixo:
Tabela 1 Tipos inteiros byte short int long Representam nmeros inteiros de 8 bits (1 byte). Podem assumir valores entre -128 a 127. Representam nmeros inteiros de 16 bits (2 bytes). Podem assumir valores entre -32.768 at 32.767. Representam nmeros inteiros de 32 bits (4 bytes). Podem assumir valores entre -2.147.483.648 at 2.147.483.647. Representam nmeros inteiros de 64 bits (8 bytes). Podem assumir valores entre -9.223.372.036.854.775.808 at 9.223.372.036.854.775.807.

Fonte: o autor

Na maioria das situaes, o tipo int o mais prtico. Os tipos byte e short so essencialmente utilizados para aplicativos especializados, como tratamento de arquivo de baixo nvel, ou para grandes arrays quando h pouco espao de armazenamento. O tipo long deve ser identificado com a letra L para no ser compactado pela linguagem em um tipo inteiro. A compactao ocorre como uma maneira de reduzir o uso de memria.

36

PROGRAMAO I (JAVA) | Educao a Distncia

Tipos de ponto flutuante Os tipos de ponto flutuante denotam nmeros com partes fracionrias. Os dois tipos de ponto flutuante so mostrados na tabela abaixo:
Tabela 2 Tipos flutuantes float double Representam nmeros reais de 32 bits com preciso simples. Podem assumir valores de ponto flutuante com formato definido pela especificao IEEE 754. Representam nmeros reais de 64 bits com preciso dupla. Assim como o float, podem assumir valores de ponto flutuante com formato definido pela especificao IEEE 754.

Fonte: o autor

O nome double refere-se ao fato de que esses nmeros so duas vezes mais precisos do que o tipo float. As nicas razes para utilizar float so aquelas raras situaes em que o processamento importante ou quando voc precisa armazenar um grande nmero deles. Nmeros do tipo float tm sufixo F (por exemplo, 3.454F). Nmeros de ponto flutuante sem um sufixo F sempre so considerados como o tipo double. Opcionalmente, voc pode fornecer o sufixo D (3.22D). O tipo char O tipo char utilizado para descrever caracteres individuais. Por exemplo A um caractere de constante com um valor 65. Ele diferente de A, uma string que contm um nico caractere.
Tabela 3 Tipos char char Representam notao de caracteres de 16 bits (2 bytes) para formato Unicode UTF-16. Podem assumir caracteres entre \u0000 a \uffff e valores numricos entre 0 a 65535.

Fonte: o autor

PROGRAMAO I (JAVA) | Educao a Distncia

37

O tipo boolean O tipo boolean tem dois valores, false e true. Ele utilizado para avaliar condies lgicas. Voc no pode converter entre nmeros inteiros e valores boolean.
Tabela 4 Tipos boolean boolean Representam apenas 1 bit de informao (0 ou 1). Podem assumir apenas os valores true e false.

Fonte: o autor

DECLARAO E INICIALIZAO DE VARIVEIS


Declarao de variveis Java uma linguagem de programao fortemente tipada. Isto significa que cada varivel deve ter um tipo de dado associado a ela. Por exemplo, uma varivel pode ser declarada para usar um dos oito tipos de dados primitivos: byte, short, int, long, float, double, char ou boolean, que so os tipos primitivos que vimos anteriormente. O nome de uma varivel pode comear com uma letra, um sublinhado _, ou cifro $. Se o nome da varivel comear com um sublinhado, o segundo caractere deve ser uma letra alfabtica. Veja, abaixo, alguns exemplos de declaraes de variveis.

Figura 1 Declarao de variveis O nome no pode comear com um dgito (0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9). Veja, a seguir, um exemplo de tentativa de declarao de uma varivel iniciando com dgito.

38

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 2 Declarao de uma varivel incorretamente Observe que o NetBeans IDE destacou o nome incorreto de varivel. Depois do primeiro caractere, o nome da varivel pode incluir letras, dgitos (0, 1, 2, 3, 4, 5, 6, 7, 8 ou 9) ou sublinhados, em qualquer combinao. O nome de uma varivel tambm no pode ser nenhuma das palavras-chaves da linguagem Java. As palavras-chaves so palavras especiais, reservadas em Java. Elas tm um significado para o compilador que as usa para determinar o que seu cdigo-fonte est tentando fazer. Veja no quadro abaixo a lista das 49 palavras-chaves reservadas.
byte - short - int - long - char - Boolean - double - float - public - private - protected - static - abstract - final - strictfp - transient - synchronized - native - void - class - interface -implements - extends - if else - do - default - switch - case - break - continue - assert const - goto - throws - throw - new - catch - try - finally - return - this - package - import - instaceof - while - for - volatile - super

Inicializando Variveis Antes de uma varivel ser utilizada, ela deve receber um valor inicial. Isto chamado de inicializao de varivel. Se tentar usar uma varivel sem antes a inicializar, como no exemplo abaixo, ocorrer um erro:

Figura 3 Inicializao de varivel incorretamente

PROGRAMAO I (JAVA) | Educao a Distncia

39

O compilador ir lanar um erro informando que a varivel nmero no pode ser inicializada. Para inicializar uma varivel, usamos uma instruo de atribuio. Uma instruo de atribuio segue o mesmo padro de uma equao de matemtica (por exemplo, a equao 2 + 2 = 4). Para dar um valor varivel, o lado esquerdo tem de ser o nome da varivel e o lado direito o valor atribudo, conforme figura abaixo:

Figura 4 Inicializao de variveis No exemplo acima, o nmero foi declarado com um tipo de dados int e foi inicializado com 0 (zero). Podemos agora adicionar 5 para a varivel nmero, pois ela j foi inicializada:

Figura 5 Inicializao de variveis Tipicamente, a inicializao de uma varivel feita ao mesmo tempo que a sua declarao:

Figura 6 Inicializao de variveis

40

PROGRAMAO I (JAVA) | Educao a Distncia

ESCOPO DE VARIVEL
Muitos erros de compilao so gerados porque os programadores no possuem uma imagem clara de quanto tempo as variveis esto disponveis e quando elas podem ser acessadas. O conceito escopo de varivel descreve a vida de uma varivel, ou seja, refere-se acessibilidade de uma varivel. a parte do programa em que o nome da varivel pode ser referenciado. Voc pode declarar varivel em vrios lugares diferentes do mesmo cdigo. Abaixo sero listados vrios escopos de varivel para que voc possa compreender mais sobre esse assunto to importante. Variveis de instncia (atributos) As variveis de instncias so definidas dentro da classe, mas fora de qualquer mtodo, e s so inicializadas quando a classe instanciada. Elas so os campos que pertencem a cada objeto. Por exemplo, o cdigo abaixo define campos (variveis de instncia) para a classe Livro.

Figura 7 Variveis de instncia A classe Livro do cdigo anterior informa que cada instncia sua ter seu prprio preo, quantidade e tipo. Em outras palavras, cada instncia poder ter seus prprios valores exclusivos para esses trs campos.

PROGRAMAO I (JAVA) | Educao a Distncia

41

Variveis Locais As variveis locais so as declaradas dentro de um mtodo. Da mesma forma que a varivel local inicia sua existncia dentro do mtodo, ela tambm eliminada quando a execuo do mtodo concluda. No h palavra-chave especial que designa uma varivel como local; a determinao vem inteiramente a partir do local em que a varivel declarada - que entre as chaves de abertura e fechamento do mtodo. As variveis locais s so visveis para os mtodos em que so declaradas, no so acessveis a partir do resto da classe. Por isso elas no utilizam a maioria dos modificadores e acessos como public, abstract, static etc., porm ela pode fazer uso do modificador final. A varivel local precisa ser inicializada para ser usada. A sintaxe para declarar uma varivel local e inicializ-la semelhante ao declarar um campo. Veja na imagem abaixo um exemplo de varivel local.

Figura 8 Varivel local Observe que a varivel contador foi declarada dentro do mtodo metodoContar(). E ela foi inicializada na mesma linha onde foi declarada. O compilador rejeitar qualquer tentativa de utilizao de uma varivel a qual no tenha sido atribudo um valor, porque diferente das variveis de instncia as variveis locais no recebem valores padro. A varivel contador do exemplo acima no pode ser referenciada em nenhum cdigo externo ao mtodo onde foi declarada. Para compreendermos mais, vamos analisar a figura a seguir:

42

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 9 Tentativa de acesso de varivel local Observe que no segundo mtodo imprimir() a varivel contador foi destacada pelo NetBeans IDE acusando um erro de acesso. Variveis de Classe (Estticas) Variveis de classe, tambm conhecidas como variveis estticas, so declaradas com a palavra-chave static em uma classe, mas fora de um mtodo construtor ou um bloco. O modificador static diz ao compilador que h apenas uma cpia de cada varivel de classe por classe, independentemente de quantos objetos so criados a partir dele. A ideia por trs do conceito de varivel esttica a de que objetos de uma mesma classe podem e, em algumas situaes, devem compartilhar valores em comum, caso contrrio, teramos de criar atributos que precisariam ser atualizados todos ao mesmo tempo, e em cada objeto criado. Vejamos o seguinte exemplo: um sistema de venda de livros possui um desconto que ajustado regularmente de acordo com a inflao e repassado a todas as vendas de livros do sistema, quando tivermos de fazer um ajuste ou atualizar o valor do desconto, teramos de faz-lo em todos os livros cadastrados. Porm, se essa varivel no pertencer aos objetos, e sim prpria classe, todos os livros sabero do novo desconto, pois se baseiam no mesmo valor. Observe na figura a seguir o exemplo de um cdigo com a varivel static.

PROGRAMAO I (JAVA) | Educao a Distncia

43

Figura 10 Variveis estticas Neste caso, a varivel quando esttica funciona mais ou menos como uma varivel do tipo global em linguagens como Pascal ou Delphi. Embora no Java no exista um conceito de varivel global, este caso seria talvez o que teramos mais prximo disto. Ento quando a classe criada, a varivel DESCONTO inicializada com 20 e na chamada do mtodo vender() ela calculada gerando assim um novo valor para o livro. Comparando os escopos de varivel A tabela abaixo apresenta uma comparao resumida entre os escopos de varivel vistos anteriormente e os principais pontos que devem ser lembrados. Tabela 5 Comparando o escopo de variveis
Local Onde a Declarar Dentro de um mtodo Instncia (atributos) Dentro de uma classe, fora de todos os mtodos, mas sem static Cada objeto (instncia da classe) dono de uma cpia Enquanto o objeto que o conter existir Classe (estticas) Dentro de uma classe, fora de todos os mtodos, com static Classe onde ele declarado Enquanto a classe que o conter estiver carregada Em todos os mtodos da classe

Proprietrio

Mtodo em que declarado Apenas enquanto o mtodo estiver em execuo Apenas dentro do mtodo em que declarado

Tempo de vida

Onde utilizvel

Em todos os mtodos de instncia da classe

44

Fonte: o autor
PROGRAMAO I (JAVA) | Educao a Distncia

Tipos primitivos do Java Por ActJava Quando criamos um programa, devemos saber com que tipo de informao estamos lidando e para qual fi nalidade ela ser til. Afi nal, devemos ter conhecimento disso para declararmos corretamente o tipo de dado que a varivel ir suportar. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.actjava.com.br/2012/04/tipos-primitivos.html>.

Certifi cao Java Tipos Primitivos Disponvel em: <http://www.youtube.com/watch?v=PN0avdHxRZ8>.

PROGRAMAO I (JAVA) | Educao a Distncia

45

ESTRUTURAS DE CONTROLE
Quando voc compila e executa um programa Java, a JVM executa o que est dentro do mtodo principal. Estas instrues so realizadas sequencialmente. Um programa de computador (algoritmo) como uma receita: uma sequncia de instrues:
Leia um valor X; Calcule Y como funo de X: Y = X * 2; Imprima o resultado.

Estruturas de controle so instrues que permitem que blocos especficos de cdigo sejam escolhidos para serem executados, redirecionando determinadas partes do fluxo do programa. O Java contm trs tipos de estruturas de controle: instrues de sequncia; instruo de seleo (if, if else, switch) e instrues de repetio (while, do-while, for). Instrues de sequncia Normalmente instrues em um programa so executadas uma aps a outra na ordem em que so escritas. Somente programas muito simples so estritamente sequenciais. Vejamos o diagrama de atividades UML que modela um fluxo de sequncia em Java com apenas 2 instrues.

Instruo 1

Instruo 2

Figura 11 Fluxograma da estrutura sequencial


Fonte: o autor

46

PROGRAMAO I (JAVA) | Educao a Distncia

O crculo slido na parte superior representa o estado inicial do nosso programa, os retngulos so as diretrizes (instrues), as setas representam as transies e o crculo slido cercado por um crculo vazio representa o estado final do nosso programa. Esse padro de modelagem ser visto em outros exemplos desse material.

ESTRUTURAS DE SELEO
Instrues if e else A linguagem Java disponibiliza os comandos if e else que, de forma seletiva, definem qual bloco de comandos dever ser executado. Se a condio do comando if for avaliada como verdadeira ser executado o bloco de comandos dentro do if. Abaixo temos a estrutura do comando if.
if (expresso){ diretiva }

Nesse cdigo, todas as instrues colocadas entre chaves sero executadas se forem verdadeiras. Abaixo, podemos observar o fluxograma que representa o funcionamento do comando if.

EXPRESSO FALSE

TRUE

Diretiva 1

Figura 12 Fluxograma do comando if


Fonte: o autor

PROGRAMAO I (JAVA) | Educao a Distncia

47

Diretivas so as instrues que a linguagem Java fornece para a construo de programas. Elas so separadas por ; (ponto e vrgula). Vejamos um exemplo de um cdigo utilizando a instruo if.

Figura 13 Programa com instruo if Observe que temos uma expresso comparando o valor1 com o valor2, no caso, a expresso retornou um valor verdadeiro, o que fez com que a diretiva fosse executada. Agora vejamos a estrutura de condio if else.
if (expresso){ Diretiva 1 }else { Diretiva 2 }

Veja, a seguir a representao grfica da estrutura de seleo if e else. Observe que cada diretiva executada dependendo do resultado da expresso.

48

PROGRAMAO I (JAVA) | Educao a Distncia

EXPRESSO FALSE Diretiva 2

TRUE

Diretiva 1

Figura 14 Fluxograma do comando if e else


Fonte: o autor

Agora vejamos um programa utilizando if e else:

Figura 15 Programa com a instruo if e else

PROGRAMAO I (JAVA) | Educao a Distncia

49

A expresso (valor1>valor2) sempre retornar um valor lgico, ou seja, verdadeiro ou falso. Caso verdadeiro, o bloco de comandos abaixo da condio ser executado, caso contrrio, o bloco else ser executado. Voc no obrigado a implementar o bloco else caso seu programa no necessite. Argumentos vlidos para instrues if As instrues if s podem avaliar valores booleanos. Qualquer expresso que tenha como resultado um valor booleano ser adequada. Podemos fazer uso de operadores lgicos && e ||. Quando usamos o operador &&, caso a primeira condio avaliada em um comando if seja falsa, automaticamente a segunda expresso no ser avaliada. Quando usamos ||, caso a primeira condio avaliada em um comando if seja verdadeira, automaticamente a segunda expresso no ser avaliada.

Figura 16 Programa com instruo if e else e operadores lgicos

50

PROGRAMAO I (JAVA) | Educao a Distncia

Note no nosso cdigo que s foram impressas as linhas que retornaram uma condio positiva. J que os testes if requerem expresses booleanas, voc precisa ter um conhecimento slido tanto sobre os operadores lgicos quanto sobre a sintaxe e semntica do teste if. Instrues Switch Uma estrutura muito utilizada em programao o switch. A instruo switch verifica uma varivel e trabalha de acordo com seus cases. Os cases so as possibilidades de resultados que so obtidos por switch. Basicamente, o switch serve para controlar vrias aes diferentes de acordo com o case definido dentro dele. Segue abaixo a estrutura do Switch:
switch (expresso ordinal) { case valor ordinal 1: diretiva 1; break; case valor ordinal 2: diretiva 2; break; ... default: diretiva N; }

A expresso ordinal a expresso que retorna um valor de algum tipo discreto (inteiro, char etc.). Veja, a seguir, o fluxograma da instruo switch.

PROGRAMAO I (JAVA) | Educao a Distncia

51

Expresso Ordinal =

Diretiva 1

Diretiva 2

Diretiva 3

Figura 17 Programa com instruo switch


Fonte: o autor

possvel construir um programa com if equivalente ao switch. Observe o cdigo do bloco else-if da figura abaixo com if aninhados:

Figura 18 Instrues if aninhados

52

PROGRAMAO I (JAVA) | Educao a Distncia

Talvez voc esteja se perguntando quando devo usar o switch e quando devo utilizar o comando if. Qual dos dois comandos ser mais til? O cdigo da figura anterior um bom motivo para se utilizar switch, pois o uso de cada um dos comandos depende da composio da estrutura de deciso. Ento devemos escolher o switch quando, no teste realizado, usarmos uma mesma varivel, igualando-a com vrios valores diferentes. A estrutura do comando switch vem acompanhada com o comando case, que com base no valor da varivel do comando switch define qual opo ser executada. Para que somente um entre os vrios comandos seja executado, devemos executar o comando break logo aps a execuo dos comandos contidos no bloco do comando case selecionado. Veja um exemplo na figura abaixo:

Figura 19 Instruo switch Nesse programa vamos ler do teclado um caractere numrico utilizando a classe Scanner do Java. A classe Scanner uma das diversas classes do Java que permite a leitura de dados vindos do teclado. A utilizao do mtodo nextint() da classe Scanner deixa no buffer a instruo da tecla pressionada.

PROGRAMAO I (JAVA) | Educao a Distncia

53

Agora que entendemos um pouco sobre essa poderosa classe Scanner do Java, vamos nos ater ao que interessa, que a instruo de controle switch. Nesse programa leremos do teclado um caractere numrico, e caso seja igual a uma das opes do nosso menu, ele ento apresentar a informao personalizada para cada opo escolhida. Somente executamos o comando break ao final dos comandos executados. importante observar que a palavra-chave break interrompe a execuo do case. Se a palavra-chave break for omitida, o programa simplesmente continuar a executar os outros blocos case at que uma palavra break seja encontrada na instruo switch, ou at que a instruo termine. Veja no exemplo abaixo como ficaria o nosso cdigo anterior comentando todos os comandos break.

Figura 20 Instruo switch Observe o resultado na sada de comando. Essa combinao aconteceu porque o cdigo no chegou a uma instruo break; portanto, a execuo simplesmente continuou a percorrer cada

54

PROGRAMAO I (JAVA) | Educao a Distncia

instruo case at o final. Esse processo chamado de passagem completa por causa da maneira como a execuo passa de uma instruo para a seguinte. H tambm o comando default, que representa uma exceo a todas as opes listadas nos comandos case. importante observar que nos comandos case da instruo switch s so aceitas variveis do tipo int, char, byte, short.

ESTRUTURAS DE REPETIO
Os loops da linguagem Java permitem que voc repita a execuo de um bloco de cdigo at que uma determinada condio seja verdadeira ou durante uma quantidade especfica de iteraes. Usando loop for O loop for ser particularmente til para o controle do fluxo quando voc j souber quantas vezes ter de executar as instrues do bloco do loop. A figura abaixo apresenta a estrutura do comando for.
for ([incio]; [condio]; [inc/dec]){ diretiva; }

Note que incio a diretiva executada antes do lao comear; em seguida, temos a condio que a expresso de condio de parada do lao (geralmente, comparao com o valor final); o inc/dec representa diretiva executada antes de comear cada iterao do lao (geralmente usada para incrementar ou decrementar o contador). A seguir fluxograma de atividades do comando for.

PROGRAMAO I (JAVA) | Educao a Distncia

55

INICIALIZAO

TRUE
Condio

Diretiva
Incremento/ Decremento

FALSE

Figura 21 Instruo for


Fonte: o autor

O loop for uma construo geral para suportar a interao que encontrada por uma varivel de contador ou semelhante, que atualizada depois de cada iterao. Veja abaixo um exemplo de um loop for.

56

Figura 22 Exemplo de programa com instruo for


PROGRAMAO I (JAVA) | Educao a Distncia

Lembrando que devemos usar o comando for quando sabemos de antemo quantas vezes o loop dever ser executado. Em vrias linguagens de programao, o for (ou similar) serve somente para repetio simples:
para i de 1 at 10 faa Escreva i fim_para

Em Java, pode-se usar para fazer repetio condicional:

Figura 23 Declarao da instruo for Podemos efetuar mltiplas diretivas na inicializao e no incremento, se necessrio, separando com vrgulas:

Figura 24 Declarao da instruo for Usando loop while O loop while ser adequado em cenrios nos quais voc no souber quantas vezes o bloco ou instruo ter que ser repetido. A instruo while tem o formato a seguir:
while (condio) { Diretiva; }

A condio a expresso de condio de parada do lao (expresso lgica). A seguir, o diagrama da instruo while.

PROGRAMAO I (JAVA) | Educao a Distncia

57

Condio

FALSE

TRUE Diretiva

Figura 25 Fluxograma da instruo while


Fonte: o autor

O problema com estruturas de repetio, principalmente com while, o que chamamos de looping infinito. Damos esse nome ao fato de que o programa fica repetindo a mesma sequncia de cdigos esperando por um resultado que nunca ir acontecer. Portanto, imprescindvel que uma determinada varivel seja modificada de acordo com cada loop. Na figura abaixo temos um programa utilizando a instruo while.

Figura 26 Exemplo de programa com instruo while

58

PROGRAMAO I (JAVA) | Educao a Distncia

Note que a varivel contador iniciada com 0, a cada loop executado somado 1 ao contador.

Perceba que o while ir manter a repetio enquanto a varivel contador for menor que 5. Outro ponto importante que a varivel contador inicializada antes de chegar ao while, assim, o while comparar a sentena e s depois permitir a execuo do bloco. Se quisermos fazer todo o bloco primeiro e s depois fazer a comparao, devemos utilizar o comando DO WHilE. Usando loop do-while O do while difere do while no sentido de permitir que pelo menos uma execuo do bloco de comandos seja executada antes de testar a condio. O bloco de comandos ser executado enquanto a condio for verdadeira. A figura abaixo mostra um exemplo da sintaxe do comando do while e a representao grfica do comando.
do { diretiva; } while (condio);

Abaixo o fluxograma da instruo do while.

Diretiva TRUE
Condio

FALSE

Figura 27 Exemplo de programa com instruo do-while


Fonte: o autor

PROGRAMAO I (JAVA) | Educao a Distncia

59

Note que do while s avalia depois, certamente executando a diretiva ao menos uma vez; neste caso, devemos ter as mesmas precaues quanto ao while, no que diz respeito ao looping infinito. No necessrio comparar a varivel de controle antes do bloco de cdigo como acontece com while, pois a comparao s ser feita aps todo o cdigo ter sido executado. Veja no exemplo abaixo:

Figura 28 Exemplo de programa com instruo do-while Desvios incondicionais O Java s tem dois casos especficos de desvios incondicionais: break e continue. Break e continue so dois comandos de controle de estruturas largamente utilizados em loops (repeties), como for e while. Break O comando break tem a funo de interromper a execuo de um loop. No comando switch, por exemplo, ele determina que no pode ser executado o case seguinte, e assim por diante. A seguir, temos uma repetio que se inicia em 1 e deve terminar em mil (500), mas dentro desta estrutura h uma condio: se a varivel for igual a 6, saia da estrutura de repetio.

60

PROGRAMAO I (JAVA) | Educao a Distncia

Vejamos:

Figura 29 Exemplo de programa com comando break Note que mesmo que a condio for instrusse para que o programa imprimisse nmeros at o 500, a condio if se tornou vlida quando o cont chegou ao nmero 6, e sendo verdadeiro, executou seu bloco de instruo interrompendo o programa. Continue O comando continue tem a funo de fazer com que a condio do comando de loop seja novamente testada, mesmo antes de alcanar o fim do comando. Veja, a seguir, um exemplo do comando continue.

PROGRAMAO I (JAVA) | Educao a Distncia

61

Figura 30 Exemplo de programa com comando continue Note que o programa no imprimiu os nmeros 5, 6 e 7 devido execuo do comando continue. Break e continue rotulados Tanto a instruo break quanto continue podem ser no rotuladas ou rotuladas. As rotuladas sero necessrias somente nas situaes em que voc tiver um loop aninhado e precisar indicar qual quer encerrar ou a partir de qual deseja continuar a prxima interao. Uma instruo break sair do loop rotulado e no do loop atual se a palavra-chave break for combinada com um rtulo. Um exemplo do formato de um rtulo se encontra no cdigo a seguir:

62

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 31 Exemplo de programa com comando break rotulado Nesse exemplo, a sentena Dentro do Loop ser exibida uma vez. Em seguida, a instruo break rotulada ser executada e o fluxo sair do loop rotulado com o rtulo que declaramos externo. Ento, a prxima linha de cdigo exibir Fora do Programa. Vejamos o que acontecer se a instruo continue for usada em vez de break:

PROGRAMAO I (JAVA) | Educao a Distncia

63

Figura 32 Exemplo de programa com comando continue rotulado

Figura 33 Resultado do programa com comando continue rotulado Nesse exemplo, a sentena Dentro do Loop foi executada 2 vezes atendendo a condio de y < 3. Depois de concluda essa instruo, o programa imprimiu 13 vezes a sentena Fora do Loop. Para concluir, quando a condio do loop externo for avaliada como falsa, o loop i ser encerrado e a sentena Fora do Programa ser exibida.

64

PROGRAMAO I (JAVA) | Educao a Distncia

Break e continue no rotulados As instrues break e continue no rotuladas saram da estrutura do loop atual e prosseguiro na linha de cdigo posterior ao bloco do loop. O exemplo abaixo demonstra uma instruo break.

Figura 34 Resultado do programa com comando break no rotulado No exemplo anterior, a instruo break no foi rotulada. A seguir, temos o exemplo com a instruo continue no rotulada.

Figura 35 Resultado do programa com comando continue no rotulado


PROGRAMAO I (JAVA) | Educao a Distncia

65

Observe que aps executar o cdigo anterior no foi impresso o nmero 3, pois ao chegar na condio, o programa encontrou um continue que mandou continuar a execuo do programa.

Fundamentos da UML Por KDE.org A Unified Modelling Language (UML) uma linguagem ou notao de diagramas para especifi car, visualizar e documentar modelos de software orientados por objetos. A UML no um mtodo de desenvolvimento, o que signifi ca que no lhe diz o que fazer primeiro ou o que fazer depois ou como desenhar o seu sistema, mas ajuda-o a visualizar o seu desenho e a comunicar com os outros. A UML controlada pela Object Management Group (OMG) e a norma da indstria para descrever grafi camente o software. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://docs.kde.org/stable/pt_BR/kdesdk/umbrello/uml-basics.html>. Acesso em 14 maio 2013.

Introduo a UML Disponvel em: <http://www.youtube.com/watch?v=hfN6n5fJfLc>.

CONSIDERAES FINAIS
Nesta Unidade abordamos aspectos fundamentais da linguagem Java. Como vimos, h vrios tipos primitivos em Java, cada um com um consumo de memria determinado que afeta diretamente o seu alcance. Vimos tambm que uma varivel referenciar sempre a um tipo primitivo de Java e que o escopo a vida de uma varivel em Java, tratando-se dos locais nos quais ela pode ser acessada. Em Java, o escopo de variveis vai de acordo com o bloco
PROGRAMAO I (JAVA) | Educao a Distncia

66

onde elas foram declaradas. A varivel criada no primeiro acesso a ela e destruda aps o interpretador sair do bloco de execuo ao qual ela pertence. Tambm abordamos uma importante rea envolvendo maneiras de controlar o fluxo de seu programa, com base em um teste condicional. Primeiro voc conheceu as instrues if e switch. A instruo if avalia uma ou mais expresses com relao a um resultado booleano. A instruo switch usada para substituir vrias instrues if-else. Voc tambm conheceu trs estruturas de loop disponveis na linguagem Java. Essas estruturas so os loops for, while e do-while. De um modo geral, o loop for usado quando sabemos quantas vezes ser preciso percorrer o loop. O loop while usado quando no sabemos quantas vezes precisamos percorrer o loop, enquanto o do-while empregado quando temos que percorrer o loop pelo menos uma vez.

ATIVIDADES DE AUTOESTUDO
1. Suponha que uma varivel declarada como int a = 2147483647. Qual ser o resultado das impresses a seguir? a) System.out.println(a); b) System.out.println(a + 1); c) System.out.println(2 - a); d) System.out.println(-2 - a); e) System.out.println(2 * a); f) System.out.println(4 * a); 2. O que est errado com cada uma das seguintes afirmaes? a) if (a > b) then c = 0; b) if a > b { c = 0; } c) if (a > b) c = 0; d) if (a > b) c = 0 else b = 0;
PROGRAMAO I (JAVA) | Educao a Distncia

67

3. Escreva um programa para cada situao de instrues de controle abaixo: a) If-else. b) Switch. c) For loop. d) While.

A efi cincia de Java depende totalmente do tipo de hardware utilizado!

68

PROGRAMAO I (JAVA) | Educao a Distncia

UNIDADE III

CLASSES X OBJETOS JAVA


Professor Dr. Edson A. Oliveira Junior Objetivos de Aprendizagem Entender o que uma classe Java. Entender o que um objeto Java. Estudar o que atributo, mtodo, construtores, e o mtodo main.

Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: Conceitos Bsicos de Classes Conceitos Bsicos de Objetos JavaBeans ou POJOs Estado e Comportamento de Objetos

INTRODUO
Conforme visto nas Unidades anteriores, a Classe ser o modelo utilizado para criarmos o Objeto, e desta maneira resolver o problema. Mas como criar uma Classe em Java? E um Objeto? Ser possvel pegar e tocar neste Objeto que iremos criar? Vamos aprender como fazer estas e mais coisas neste momento. Para os estudos a seguir, iremos criar um projeto na nossa IDE NetBeans chamado Agenda. Para isto, basta: Clicar em Arquivo -> Novo Projeto

Figura 36 Menu para se criar um Novo Projeto Neste momento h uma infinidade de possibilidades para escolher que tipo ser o seu projeto. Neste momento, iremos trabalhar apenas com aplicaes para desktop. Logo usaremos o Java. Ao clicar em Java, algumas opes iro aparecer na parte direita da tela. Basta escolher, criar uma Aplicao Java e clicar em Prximo.

PROGRAMAO I (JAVA) | Educao a Distncia

71

Figura 37 Primeiro passo para se criar um projeto Java Em seguida, o NetBeans nos d a oportunidade de dar um nome para o projeto. Coloque o nome de Agenda no primeiro campo. Logo abaixo, ele mostra onde ficaro os arquivos dentro do sistema de pastas de seu sistema operacional. Grave bem o local, ou coloque um local de sua escolha, para depois voc ter acesso ao programa pronto. No se esquea de desmarcar a opo de Criar Classe Principal, para que possamos ns mesmos criar a nossa classe.

72

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 38 Segundo passo para se criar um projeto Java Ao se criar um projeto novo, possvel verificar 2 itens dentro do projeto. O Pacotes de cdigo-fonte, que ser o local onde guardaremos nossas classes, e Bibliotecas, que o local onde guardaremos classes j existentes em forma de biblioteca. Por hora, vamos necessitar apenas da JDK do Java. Para nos auxiliar na organizao de nossas classes, podemos utilizar um organizador que chamamos de Pacote. Pacotes Os pacotes so agrupamentos de classes, que nos auxiliam a separ-las de acordo com uma determinada caracterstica das classes. Esta organizao se faz necessria, pois por meio dela fica mais fcil para que outras pessoas que olhem o seu cdigo entendam o seu

PROGRAMAO I (JAVA) | Educao a Distncia

73

programa, alm de auxiliar no trabalho em equipe e manuteno do seu software. Dificilmente um programador que faa um software mais complexo que uma calculadora no utilize pacotes. Apesar de aparecer um <pacote padro> dentro do projeto, este no um pacote. Para se criar um pacote, basta clicar com o boto direito sobre a rea onde iro ficar as nossas classes, clicar em Novo -> Pacote Java....

Figura 39 Menu para se criar um Pacote novo Caso a opo Pacote Java... no esteja disponvel, selecione a opo Outro.... Esta opo ir abrir uma janela, onde voc dever procurar pela opo Java na janela da esquerda, e Pacote Java na janela da direita.

74

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 40 Forma alternativa para se criar um Pacote novo Ao se clicar em Pacote Java... uma nova janela ir se abrir, onde dever ser colocado o nome do pacote. Vamos atribuir o nome de Dados.

Figura 41 Tela onde o nome do pacote ser atribudo

PROGRAMAO I (JAVA) | Educao a Distncia

75

Dentro deste pacote, vamos criar uma classe nova, chamada Pessoa. Para isto, clique com o boto direito sobre o pacote Dados, selecione Novo -> Classe Java....

Figura 42 Menu para se criar uma nova Classe Java Em seguida, basta colocar o nome Pessoa e a classe ser criada. Ao abrir o arquivo Pessoa. java, podemos verificar que ele se encontra dentro do pacote Dados pela primeira linha de comando, que informa em qual pacote ele est. Tambm o NetBeans oferece um padro ao se criar as classes. Algumas informaes adicionais podem ser vistas, mas esto comentadas, ou seja, no faro diferena na nossa programao.

Figura 43 Cdigo gerado pelo NetBeans ao se criar uma classe com o nome de Pessoa

76

PROGRAMAO I (JAVA) | Educao a Distncia

Conceitos Bsicos de Classes Com a classe Pessoa aberta, pode-se verificar alguns detalhes. Primeiro que o nome da classe se encontra no fim do comando public class Pessoa. Este public class indica que iremos criar uma classe que poder ser utilizada por quem quiser us-la. Depois deste comando, d-se o nome da classe, que no por acaso o mesmo nome do arquivo, para depois abrir e fechar os colchetes. Tudo que se encontrar dentro destes colchetes far parte da classe Pessoa, por isso tome cuidado para quando for implementar seus atributos e mtodos, crie eles dentro destas chaves. Mas o que deveremos colocar dentro desta classe? Acho que chegou a hora de verificarmos qual o problema que dever ser resolvido com o nosso programa. Nosso usurio gostaria de ter uma agenda eletrnica, onde ele possa gerenciar o nome, idade e telefone de uma nica pessoa. Opa, ento o que fizemos at aqui foi o certo. Criamos uma classe Pessoa, que ir conter os dados que queremos guardar. Estes dados vo acabar virando Atributos de nossa classe. Atributos Os atributos de uma classe so, basicamente, variveis que se encontram dentro da classe, e que a ela pertencem. Como no exemplo a seguir, podemos ver 3 variveis criadas dentro da classe Pessoa. O tipo de varivel de cada atributo dever ser analisado e estipulado antes de se comear a programar. Para nosso problema, precisamos de uma varivel para guardar o nome, uma para a idade e outra para o telefone. Ficou definido que, para o nome e para o telefone, ser utilizado o tipo String, enquanto que para a idade, ser usado o tipo int.

Figura 44 Classe Pessoa depois de criar 3 atributos

PROGRAMAO I (JAVA) | Educao a Distncia

77

Agora, quando criarmos um objeto do tipo Pessoa, estas variveis sero criadas em forma de atributos, reservando um espao na memria para elas. Logo, se criar 10 objetos do tipo pessoa, sero reservados 20 espaos para se guardar String e 10 espaos para se guardar int. Apesar disso, cada objeto ter as suas variveis e no influenciaro uns nos outros. Mas ao criar-se um objeto do tipo Pessoa, as variveis tero algum valor padro? possvel mudar este valor padro? Podemos definir o valor padro por meio dos Construtores das classes. Construtores Este artifcio que podemos criar dentro de uma classe nos auxilia na hora definir valores padro para os atributos que sero criados ao se montar um objeto. Os construtores so mtodos, ou seja, podero conter cdigos de programao dos mais diversos. A principal diferena entre um construtor e um mtodo qualquer, que o construtor no pode conter nenhum tipo de retorno, dever ter exatamente o mesmo nome da classe e ele sempre ser chamado primeiro quando um objeto for construdo. Neste momento, vamos criar um construtor que apenas ir atribuir valores padro para os atributos criados anteriormente. Primeiramente precisa-se criar o cabealho do construtor, que contm se ele acessvel de fora da classe, o nome dele e se ele precisa de alguma varivel para comear a trabalhar. Para a classe Pessoa, precisaremos criar um construtor da seguinte forma:
public Pessoa(){ }

O public indica que ele ser acessvel de fora da classe. Conforme citado anteriormente, o nome do construtor exatamente o nome da classe (cuidado nesta parte, pois o java considera diferente as letras maisculas e minsculas). Por fim, temos que abrir e fechar os parnteses. Se houver necessidade de alguma varivel para o construtor funcionar, basta colocar entre estes parnteses. Como neste caso no h necessidade de nenhuma varivel a mais, basta

78

PROGRAMAO I (JAVA) | Educao a Distncia

colocar os parnteses sem nada. Eles so obrigatrios e esquec-los faz com que o java se engane, e pense que voc est tentando criar uma varivel comum, e no um mtodo. Em seguida ao cabealho, voc deve abrir e fechar as chaves, assim como foi feito na hora de criar a classe. Todos os cdigos referentes ao construtor devem estar dentro destas chaves. Como neste construtor iremos apenas iniciar os atributos com um valor, teremos o seguinte cdigo:

Figura 45 Construtor Pessoa(), inicializando os atributos vazios possvel criar diversos construtores para uma mesma classe. Como todos tm que ter o mesmo nome da classe, o que ir diferenciar um construtor do outro so as variveis criadas nos parnteses. Para o nosso exemplo, vamos criar um segundo construtor, porm os valores que iro para os atributos sero passados por parmetro. A passagem de parmetro se d quando recebemos estas variveis de fora, ou seja, pelos parnteses. A seguir podemos ver como ficar o segundo construtor.

Figura 46 Novo construtor, recebendo 3 parmetros, um para cada atributo Podemos reparar que a principal diferena entre o primeiro e o segundo construtor se d nos parnteses. Neste segundo pode-se ver 3 variveis sendo criadas como parmetros. Foi tomado o cuidado de no se criar variveis com os mesmos nomes dos atributos, mas

PROGRAMAO I (JAVA) | Educao a Distncia

79

veremos mais adiante o que fazer quando isso ocorrer. Porm, os tipos das variveis so os mesmos. Tambm muito importante notar como foi separada uma varivel da outra. Com o uso da vrgula. Como neste caso temos estas variveis, em vez de atribuir valores fixos para os atributos, as variveis foram atribudas. Vale lembrar que todos os cdigos, desde a criao dos atributos e dos construtores, devem ficar dentro das chaves da classe. O construtor um mtodo especial. Mas o que um mtodo? E se eu quiser criar um mtodo normal? Teremos esta resposta na prxima seo. Mtodos Enquanto os atributos definem as caractersticas que um objeto ter quando criado, os mtodos iro indicar quais funcionalidades que este objeto ter. Os mtodos nada mais so do que pedaos de cdigo que recebem um determinado nome, e que podem ser chamados quando criamos um objeto. A estrutura de criao de um mtodo um pouco diferente da de um construtor. Este possui 4 partes. Primeiro, identificado se ele acessvel para outras classes. Em seguida, temos que indicar se ao fim do mtodo, este ter que retornar algum valor ou no. Em seguida, temos o nome e, por fim, se ele ir receber algum tipo de parmetro ou no. Supondo que vamos criar um mtodo que recebe uma idade, e este mtodo dever verificar se uma idade vlida, ou seja, se maior que 0 anos de idade. Se for, dever retornar verdadeiro, e caso no for, dever retornar falso. Mesmo no sabendo como iremos realizar esta comparao, j podemos pensar em como ficar o cabealho deste mtodo. Primeiro, ele dever ser acessvel de outras classes. Depois, dever retornar verdadeiro ou falso, dependendo da idade. Para este tipo de valor, podemos utilizar uma varivel do tipo boolean. Depois temos o nome, que iremos colocar como

80

PROGRAMAO I (JAVA) | Educao a Distncia

testeidade. Por fim, este mtodo dever receber a idade que ir testar para poder avali-la. O cabealho da funo ficar desta forma:
public boolean testeIdade(int idade) { }

Com a varivel em mos, fica fcil montar uma lgica de programao que testa se a idade maior ou menor que 0. O cdigo para esta funo pode ser escrito com um simples if:
if (idade >=0) return true; else return false;

O cdigo final fica:

Figura 47 Mtodo testeIdade, que recebe um parmetro e retorna true ou false Mas como podemos ter certeza de que esta varivel idade no if a varivel que est sendo passada por parmetro, e no o atributo "idade" da classe? Existe uma regra que diz que uma varivel criada dentro de um mtodo (ou dentro das chaves, ou dentro dos parnteses) sempre leva vantagem sobre um atributo. Esta caracterstica recebe o nome de sombreamento, onde a varivel criada para o mtodo deixa o atributo em sua sombra. Mas e se quisermos acessar o atributo de dentro do mtodo? Veremos mais adiante como realizar esta faanha. Outro mtodo interessante de se criar uma mensagem padro para mostrar os atributos da classe de forma ordenada. Para isto, vamos criar um mtodo chamado mostrarDados, onde

PROGRAMAO I (JAVA) | Educao a Distncia

81

este no precisa receber nenhum valor, mas ele retorna uma String preparada para ser usada. O cdigo desta funo ficar da seguinte forma:

Figura 48 Mtodo mostrarDados, que retorna uma frase contendo os atributos organizados Repare que para criar os nomes dos mtodos, algumas regras so adotadas para manter um padro. Primeiro, importante ressaltar que nomes de mtodos no podem conter espaos, caracteres especiais ou iniciar com nmero. Alm disso, adota-se a seguinte regra: o nome do mtodo inicia-se com minsculo, e a cada palavra nova, no d espao nem underline, mas deixa a primeira letra maiscula. Esta ltima regra um padro adotado entre os programadores, com o intuito de uma maior legibilidade dos nomes dos mtodos. Fica a seu cargo adotar esta regra ou no. Nossa classe Pessoa est pronta. Ela contm 3 atributos, 2 construtores e 2 mtodos que poderemos utilizar quando criarmos um objeto. Mas e o objeto dela, vamos criar onde? Para poder utilizar esta classe, precisaremos criar uma segunda classe, mas com uma diferena bem crucial. Esta segunda classe no servir para se criar objetos, mas sim para conter o mtodo main. Normalmente, cada mtodo possui um nome diferente em relao aos outros que esto na mesma classe, que um fator determinante para diferenci-lo dos demais. Porm, muitas vezes voc ter a necessidade de que um mtodo tenha a possibilidade de trabalhar com diferentes tipos de variveis. Um exemplo claro o mtodo println(). Apesar de manter o mesmo nome, voc pode passar qualquer tipo de varivel que ele mostrar na tela. Ns podemos recriar esta caracterstica tambm realizando a sobrecarga de um mtodo.

82

PROGRAMAO I (JAVA) | Educao a Distncia

Um mtodo no identificado pelo seu nome, e sim pela sua assinatura. A principal diferena que na assinatura, alm do nome, os parmetros tambm ajudam a identificar. Vamos criar um mtodo chamado teste:
public void teste(){...}

A assinatura deste mtodo teste(). Se quisermos criar outro mtodo com o mesmo nome, devemos mudar a forma como os parmetros esto chegando, por exemplo:
public void teste(String var1){...}

Porm, a assinatura de um mtodo no leva em considerao o nome das variveis, ou seja, no possvel criar outro mtodo chamado teste, que receba uma varivel do tipo String, mesmo que esta varivel tenha outro nome. O que levado em conta o nmero de parmetros e a ordem deles. Logo, podemos criar outro mtodo:
public void teste(String var1, String var2, int var3){...}

e
public void teste(String var1, int var2, String var3){...}

O mtodo main Este mtodo bem especial, pois serve de ponto de partida para que o seu sistema comece a rodar. Todo programa em java comea de um mtodo main, que chama outros mtodos e cria objetos de outras classes. Enquanto as outras classes trazem os cdigos necessrios para resolver nosso problema, o main ir efetivamente resolver o problema com o auxlio das classes previamente criadas. O mtodo main possui uma forma exata de ser criado, que a seguinte:
public static void main (String args[]){ }

Para que ele seja o incio de seu programa, ele deve conter todos estes detalhes. Primeiro, o public indica que ele ser aberto para outras classes. O static, uma novidade para ns at o momento, indica que no precisaremos criar um objeto desta classe para usar o main. Desta

PROGRAMAO I (JAVA) | Educao a Distncia

83

forma, o prprio java chama este mtodo por voc. Void indica que o mtodo no retorna nada e main o seu nome. Como parmetro, ele recebe um vetor de Strings, que pode ser passado ou no, quando se chama o main. Vamos criar um pacote novo chamado Principal (ainda lembra como?) e, dentro deste pacote, criar uma classe chamada Incio. Vamos criar um mtodo main dentro desta classe. O cdigo dever ficar da seguinte forma:

Figura 49 Nova classe Incio, dentro do pacote Principal; esta classe contm o mtodo main Para verificar se o seu cdigo est funcionando, vamos mandar imprimir um Ol Mundo! na tela. Para isto, vamos usar o seguinte comando:
System.out.println(Ol Mundo!);

System.out indica a sada padro do computador, que por hora o monitor. Neste comando, utilizamos o mtodo println, que imprime o que passamos por parmetro e pula uma linha. Para imprimir na tela, tambm podemos utilizar mtodos como print e printf, que possuem poucas diferenas, e ao longo de nossa experincia iremos verificar quais so elas.

84

PROGRAMAO I (JAVA) | Educao a Distncia

Para executar o seu cdigo, o Netbeans oferece uma srie de possibilidades. Uma delas clicar com o boto direito sobre o seu projeto e escolher a ao Executar.

Figura 50 Menu utilizado para executar o projeto Todo projeto precisa indicar qual a sua classe que contm o mtodo main implementado. Caso no estiver configurado, ele ir solicitar quando for executar o seu programa. No nosso caso, basta selecionar a opo Principal.Inicio. possvel verificar que este nome est assim por causa da organizao feita at o momento. Primeiro indicar o caminho entre os pacotes e, por fim, o nome da classe.

Figura 51 Tela utilizada para indicar qual classe contm o mtodo main Para verificar se o seu projeto contm uma classe principal, ou se voc quiser mudar esta classe em seu projeto, basta clicar com o boto direito sobre o seu projeto e escolher Propriedades.

PROGRAMAO I (JAVA) | Educao a Distncia

85

Uma vez aberta a janela de propriedades, procure pela categoria Executar. Ao selecionar esta categoria, alguns campos iro aparecer na janela. Procure pelo campo Classe Principal. Este campo contm qual classe ser inicializada primeiro. Voc pode mudar a classe principal clicando no boto Procurar ao lado do campo.

Figura 52 Tela de Propriedades do Projeto Se a classe principal estiver configurada corretamente, ao executar o seu projeto uma nova aba chamada Sada dever aparecer na janela do NetBeans contendo o resultado de seu programa. Neste caso, apenas um Ol Mundo!.

Figura 53 Tela contendo o resultado da execuo do cdigo gerado Mas onde esto os objetos? Como fao para cri-los e utiliz-los?

86

PROGRAMAO I (JAVA) | Educao a Distncia

OBJETOS JAVA
Em nosso programa, at agora, apenas criamos classes. Uma ainda nem foi utilizada, enquanto que a outra age como a classe principal. A partir de agora, nossos esforos estaro voltados para criar o cdigo dentro da classe Incio, dentro do mtodo main. Primeiro, vamos criar um objeto da classe Pessoa, que se encontra em outro pacote. Depois, vamos adicionar uma linha de comando antes da classe Incio, porm depois do comando que indica o pacote daquela classe.
import Dados.Pessoa;

Este comando importa para a classe uma outra classe, podendo esta ser de uma biblioteca ou de outra classe disponvel na mquina. No nosso caso, vamos importar a classe Pessoa, que se encontra dentro do pacote Dados. A partir de agora, podemos criar e usar a classe Pessoa. Vamos us-la para criar um objeto. Dentro do mtodo main, vamos inserir o seguinte comando:
Pessoa pes = new Pessoa();

O comando acima cria um objeto do tipo Pessoa, chamado pes. Este comando possui 2 etapas bem distintas. O Pessoa pes cria uma varivel do tipo Pessoa. Seria o equivalente a colocarmos int pes, que seria uma varivel do tipo inteiro. Porm, o objeto ainda no existe s nesta declarao. Neste momento, apenas a referncia ao objeto foi criada, ficando a cargo do new Pessoa() a funo de instanciar o objeto, ou seja, criar o objeto na memria. O comando new reserva o espao na memria, que tem seu valor calculado quando informamos qual tipo de objeto ser criado, indicado no Pessoa(). Estas duas aes so to distintas que podemos reescrever o cdigo acima em 2 linhas separadas.

PROGRAMAO I (JAVA) | Educao a Distncia

87

Pessoa pes; pes = new Pessoa();

Porm, existe uma regra de que voc no pode utilizar o objeto enquanto ele no for criado na memria, ou seja, no for dado o comando new nele. Uma questo muito importante que, ao se dar este comando, logo em seguida voc determina qual construtor ir chamar. No cdigo anterior, voc chama o construtor que no recebe parmetro algum. Logo, os atributos destes objetos esto zerados ou com Strings vazias. Como temos 2 construtores disponveis para uso, para utilizar o construtor que recebe valores por parmetros, basta mandar os valores no comando new. Exemplo:
Pessoa pes2 = new Pessoa(Joo,(11)0980-0980,13);

Neste comando, estamos criando um segundo objeto chamado de pes2, onde, ao instanciar o objeto, os valores que esto sendo passados sero passados para os atributos. Mas e o primeiro objeto, o pes? Agora que ele j foi criado e passou pelo construtor que inicia os atributos zerados, como podemos fazer para atribuir algum valor para ele? Podemos acessar seus atributos e mtodos colocando o nome do objeto, um ponto e o atributo ou mtodo desejado. Vamos atribuir alguns valores para seus atributos.
pes.nome = Fulano; pes.idade = 22; pes.telefone = (00) 7654-3210;

Porm, ao inserirmos este cdigo acima, o NetBeans acusa que estas so linhas de programao que contm erros. Para analisar o erro, coloque o cursor sobre o sinal de aviso no incio da linha com erro.

88

PROGRAMAO I (JAVA) | Educao a Distncia

Figura 54 Cdigos dentro da classe Incio, que contm erros Ao ler o problema, ele est indicando que os atributos no so acessveis de fora do pacote por no serem pblicos. Para resolver este problema, podemos adotar duas medidas. A primeira e mais simples inserir o modificador public para cada atributo na classe, conforme a imagem seguinte.

Figura 55 Modificao nos atributos da classe Pessoa com o Public A segunda medida que podemos tomar ser discutida na prxima seo. A partir de agora, o nosso objeto pes possui seus atributos com os valores determinados naquele cdigo. Para confirmar, vamos utilizar o mtodo mostrarDados() para mostrar os valores dos atributos. O comando ficar assim:
System.out.println(pes.mostrarDados());

Para verificar que cada objeto tem os seus dados, vamos tambm chamar o mesmo mtodo, mas pelo objeto pes2.
System.out.println(pes2.mostrarDados());

O cdigo e o resultado devem ficar desta maneira:

PROGRAMAO I (JAVA) | Educao a Distncia

89

Figura 56 Cdigo e resultado do cdigo gerado e executado Um erro muito comum que ocorre no momento que trabalhamos com mais de um objeto dentro de um mtodo. O que acontece se colocarmos a seguinte operao:
pes = pes2;

Em um primeiro momento, parece que os atributos foram replicados e agora existem dois objetos contendo os mesmos valores. Porm, voc ir perceber algo estranho quando voc mudar o atributo de algum dos objetos. Se esta linha acima for executada, caso voc altere o atributo nome de um objeto, o outro tambm ser alterado. Isto porque os objetos no foram replicados, e sim apenas a varivel que aponta para o objeto. Na verdade, existe um nico objeto e 2 caminhos diferentes para se chegar nele. extremamente importante fazer com que

90

PROGRAMAO I (JAVA) | Educao a Distncia

cada varivel criada para servir de objeto tenha o seu prprio comando new. Atribuies desta forma podem levar a erros que no so facilmente identificados. Existe um objeto especial, que podemos usar como quisermos e que nos ajuda ao criar os mtodos de algumas classes. Este objeto especial o this. No h necessidade de cri-lo para utiliz-lo, porm ele tem um uso muito restrito. Ele representa o prprio objeto. Complicado? Bom, como podemos pegar o atributo nome do objeto criado pes? Basta colocar:
pes.nome;

Porm, se estamos dentro da classe Pessoa, como podemos acessar o prprio atributo, sendo que cada objeto tem o seu? Fcil, coloque:
this.nome;

Assim, quando chegar nesta linha, o Java saber que para voc pegar o atributo do prprio objeto. Portanto, quando um objeto chamar uma funo que contenha este cdigo, ele vai pegar o prprio atributo e utiliz-lo. Anteriormente, ao criarmos o mtodo de testar a idade, criamos uma varivel dentro do mtodo com o mesmo nome do atributo. Se deixarmos no if a condio:
if (idade > 0)

Ser analisada a varivel que est chegando pelo parmetro. Se mudarmos para:
if (this.idade > 0)

O atributo que ser utilizado. Vamos deixar sem o objeto this, pois montamos nosso mtodo para trabalhar com o parmetro mesmo. Com o uso do this, podemos at mesmo chamar construtores, mas veremos depois de aprender sobre JavaBeans. Mas agora uma questo importante, podemos criar um construtor que recebe um objeto como parmetro? A resposta claro que sim, mas tem que ter certo cuidado na hora que for trabalhar com ele.

PROGRAMAO I (JAVA) | Educao a Distncia

91

Este tipo de construtor muito til quando voc possui objetos que voc quer replicar e evitar o erro de 2 variveis apontarem para o mesmo objeto. Basicamente, a gente recebe o objeto como parmetro, mas dentro do construtor, cada atributo tratado separadamente. O cdigo desta funo possui as seguintes caractersticas:

Figura 57 Novo construtor, recebendo um Objeto do mesmo tipo como parmetro

JAVABEANS OU POJOS
O que fizemos at agora foi criar duas classes, sendo que uma a classe principal e contm o mtodo main, enquanto que a outra foi criada para ser utilizada. Esta classe que foi criada com o intuito de se criar objetos dela foi feita da maneira mais fcil possvel, porm fica fora das convenes adotadas para se criar classes deste tipo. Estas convenes foram escolhidas pela sociedade de desenvolvedores para estabelecer um padro entre as diferentes classes que so criadas ao redor do mundo, e assim, desta forma, facilitar o uso de objetos criados a partir desta classe. Apesar deste programa funcionar sem adotar estas convenes, o ideal segui-las para que sua classe possa ser facilmente reutilizvel e para que voc, acostumado com as convenes, possa facilmente utilizar outras classes. A primeira conveno que um construtor que no receba parmetros seja feito para que valores vazios sejam atribudos. Esta conveno j foi atendida pela nossa classe.

92

PROGRAMAO I (JAVA) | Educao a Distncia

Um prximo item seria tratar todos os atributos como private, ao invs de public. Isso implica que no podemos acessar o atributo diretamente de outra classe, como fizemos no exemplo anterior. S que se colocarmos as variveis como privadas, nosso cdigo ficar com problemas. Ao colocar um atributo como private, faz-se necessrio criar 2 mtodos especficos para aquele atributo, voltados para desempenhar as 2 funes principais de um atributo, receber valor e recuperar o valor que possui. Para isto, vamos criar os mtodos para o atributo nome. O cdigo, a seguir, cria um mtodo para inserir um valor em nome.
public void setNome(String nome){ this.nome = nome; }

Veja que foi adotada a nomenclatura setNome para seguir um padro. O nome do mtodo que ir inserir valores nos atributos sempre ser set + Nome do Atributo. Este mtodo normalmente no possui retorno, pois uma operao de insero de contedo. Por isso, temos um parmetro do mesmo tipo do atributo, e este parmetro est sendo atribudo para o atributo. Neste momento, podemos notar como o this consegue diferenciar o atributo da varivel. J o mtodo que retorna o contedo do atributo fica um pouco diferente:
public String getNome(){ return this.nome; }

possvel notar a diferena no nome, j que este faz a unio do nome do atributo com a palavra get. Alm disso, ele possui o retorno do mesmo tipo do atributo e no recebe nenhum parmetro. Vamos ver como ficar nossa classe depois de criados todos os gets e sets.

PROGRAMAO I (JAVA) | Educao a Distncia

93

Figura 58 Criao dos mtodos get e set para os atributos que ficaram privates Uma vez os atributos privados e seus mtodos de acesso criados, s nos falta alterar o cdigo na classe Incio para que utilize estes mtodos de acesso. Vamos substituir as linhas voltadas insero de contedo pelos seus respectivos mtodos set. Como vamos utilizar um mtodo, no h necessidade do sinal de igual. Basta passar o valor desejado dentro dos parnteses como parmetros.

Figura 59 Forma de utilizao dos mtodos set e get na classe Incio

94

PROGRAMAO I (JAVA) | Educao a Distncia

Voc pode estar se perguntando: mas por que toda esta volta? O cdigo est fazendo a mesma coisa que antes, mas est maior e mais complexo. O que ganhamos com isso? Realmente o cdigo fica maior e mais complexo, porm agora voc, como dono da classe que criou, tem um controle maior em como os objetos criados a partir dela trabalham com seus atributos. Vamos supor que no seu programa de extrema importncia que no possa ter idade negativa. Antes ficava a cargo de quem utilizava seu objeto de cuidar que isto no ocorra, mas agora voc pode controlar isto. bem simples, basta apenas lembrar que dentro dos mtodos podemos adicionar qualquer comando de programao, e que estes sets e gets so mtodos. Para resolver o problema da idade negativa, vamos adicionar um controle dentro do setIdade. Assim, o objeto pode tentar inserir uma idade negativa, mas no conseguir. Dessa forma os atributos ficam mais protegidos e sua classe menos propensa a cometer erros. Para este problema em especfico, temos criado j um mtodo testaIdade, que verifica exatamente esta condio. Vamos fazer uso deste mtodo dentro do mtodo setIdade e caso seja negativo, atribuir o valor 0 idade.
public void setIdade(int idade){ if (testeIdade(idade)) this.idade = idade; else this.idade = 0; }

Como o mtodo est na mesma classe que o mtodo setIdade, no h necessidade de se criar um objeto para cham-lo. Assim, o parmetro que est chegando passado para o mtodo testaIdade que, por sua vez, retorna verdadeiro ou falso. Este retorno utilizado pelo comando if para direcionar o cdigo. Com os mtodos get e set criados, o ideal que mesmo dentro da classe, eles sejam utilizados. Assim, no h qualquer meio de um atributo no passar pelo teste imposto no mtodo. No nosso

PROGRAMAO I (JAVA) | Educao a Distncia

95

exemplo, vamos alterar tanto os construtores, quanto o mtodo mostrarDados(). Verificamos na alterao tambm que os mtodos get e set esto sendo chamados como o uso do this, porm no h necessidade deles. Como veremos mais adiante, os mtodos fazem parte do comportamento dos objetos, o que algo compartilhado com todos. Foi utilizado o this apenas para enfatizar como utiliz-lo na classe.

Figura 60 Modificao nos mtodos para todos usarem apenas get e set Um cdigo mostrado acima que vale a pena comentar a atribuio de um objeto para o outro. Vamos pegar a atribuio do atributo nome:
this.setNome(nova.getNome());

Neste comando, dois mtodos de dois objetos diferentes esto sendo chamados. Primeiro chamado o mtodo getNome() do objeto nova. Por ser um get, ele no recebe parmetros

96

PROGRAMAO I (JAVA) | Educao a Distncia

e retorna uma String. Este retorno est sendo utilizado como forma de parmetro para o setNome do objeto this, ou seja, dele prprio. Sempre que h vrios mtodos aninhados pela utilizao dos mesmos como parmetros para outros, sempre leve em conta que o mtodo que est mais interno nos parnteses ser executado primeiro. Outra forma que podemos fazer com os construtores direcionar os outros construtores para um nico construtor. Complicado? Nesta classe ns temos 3 construtores, que basicamente fazem a mesma coisa, porm com atributos em quantidades e formatos diferentes. Porm, o cdigo dentro deles muito parecido. Por que, em vez de ficar replicando as chamadas dos mtodos set em cada construtor, no elegemos um nico construtor que ter estas chamadas dos mtodos set e direcionamos os outros para o construtor eleito? bem simples se utilizarmos o this. Normalmente o construtor eleito para este trabalho aquele que recebe os atributos separadamente por parmetro. Comeando pelo primeiro construtor, vamos chamar o construtor eleito da seguinte forma:
this(,,0);

O comando this usado de uma forma diferente neste caso. No h necessidade do uso de pontos para chamada de mtodo, apenas o this e os parmetros. Como o construtor eleito recebe nome, telefone e idade, nesta ordem, passamos por parmetro os valores que ele dever colocar em cada atributo. J no construtor que recebe o objeto como parmetro, o comando ficar da seguinte forma:
this(nova.getNome(), nova.getTelefone(), nova.getIdade());

Simplesmente estamos pegando cada atributo separadamente e mandando em forma de parmetro para o construtor eleito. Os trs construtores juntos ficam da seguinte forma:

PROGRAMAO I (JAVA) | Educao a Distncia

97

Figura 61 Modificao nos construtores, para que todos apontem para um nico construtor

ESTADO E COMPORTAMENTO
A partir de uma nica classe, podemos criar diversos objetos. Porm, existe alguma forma de distinguir um objeto do outro? O que eles possuem em comum? Vamos analisar o que feito na classe. As classes so compostas por um conjunto de atributos e mtodos. O que ficou claro nos exemplos anteriores que cada objeto criado possui seus prprios atributos. Mesmo que for da mesma classe, cada um possui o mesmo nmero e tipo de variveis, mas cada um com o seu valor. Neste caso, a classe s informa o modelo do que cada objeto ir conter, mas o valor gerenciado pelo objeto. Este conjunto de atributos de um objeto define o estado em que ele se encontra. Cada objeto, por ter os seus prprios atributos, pode estar em estados diferentes. Por exemplo, dois objetos criados a partir da classe File, que gerencia arquivos do sistema. Um objeto pode estar com um documento em aberto e pronto para alterar, enquanto que o outro pode j estar fechado, no podendo mais alterar o arquivo.

98

PROGRAMAO I (JAVA) | Educao a Distncia

J o comportamento que o objeto tem algo descrito e compartilhado entre todos os objetos por meio dos mtodos. Estes possuem um cdigo criado pelo desenvolvedor, que no se altera de objeto para objeto, logo, todos possuem as mesmas funes. Seus atributos podem acabar influenciando em um mtodo, mas todos os objetos tm acesso a todas as funes que os outros objetos tm. Podemos ver esta questo no nosso exemplo. Quando criamos dois objetos, ao chamar a funo setIdade(), ela ir atribuir o valor passado ou 0, dependendo do valor. Porm, todos os objetos esto sujeitos a executar qualquer parte do cdigo. Comparando Objetos Se voltarmos algumas pginas, no momento em que citado sobre a criao de um objeto, vemos que o objeto criado no momento em que usamos o comando new. Antes disso, criada uma varivel (no nosso exemplo o pes e o pes2), que vai servir de ponte para o nosso objeto quando resolvermos cri-lo. Ou seja, podemos criar esta varivel, e s depois de muitas linhas de cdigo chamar o new. Isso nos faz pensar, o que esse pes se ele existe antes mesmo de criar o objeto? Podemos pensar nele como um ponteiro que aponta para o objeto quando criado. Ou seja, quando executamos o seguinte comando:
Pessoa pes;

Estamos criando um ponteiro que no aponta para lugar algum. A partir do momento que fazemos:
pes = new Pessoa();

O ponteiro pes recebe o endereo de onde o comando new criou o objeto. Para termos certeza disto, basta colocar o seguinte comando:
System.out.println(pes);

PROGRAMAO I (JAVA) | Educao a Distncia

99

Ir aparecer um valor numrico precedido de um arroba e algumas letras. Isto na verdade o valor que pes possui, o endereo de seu objeto. Por isso, normalmente no trabalhamos com a varivel pes diretamente. Sempre colocamos um ponto para acessar o contedo do objeto apontado, como um mtodo ou atributo. Vamos efetuar uma alterao no nosso cdigo. Quero que seja criado um cdigo que analise quem a pessoa que possui a maior idade e mostre o nome dela na tela. Baseado no cdigo produzido at aqui, vamos acrescentar o seguinte cdigo dentro do mtodo main, depois dos cdigos j criados:
if (pes > pes2) System.out.println(pes.getNome()); else System.our.println(pes2.getNome());

Apesar do NetBeans no apontar erro na sintaxe, nosso cdigo acima contm um erro grave. Ao compararmos os objetos por meio de seus ponteiros, na verdade estamos comparando qual endereo de memria possui o maior valor. Logo, nosso cdigo vai mostrar o nome de pes se o endereo apontado em pes for maior. Para que seja efetuada a comparao correta, precisa-se especificar qual atributo est sendo testado.
if(pes.getIdade() > pes2.getIdade())

Java Classes e Objetos Por Mic Duarte Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://forum.imasters.com.br/topic/336253-curso-java-classes-e-objetos/>.

100 PROGRAMAO I (JAVA) | Educao a Distncia

Diferenas entre classes e objetos em Java Disponvel em: <http://www.youtube.com/watch?v=biGRUS_3NbY>.

CONSIDERAES FINAIS
Vimos nesta Unidade como criar Projetos dentro do NetBeans, alm da criao de classes e da organizao das mesmas dentro de pacotes. Tambm vimos que as classes podem e devem ser trabalhadas para que os atributos sejam protegidos de alteraes externas, deixando-os privados e acessveis somente por meio de mtodos get e set. Tambm vimos que existem os construtores, mtodos especiais que so chamados no momento que o objeto de uma determinada classe criado. Os objetos foram criados a partir de outra classe, e chamando o construtor, o objeto passa a existir e assim podemos acessar seus mtodos e atributos que esto disponveis. Agora voc dever ser capaz de criar classes simples, alm de conseguir utiliz-las.

ATIVIDADE DE AUTOESTUDO
1. Vamos utilizar nosso conhecimento para ver se conseguimos resolver um problema real. Nosso dinheiro uma das coisas mais importantes que temos nos dias de hoje. Para isso, precisamos de um programa confivel que gerencia exatamente quanto temos. Crie uma classe chamada Conta que consiga gerenciar o quanto de dinheiro temos, onde as nicas operaes que podemos fazer com o nosso dinheiro guardado sacar e depositar. Crie uma classe nova chamada Incio, que ir conter o mtodo Main, e crie dois objetos da classe Conta, um chamado contaCorrente e outro Poupana.

PROGRAMAO I (JAVA) | Educao a Distncia

101

UNIDADE IV

MODIFICADORES JAVA E ENCAPSULAMENTO


Professor Dr. Edson A. Oliveira Junior Objetivos de Aprendizagem Entender o conceito de encapsulamento. Estudar os modificadores de acesso public, protected e private. Entender a diferena dos modificadores static, abstract e final. Controlar o acesso a mtodos, atributos e construtores por meio de modificadores. Entender o que so Construtores de Classes. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: O que encapsulamento Modificadores de acesso public, private e protected Utilizando modificadores de acesso (getters e setters) Modificador static Modificador final Modificador abstract Construtores

INTRODUO
Ol, seja bem-vindo(a) ao mdulo de Modificadores de Acesso em JAVA. Nesta Unidade, sero estudados conceitos importantes para a programao Orientada a Objetos, pois a partir dos modificadores que poderemos tratar do encapsulamento das classes. A ideia de encapsulamento remete ao fato de que possvel agrupar estados e comportamentos em um mesmo mdulo e ainda controlar suas propriedades e seu acesso. Para isso, sero tratados ainda neste mdulo como escrever mtodos de acesso aos elementos de uma classe utilizando os chamados mtodos getters e setters. Alm dos modificadores de acesso, existem outros modificadores que podem ser utilizados para atribuir novas funes aos mtodos e atributos, e estes podem ser utilizados em conjunto com modificadores de acesso. So eles: static, final e abstract. E, por fim, ser mostrado como possvel implementar Construtores para as classes e desta forma controlar como os objetos de uma classe sero inicializados. ENCAPSULAMENTO Quando se fala de encapsulamento, voc provavelmente imagina um objeto fechado, dentro de uma cpsula, e isto no muito diferente na programao Orientada a Objetos, pois a ideia principal do encapsulamento envolve omitir os membros de uma classe, alm de esconder como funcionam as rotinas ou regras de negcio. Desta forma, o programador deve se atentar s funcionalidades da Classe, e no como ela foi implementada, e isto bom uma vez que h aumento na modularidade do seu projeto. Sendo assim, realizar o encapsulamento de um projeto fundamental para que seja possvel minimizar o impacto de problemas referentes a alteraes do projeto, uma vez que no preciso alterar uma regra de negcio em vrios lugares, mas sim em apenas um nico lugar, j que tal regra est encapsulada.

PROGRAMAO I (JAVA) | Educao a Distncia

105

Para exemplificar, vamos focar no problema de realizao de operaes bancrias de um caixa eletrnico. No caixa possvel: sacar dinheiro, depositar, verificar saldo, verificar extrato, pagar contas e fazer transferncias. Para utilizar o caixa eletrnico, no necessrio conhecer como as operaes foram implementadas em nvel de programao, mas sim o que cada operao afeta sua conta. Analise a Figura 62 logo abaixo e verifique a classe Conta, com atributos e mtodos para uma Conta Corrente. Note, por exemplo, que o mtodo transferir recebe como parmetro o nmero da conta (numContaDestino) e um valor a ser transferido (valor). Para utilizar este mtodo, o programador no precisa saber como o criador desta classe implementou o mtodo transferir, basta saber que este mtodo responsvel por enviar um valor a outra conta corrente e que esta transferncia implica em subtrao do saldo da conta remetente.

Figura 62 Classe Conta com atributos e mtodos pblicos


Fonte: o autor

Ainda em relao Figura 62, esta est ilustrada em um diagrama de Classe UML, e o smbolo de soma (+) indica que tanto os atributos quanto os mtodos so pblicos, isso significa que eles podem ser acessados e modificados de qualquer outra classe do projeto, e isto no uma boa prtica de programao, uma vez que seus atributos esto expostos e qualquer outro objeto pode alterar os valores dos elementos das classes, o que pode comprometer a coeso de seu projeto. Por exemplo:
//Criao da referncia a Conta Conta c = new Conta(); //Modificao do atributo saldo de forma direta c.saldo = 0;

106 PROGRAMAO I (JAVA) | Educao a Distncia

Para solucionar este problema, faz-se necessria a utilizao de modificadores de acesso, sendo que estes faro o papel de restringir ou autorizar o acesso a determinados atributos ou mtodos das classes, e isto ser visto a partir da prxima seo. Modificadores de Acesso: default, public, private e protected a partir dos modificadores de acesso que poderemos restringir ou no o acesso aos atributos e mtodos de uma classe. Na programao Orientada a Objetos, os modificadores de acesso mais utilizados so o public e o private. Antes de abordar modificadores, importante frisar alguns conceitos bsicos sobre a programao em JAVA: Projeto e Pacotes do projeto. Um projeto a base para o desenvolvimento em Java, nele que estaro todos os pacotes e classes da sua aplicao. Quando trabalhamos com o Netbeans, para a criao de um projeto, basta irmos ao menu Arquivo e, em seguida, selecionar a opo Novo Projeto, feito isso, aparecer uma tela, como voc pode verificar na Figura 63 a seguir:

Figura 63 Criando um projeto em JAVA no Netbeans

PROGRAMAO I (JAVA) | Educao a Distncia

107

Como o Netbeans uma ferramenta que suporta diversas linguagens de programao, ao criar o projeto, necessrio previamente selecionar a linguagem e, em seguida, o tipo de projeto, sendo assim, vamos criar um Aplicativo Java selecionando a opo Aplicativo Java. Feito isso, uma nova tela ir solicitar o preenchimento do nome do projeto, como voc pode verificar na Figura 64:

Figura 64 Configurando o nome do projeto Aps estas etapas, seu projeto estar criado e poder ser visualizado na Paleta de Projetos do Netbeans, como pode ser verificado na Figura 65. Como voc pode notar, um projeto envolve Pacotes e Bibliotecas que, porventura, sua aplicao necessite utilizar.

Figura 65 Projeto em Java

108 PROGRAMAO I (JAVA) | Educao a Distncia

Para criar um novo pacote na pasta Pacotes de cdigo-fonte, por exemplo, necessrio clicar sobre a pasta com o boto direito e selecionar a opo: Novo -> Pacote Java e, em seguida, dar um nome ao seu novo pacote, como mostra a Figura 66.

Figura 66 Criando um novo pacote Agora que voc j entendeu o conceito de Pacotes, podemos iniciar a teoria sobre modificadores de acesso. Temos quatro modificadores de acesso: public, private, protected e default. O modificador default no precisa ser declarado, ou seja, atributos ou mtodos que no tm a declarao de um modificador de acesso so considerados default (que do ingls significa padro). Como exemplo, voc pode notar no cdigo abaixo a criao de um atributo com modificador de acesso default. No pacote em que est localizada a classe criada, o atributo com modificador default pode ser acessado de forma direta por qualquer classe, agora, se a classe que instanciar a classe estiver em outro pacote, este no ser acessvel de forma direta.
//exemplo de atributo default String exemploDefault;

Atributos e mtodos pblicos (public) podem ser acessados e modificados de qualquer classe do projeto a partir da instncia do objeto, ou seja, at de outros pacotes possvel ter acesso

PROGRAMAO I (JAVA) | Educao a Distncia

109

a atributos/mtodos do tipo public de forma direta. Para declarar este tipo de modificador, necessrio utilizar a palavra reservada public antes de indicar o tipo de varivel, isto pode ser verificado no exemplo de cdigo-fonte abaixo.
//exemplo de atributo public public int inteiroPublic; //exemplo de mtodo public public int soma(int a, int b){ return a+b; }

J atributos e mtodos privados (private) so acessados somente pela prpria classe, independente do pacote em que a classe esteja. O cdigo-fonte abaixo mostra como se pode criar um atributo privado. Mtodos privados s podem ser acessados pela prpria classe, ou seja, eles no so visveis e nem acessados por outros objetos.
//exemplo de atributo private private String nomePrivate; //exemplo de mtodo private private String[] splitNome(String n){ return n.split( ); }

Outro modificador de acesso no to comumente utilizado o modificador protected (protegido em portugus), este tipo de modificador funciona como um modificador pblico para elementos que esto no mesmo pacote, e em outros pacotes ele s visvel para classes que herdam a classe que possui o atributo protegido. A criao de atributos/mtodos protegidos se faz por meio da palavra reservada protected antes da criao do atributo/mtodo.
//exemplo de atributo protected protected String nomeCliente; //exemplo de mtodo protected protected String[] splitNome(String n){ return n.split( ); }

110 PROGRAMAO I (JAVA) | Educao a Distncia

Baseado nas explicaes dadas at aqui sobre os modificadores, possvel montar uma tabela que resume se o atributo/mtodo acessvel ou no dependendo de sua localizao no projeto. Tabela 6 Modificadores de acesso e suas visibilidades
Modificador Na prpria classe Em outro pacote No mesmo pacote Herana (em pacote diferente) public private protected default Acessvel Acessvel Acessvel Acessvel Acessvel No No No Acessvel No Acessvel Acessvel Acessvel No Acessvel No

importante que voc, como um futuro bom programador, entenda bem esta tabela, e a tenha sempre com voc para eventuais consultas. Sendo assim, na prxima seo vamos mostrar na prtica como utilizar os modificadores de acesso de modo a manter o encapsulamento de suas aplicaes.

UTILIZANDO MODIFICADORES DE ACESSO


Tendo como base um projeto exemplo de um Caixa Eletrnico, onde o objetivo realizar operaes em contas bancrias, vamos elucidar a utilizao dos modificadores de acesso, alm disso, trazer o conceito dos getters e setters. Para isso, veja como foi projetada a aplicao na Figura 67.

Figura 67 Exemplo de projeto, seus pacotes e cdigos-fonte


PROGRAMAO I (JAVA) | Educao a Distncia

111

Como voc pode notar, o projeto possui 3 pacotes: caixaeletronico, cliente e conta. Cada pacote tem suas classes que possuem suas particularidades e sero descritas uma a uma a seguir. O pacote caixaeletronico possui a classe CaixaEletronico e esta a classe inicial do projeto, nesta classe que se inicia a execuo da aplicao, pois esta contm o mtodo principal (main) e ela ser nosso gerenciador de contas. O pacote cliente possui classes que estruturam os objetos Clientes que podero ser pessoa fsica (Fisica.java) ou jurdica (Juridica.java), alm de estruturar como ser o formato do endereo de cada pessoa (Endereco.java). E, por fim, o pacote conta possui a classe Conta.java que armazena as informaes de uma conta. No diagrama, a seguir, mostrado pela Figura 68 possvel ter uma viso geral de cada Classe do projeto.

Figura 68 Diagrama de Classe do projeto de caixa eletrnico


Fonte: o autor

112 PROGRAMAO I (JAVA) | Educao a Distncia

Tendo como base os diagramas da Figura 68, vamos primeiramente entender o Diagrama de Classes em questo, note que antes dos nomes dos atributos e mtodos das classes existe um sinal (-, + ou #), em UML, o sinal de significa que trata-se de um atributo/mtodo que utiliza modificador de acesso private, o sinal + indica o modificador public e o sinal # indica o sinal de modificador protected. Note ainda que as classes Fsica e Jurdica se ligam classe Pessoa com uma seta grande e vazia, e esta ligao significa que Fsica e Jurdica so filhas de Pessoa, ou seja, herdam todas as propriedades da classe Pessoa (o conceito de herana ser abordado na prxima Unidade e l retomaremos este projeto). Agora voc deve estar se perguntando: se houve restrio do acesso a alguns atributos das Classes apresentadas, como ser realizada a alterao das informaes quando forem necessrias?. A resposta relativamente simples, basta criar mtodos pblicos que controlaro os acessos a estas variveis, ou seja, ser criada uma interface de acesso para cada atributo privado (private) da classe em questo, a que entra o conceito de getters e setters na programao Orientada a Objetos e este um mecanismo de acesso a dados encapsulados. Sendo assim, vamos aprender a criar mtodos que alteram os valores dos atributos privados; a estes mtodos damos o nome de setters, ou seja, estes mtodos iro setar os valores dos atributos privados. Para criar um mtodo setter, primeiro faz-se necessrio analisar o tipo do atributo. Vamos pegar, por exemplo, o atributo saldo da classe Conta; por se tratar de um atributo do tipo float (real), o mtodo para setar este atributo dever receber como parmetro um elemento tambm float. Como um mtodo que no ter retorno, ento, utiliza-se o tipo de retorno como void. Alm disso, o padro para mtodos setters sempre utilizar a palavra set e, em seguida, concatenar com o nome da varivel, no caso em tela, teramos o mtodo de nome setSaldo, que ter sua implementao da seguinte forma:

PROGRAMAO I (JAVA) | Educao a Distncia

113

//metodo setSaldo setter para o atributo saldo public void setSaldo(float s){ this.saldo = s; } //metodo setNumConta setter para o atributo numConta public void setNumConta(int n){ this.numConta = n; }

Alm do mtodo de alterar o valor do atributo, precisamos utilizar o mtodo para resgatar o valor deste atributo, a estes mtodos chamamos de getters e a caracterstica deste tipo de mtodo que ele retorna o valor do atributo para o elemento que o chama. Os mtodos get so precedidos pela palavra get e o nome do atributo, e eles devem retornar elementos do mesmo tipo de atributo em questo. Utilizando o mesmo exemplo do atributo Saldo e o atributo numConta, teremos os mtodos getters abaixo:
//metodo getSaldo getter para o atributo saldo public float getSaldo(){ return this.saldo; } //metodo getNumConta getter para o atributo numConta public int getNumConta(int n){ return this.numConta; }

Como exemplo, a Conta foi reimplementada, e utilizando os mtodos getters e setters de maneira adequada, esta ficar como mostrado no cdigo a seguir. Note que para o atributo saldo a implementao do getter e setter no foi feita, tendo em vista que existem trs operaes bsicas que devem controlar esta varivel em um ambiente de caixa eletrnico, que so as operaes: sacar, transferir e depositar, e sero implementadas posteriormente.

114 PROGRAMAO I (JAVA) | Educao a Distncia

package conta; import cliente.Pessoa; public class Conta { private float saldo; private Pessoa titular; private int numConta; private int tipoConta; public int getNumConta() { return numConta; } public void setNumConta(int numConta) { this.numConta = numConta; } public int getTipoConta() { return tipoConta; } public void setTipoConta(int tipoConta) { this.tipoConta = tipoConta; } public Pessoa getTitular() { return titular; } public void setTitular(Pessoa titular) { this.titular = titular; } }

Dica da ferramenta: no Netbeans possvel a criao automtica dos mtodos getters e setters, para isso, no cdigo-fonte de sua classe, aps a declarao dos atributos, pressione a tecla Alt+Insert e escolha a opo getters e setters... e ento selecione os atributos que deseja gerar os mtodos.

PROGRAMAO I (JAVA) | Educao a Distncia

115

Alm dos modificadores de acesso, o JAVA permite a utilizao de outros modificadores, so eles: static, final e abstract. Cada um deles ser abordado em sees, pois eles tm caractersticas bem diferentes entre si.

O MODIFICADOR StatiC
O modificador static pode ser aplicado a variveis e mtodos, e a principal caracterstica dele que se tratando de atributos, todos os objetos compartilham do mesmo espao de memria, e se tratando de mtodo, este pode ser acessado sem a necessidade de instncia do objeto. Voc provavelmente j criou alguma aplicao em JAVA e se deparou com o mtodo public static void main (String args[]), e deve ter se perguntado: O que significa todas estas palavras antes do nome do mtodo principal?. Ento vamos por partes. O modificador de acesso public indica que este mtodo pode ser visualizado de qualquer classe do projeto, o modificador static indica que para acessar o mtodo da classe no necessrio instanci-lo, e o que acontece que mtodos e variveis static so alocadas em memria antes que qualquer objeto seja criado, por essa razo, um atributo no static da classe que no esteja no mtodo static no pode ser acessado de forma direta, pois ele s existir a partir da instncia do objeto, por exemplo, no cdigo a seguir da classe Exemplo, temos duas variveis valor (int) e valor2(static int), note que do mtodo static, ao tentar atribuir um inteiro varivel valor, o NetBeans acusa um erro com os seguintes dizeres: non-static variable valor cannot be referenced form a static context, traduzindo, isto significa que a varivel no static valor no pode ser referenciada em um contexto static.

116 PROGRAMAO I (JAVA) | Educao a Distncia

Para resolver este erro, temos duas sadas: uma transformar o atributo valor em static, a outra criar um objeto (instncia) do tipo Exemplo e ento acessar e modificar a varivel valor. Veja, a seguir, como ficariam as duas solues.

Uma varivel esttica compartilhada por todas as instncias de uma classe, ou seja, em vez de cada instncia da classe ter uma cpia dessa varivel, ela uma nica varivel compartilhada por todas as instncias. Para a existncia de uma varivel esttica no preciso nem mesmo

PROGRAMAO I (JAVA) | Educao a Distncia

117

a criao de uma instncia da classe que contenha a varivel, necessrio somente que a classe seja carregada na Mquina Virtual Java, j que esta criada e inicializada no momento de carga da classe. Exemplificando, imagine que haja um limite para realizar transferncias entre contas e que este limite seja igual para todas as contas. Para resolver este problema, basta declarar o atributo limiteTransferencia como static, desta forma, o limite alterado para todas as referncias de conta. Veja a Figura 69, a seguir, onde ilustrado a varivel limiteTransferencia como sendo um atributo compartilhado.
Conta c1 Conta c2

saldo = 200,40 titular = Joaquim numConta = 35460 tipoConta = 1

saldo = 400,40 titular = Maria numConta = 35520 tipoConta = 1

Conta.limiteTransferencia = 3000

Figura 69 Ilustrao de varivel static limiteTransferencia


Fonte: o autor

O MODIFICADOR final
Os modificadores final restringem ainda mais o acesso aos elementos de uma classe, para atributos, ele faz com que o atributo no possa ser modificado em tempo de execuo, ou seja, cria-se uma varivel que ter um valor constante do incio ao trmino da execuo da

118 PROGRAMAO I (JAVA) | Educao a Distncia

aplicao. Para Classes, indica que esta no poder ser herdada (no poder ter filhos) e para mtodos, indica que o mesmo no poder ser sobrescrito (usar tcnicas de polimorfimo). Variveis de instncia do tipo final podem ser declaradas em conjunto com o modificador static. Neste caso, se ele for declarado na inicializao da varivel, o valor atribudo a ele ser o mesmo para todos os objetos e no poder ser modificado durante a execuo do projeto, se uma varivel static final no for inicializada, ocorrer um erro de compilao. Podemos ento utilizar o exemplo do limite de transferncia para ilustrar a utilizao do modificador final.
public class Conta{ private final static float LIMITETRANSFERENCIA=3000; }

Dica de programao: quando se declara um atributo do tipo final, usa-se como padro a utilizao do nome do atributo em caixa alta, por se tratar de um atributo constante.

Mtodos final no podem ser sobrescritos, ou seja, um mtodo final em uma superclasse (classe pai) no pode ser reimplementado na subclasse (classe filha). Os mtodos declarados como private so implicitamente final, porque no possvel sobrescrever em uma subclasse. Uma classe final no pode ser superclasse, ou seja, no pode ter classes que herdam suas propriedades. Portanto, quando uma classe final, implicitamente todos os mtodos so final.

PROGRAMAO I (JAVA) | Educao a Distncia

119

O MODIFICADOR aBStraCt
O modificador abstract aplicado somente a mtodos e a classes, mtodos abstratos no fornecem implementaes e em classes abstratas no possvel a criao de objetos da classe, e normalmente possuem um ou mais mtodos abstratos. O objetivo de criao de classes abstratas fornecer uma superclasse apropriada a partir da qual outras classes podem herdar e assim poder compartilhar um design comum. Veja na Figura 70, abaixo, a criao da classe Pessoa como sendo uma classe abstrata baseada no projeto do caixa eletrnico, esta classe possui tambm um mtodo abstrato para cadastro. A declarao do mtodo abstrato fora a programao do mtodo nas subclasses.

Figura 70 Implementao da classe abstrata Pessoa e o mtodo abstrato cadastra A Figura 71, logo a seguir, mostra a tentativa de criao de um objeto de uma classe abstrata, no detalhe a mensagem do IDE de que uma classe abstrata no pode ser instanciada.

120 PROGRAMAO I (JAVA) | Educao a Distncia

Figura 71 Tentativa de criao de um objeto da classe abstrata Pessoa Vamos criar uma subclasse para a classe Pessoa. Note que o mtodo cadastra precisou ser implementado na classe Fsica, veja na Figura 72 esta implementao.

Figura 72 Classe Pessoa, subclasse da classe abstrata Pessoa

PROGRAMAO I (JAVA) | Educao a Distncia

121

CONSTRUTORES JAVA
Um Construtor no um mtodo, pois este no possui a declarao de retorno. Mas lembre-se disso: toda classe em Java tem pelo menos um construtor, exceto interfaces. O que so esses construtores? Um construtor o primeiro mtodo que executado sempre que uma classe instanciada. Quando se utiliza a palavra-chave new, o construtor ser executado e inicializar o objeto. Existem classes que quando inicializadas requerem algum tipo de parmetro, por exemplo, objetos do tipo Scanner (para realizar leitura de informaes para o projeto), que voc pode conferir no cdigo a seguir.
Scanner tec = new Scanner (System.in);

Quando fazemos isto, estamos inicializando a classe com os dados parmetros. O construtor inicializa as variveis de instncia da classe, como tambm executa cdigos necessrios para a inicializao de uma classe. Em outras palavras, no Construtor voc pode determinar o que ser realizado assim que seu objeto for instanciado. Vamos utilizar o exemplo da Classe Pessoa e criar um construtor para ela:
public abstract class Pessoa { protected String telefone; protected String nomePessoa; protected Endereco e = new Endereco(); public Pessoa(){ super(); System.out.println(Executando o construtor de Pessoa); } ...//outros mtodos da classe }

Note que o construtor similar a um mtodo, mas ele no tem um tipo de retorno, nem void. Outro fato importante, um Construtor sempre ter o mesmo nome da classe. Modificadores de acesso podem ser atribudos aos construtores, inclusive o private. Se o Construtor no for

122 PROGRAMAO I (JAVA) | Educao a Distncia

criado junto ao cdigo-fonte da classe, o compilador criar automaticamente um construtor para sua Classe. Quando uma classe instanciada, o mtodo super() dela chamado, mesmo que no seja declarado, pois em algum momento a classe ter que ser inicializada. Lembre-se que todas as classes em Java so filhas da classe Object, ou seja, Object a me de todas as classes (ela fornece mtodos como equals e toString por exemplo). Ainda no nosso exemplo apresentado na Figura 67, onde objetos do tipo Fsica so filhos da classe Pessoa, quando criamos uma instncia de Fsica os construtores so executados em forma de pilha: Fsica chama Pessoa, que chama Object. Ou seja, o construtor de Fsica s ser executado por ltimo. Analise os cdigos a seguir, e logo aps a sada do compilador na Figura 73.
public class Fisica extends Pessoa{ private String cpf; public Fisica(){ System.out.println(Pessoa Fisica); } }

public class CaixaEletronico { public static void main(String[] args) { Fisica f = new Fisica(); } }

Figura 73 Sada do Compilador quando se instancia a classe Fsica Note que ao realizar a instncia da classe Fsica, o construtor da classe Pessoa tambm foi acionado.

PROGRAMAO I (JAVA) | Educao a Distncia

123

Uma classe pode possuir mais de um construtor. Voc deve estar se perguntando: mas como isso possvel? Para isso, preciso criar construtores com argumentos diferentes, desta forma, criam-se diversas formas de inicializar um objeto. Como exemplo, vamos utilizar a classe Fsica, passando como parmetro no momento da inicializao da classe o nome do titular da conta. Analise os cdigos a seguir, e depois a sada do compilador na Figura 74.
public class Fisica extends Pessoa{ private String cpf; public Fisica(){ System.out.println(Pessoa Fisica); } public Fisica(String nome){ nomePessoa = nome; } }

public class CaixaEletronico { public static void main(String[] args) { Fisica f = new Fisica(); Fisica f2 = new Fisica(Joaquim); System.out.println(f2.getNomePessoa()); } }

Figura 74 Sada do console

124 PROGRAMAO I (JAVA) | Educao a Distncia

No h limite para a criao de construtores, voc pode criar em uma classe quantos construtores quiser, porm, o que deve diferenciar os construtores so os parmetros, por exemplo, se um construtor requer uma nica String, ento no se pode criar outro construtor solicitando uma String, por mais que sejam variveis diferentes, porm, se for um construtor solicitando uma String e outro solicitando duas Strings, possvel, ou seja, o tipo do parmetro e o nmero de parmetros sero os determinantes para que o compilador saiba qual construtor deva ser chamado. Um ponto importante que enquanto o construtor no for executado, nenhum acesso varivel de instncia ou mtodo ser possvel, isto quer dizer que um objeto no pode ser utilizado at ser inicializado, o que obvio, mas tambm significa que voc no pode tentar sabotar o construtor do objeto antes de chamar super(), como pode ser visto no cdigo a seguir:
public class Fisica extends Pessoa{ private String cpf; public Fisica(){ System.out.println(Pessoa Fisica); } public Fisica(String nome){ nomePessoa = nome; super(); } }

A chamada de super() no construtor da Classe Fsica retorna um erro de compilao, onde ser mostrado ao programador uma mensagem de que a chamada ao construtor de super() deve ser a primeira sentena no construtor.

PROGRAMAO I (JAVA) | Educao a Distncia

125

CONSIDERAES FINAIS
Nesta Unidade voc aprendeu sobre encapsulamento e como os modificadores de acesso auxiliam na tarefa de encapsular seus projetos. Tambm aprendeu a manipular modificadores privados por meio dos mtodos pblicos getters e setters. Alm dos modificadores de acesso, voc aprendeu a utilizar o modificador final para criar constantes, mtodos que no podem ser sobrescritos e classes que no podem ter filhos. Tambm viu o modo de funcionamento do modificador static, que compartilha o mesmo espao de memria para atributos deste tipo e como os mtodos estticos so alocados em memria antes da instncia da classe e podem ser chamados utilizando somente o nome da classe e o nome do mtodo. No menos importante, voc tambm aprendeu sobre o modificador abstract, que faz com que a classe no possa ser instanciada e os mtodos abstratos apenas indicam o que deve ser implementado nas classes filhas. E, por fim, viu tambm como funcionam os Construtores em JAVA, assim como a forma de inicializar seus objetos utilizando estes construtores. Na prxima Unidade, voc ver os conceitos que envolvem Herana, que so caractersticas dos projetos Orientados a Objetos.

Modifi cadores Java Por <javafreee.org> Como em todas as linguagens de programao, a acessibilidade a uma classe/mtodo deve seguir algumas regras, e de extrema necessidade que voc as saiba para no vacilar na hora do exame! Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://javafree.uol.com.br/artigo/6941/Cap-2-Modifi cadores.html>.

126 PROGRAMAO I (JAVA) | Educao a Distncia

Modifi cadores de acesso Disponvel em: <http://www.youtube.com/watch?v=OEGThN7PmsA>. Encapsulamento Disponvel em: <http://www.youtube.com/watch?v=2SHpfjfxeQ8>. Constantes e o Modifi cador fi nal Disponvel em: <http://www.youtube.com/watch?v=65mDDzCsDaU>.

Modifi cadores so fundamentais para a criao de frameworks e componentes caixa-preta e caixa-branca!

ATIVIDADES DE AUTOESTUDO
1. Crie o projeto com as classes ilustradas na Figura 68 separando os pacotes, assim como criando todos os mtodos pblicos para acesso aos atributos private e protected. 2. Considerando que a Classe Jurdico filha da classe Pessoa (Jurdico herda Pessoa), possvel acessar o atributo protected nomePessoa de forma direta? Por qu? Se o atributo fosse do tipo private, seria possvel o acesso de forma direta? 3. Crie 3 atributos na classe Conta: limiteTransferencia, limiteSaque e taxaJuros, sendo que o limite de transferncia de R$ 3.000,00, o limite de saque de R$ 1.000,00 e o limite de transferncia de R$ 2.500,00, e atribua os modificadores de modo que estes atributos possam ser acessados e compartilhados por todas as instncias de conta, assim como no permita a mudana destes atributos em tempo de execuo.

PROGRAMAO I (JAVA) | Educao a Distncia

127

4. Dadas as classes Pessoa, PFisica e Vendedor logo abaixo:


class Pessoa { Pessoa(){ System.out.println("Pessoa Construct"); } }

class PFisica extends Pessoa{ PFisica() { System.out.println("Pessoa Fisica"); } }

public class Vendedor extends PFisica{ Vendedor() { System.out.println(Vendedor); } public static void main(String[] args) { Vendedor v = new Vendedor(); } }

Responda: como ser a sada do console quando este projeto for executado?

128 PROGRAMAO I (JAVA) | Educao a Distncia

UNIDADE V

HERANA E POLIMORFISMO EM JAVA


Professor Dr. Edson A. Oliveira Junior Objetivos de Aprendizagem Entender o conceito de herana. Entender o conceito de Polimorfismo. Plano de Estudo A seguir, apresentam-se os tpicos que voc estudar nesta unidade: O que herana Como implementar herana O que polimorfismo A sobrescrita de mtodos

INTRODUO
Ol, seja bem-vindo(a) ao mdulo de Herana e Polimorfismo em Java. Nesta Unidade, trataremos de um tema essencial para a Orientao de Objetos, pois por meio de herana podemos otimizar a reutilizao de cdigos, uma vez que classes com caractersticas semelhantes podem ser implementadas de forma agrupada por meio de superclasses e subclasses (classes filhas). Utilizando o polimorfismo, possvel criar mtodos de nomes iguais, porm de comportamentos distintos de acordo com a origem do objeto. Para mostrar a voc como utilizar estes recursos, sero utilizados alguns exemplos que utilizam estas tcnicas de Herana e Polimorfismo, sendo um exemplo discutido durante a apresentao do tema e outro mostrando um projeto completo desenvolvido com tcnicas de Herana e Polimorfismo.

HERANA
Vamos comear nossa Unidade mostrando uma perspectiva do mundo real. Imagine um peixe, como na Figura 75 a seguir. Qualquer espcie animal possui caractersticas prprias que definem com preciso em qual espcie o animal se enquadra. Vamos pegar como exemplo os peixes, eles possuem brnquias (para respirar), barbatana/nadadeira para se locomover e boca para se alimentar. De uma maneira geral, todos os peixes possuem estas caractersticas, agora, se formos aprofundar um pouco mais no mundo dos peixes e analisarmos as caractersticas de cada espcie, por exemplo: tipo de escama, tamanho, colorao, nmero de dentes, se de gua doce ou salgada, entre outras caractersticas, teremos uma infinidade de espcies que se diferem, como o peixe-palhao que possui caractersticas especficas a raa dele, por exemplo, o tamanho reduzido, a colorao alaranjada e as manchas brancas e pretas distribudas em seu corpo.

PROGRAMAO I (JAVA) | Educao a Distncia

131

Um filhote de peixe-palhao possui as mesmas caractersticas de seus pais, avs, bisavs e outras geraes, ou seja, ele herda todas as caractersticas da raa, alm disso, ele possui todas as caractersticas comuns a qualquer peixe.

Figura 75 Peixe-palhao Mantendo o raciocnio dos peixes, podemos dizer que um peixe-palhao uma raa da espcie peixe, se fssemos transformar este conceito na programao Orientada a Objetos, basta transformar o peixe-palhao em uma classe de nome PeixePalhaco, e esta herdaria as caractersticas dos Peixes, representada pela classe Peixe. Desta forma, podemos afirmar que o PeixePalhaco uma subclasse da superclasse Peixe. Em outras palavras, objetos do tipo PeixePalhaco tero todas as caractersticas de objetos do tipo Peixe, porm tero algumas especificidades que os diferem de outros tipos de peixe. Veja na Figura 76, logo a seguir, o esquema de herana que ilustra o caso em tela.

132 PROGRAMAO I (JAVA) | Educao a Distncia

Fonte: SHUTTERSTOCK.COM

Figura 76 Superclasse Peixe e respectivas subclasses


Fonte: o autor

Todas as raas de peixes ilustradas na Figura 76 herdam todos os atributos e mtodos da classe Peixe, ou seja, herdam suas caractersticas, e esse o papel da Herana na Orientao a Objetos. De maneira geral, a herana permite a criao de novas classes (subclasses) a partir de classes j existentes (superclasses), herdando caractersticas existentes na classe a ser estendida. Esta tcnica implica em grande reaproveitamento de cdigo existente, uma vez que no h a necessidade de reimplementao de mtodos que j foram criados nas superclasses. Em relao a Superclasses e Subclasses, podemos dizer que Subclasses so especializaes de Superclasses que, por sua vez, so generalizaes de Subclasses. Em outras palavras, subclasses so mais especializadas do que as suas superclasses, mais genricas. As subclasses herdam todas as caractersticas de suas superclasses, como suas variveis e mtodos. A linguagem Java permite o uso de herana simples, mas no permite a implementao de herana mltipla, que significa que uma classe pode herdar mtodos e atributos de mais de uma classe. Para superar essa limitao, o Java faz uso de interfaces, o qual ser descrito mais adiante ainda nesta Unidade.

PROGRAMAO I (JAVA) | Educao a Distncia

133

Em Java, a palavra reservada que define que uma classe herda as caractersticas de outra extends, ela deve ser utilizada assim que a classe for criada. Veja nos cdigos a seguir um exemplo de cdigo que mostra onde deve ser empregada a palavra extends.
public class Peixe { //atributos private String tipoPele; private int numDentes; //metodos public void nadar(){ System.out.println(Mecher as barbatanas); } public void comer(){ System.out.println(Procurar comida e comer); } }

public class PeixePalhaco extends Peixe{ //implementao da classe peixe palhaco private int numeroListras; }

Da forma como foram implementados esses cdigos, a classe PeixePalhaco herda todos os atributos e mtodos da classe Peixe, mas com a diferena de possuir um atributo a mais, numeroListras, que uma especificidade do peixe-palhao em relao a outros tipos de peixe. Ainda utilizando dois ltimos cdigos, vamos criar agora uma classe principal que cria uma instncia de peixe-palhao e chama um de seus mtodos.
public class Principal public static void main(String args[]){ PeixePalhaco pp = new PeixePalhaco(); pp.nadar(); PP.comer(); } }

134 PROGRAMAO I (JAVA) | Educao a Distncia

O cdigo, a seguir, produzir no compilador uma sada como segue:


Mexer barbatanas Procurar comida e comer

Note que os mtodos nadar e comer no foram implementados na classe PeixePalhaco, somente na classe Peixe, como PeixePalhaco uma Subclasse de Peixe, ento os mtodos da classe Peixe sero herdados automaticamente a objetos do tipo PeixePalhaco. Agora que voc j entendeu o conceito base para herana, vamos retomar o projeto do Caixa Eletrnico que iniciamos a desenvolver na Unidade anterior. Analise a Figura 77 logo abaixo, que ilustra o projeto como um todo a partir de um diagrama de classes:

Figura 77 Projeto de Caixa Eletrnico


Fonte: o autor

Tendo como base o problema de que em um banco existem dois tipos de pessoas, sendo elas: Pessoa Fsica e Pessoa Jurdica, podemos projetar nossos objetos como a classe Pessoa sendo a superclasse e as classes Fsica e Jurdica como sendo subclasses. Alm disso, podemos criar a classe Pessoa como sendo abstrata, j que Pessoa no se refere a ningum especificamente, s de forma genrica. Sendo assim, teremos os seguintes cdigos para cada classe:

PROGRAMAO I (JAVA) | Educao a Distncia

135

136 PROGRAMAO I (JAVA) | Educao a Distncia

Note que no momento de declarao das classes Fsica e Jurdica existe a palavra reservada extends, e esta palavra que indica se uma classe ou no subclasse de outra. Neste momento, todos os atributos e mtodos implementados na classe Pessoa vo automaticamente fazer parte das classes Filhas. Lembrando um pouco sobre a teoria dos modificadores, temos que os atributos da classe Pessoa esto indicados com o modificador de acesso protected, e isso significa que as classes filhas de Pessoa tero acesso a estes atributos de forma direta. Volte no cdigo da classe Pessoa e confira quais so os atributos e mtodos dessa classe, feito isso, voc j sabe quais so os atributos que a classe Fsica possui: telefone, nomePessoa, endereo e CPF. Assim como os atributos da classe Jurdica: telefone, nomePessoa, endereo e CNPJ. Alm dos atributos, as classes tambm possuem os mtodos implementados na classe Pessoa, o cdigo a seguir mostra quais so os mtodos e atributos visveis de dentro da classe Fsica. Agora preste ateno ao cdigo a seguir, quando precisamos chamar algum mtodo que faz parte da superclasse Pessoa. Note que necessrio utilizar a palavra reservada super,

PROGRAMAO I (JAVA) | Educao a Distncia

137

que nos d acesso aos mtodos e atributos da classe pai. Alm disso, quando criarmos uma instncia de Fsica, podemos tambm ter acesso a todos os mtodos da classe Pessoa, como pode ser visto no cdigo a seguir (note que os mtodos getters e setters da classe Pessoa tem visibilidade por meio da classe Fsica, que tambm uma classe Pessoa).

138 PROGRAMAO I (JAVA) | Educao a Distncia

O mecanismo de herana nos fornece um benefcio notvel no desenvolvimento de aplicaes. Ao concentrarmos caractersticas comuns em uma classe e derivar as classes mais especficas a partir desta, ns estamos preparados para a adio de novas funcionalidades ao sistema. Se mais adiante uma nova propriedade comum tiver que ser adicionada, no precisaremos efetuar alteraes em todas as classes. Basta alterar a superclasse e todas as outras classes derivadas sero automaticamente atualizadas.

POLIMORFISMO
Polimorfismo significa vrias (poli) formas (morfo). Em Orientao a Objetos, polimorfismo a capacidade pela qual duas ou mais classes derivadas de uma mesma superclasse podem invocar mtodos que tm a mesma identificao, assinatura (o mesmo nome de mtodo), mas que possuem comportamentos distintos (de acordo com a forma de implementao em cada subclasse). Em Java, o conceito de Polimorfismo se manifesta apenas nas chamadas dos mtodos. A possibilidade de Polimorfismo se d pelo fato de que mtodos podem ser sobrescritos pelas subclasses (mtodos com o mesmo nome e nmeros de argumentos), ou seja, se o mtodo da superclasse no suficiente ou no se aplica classe filha, ele pode ser escrito novamente tendo um comportamento completamente diferente do da superclasse. O interpretador JAVA se encarrega de chamar corretamente o mtodo a ser executado em tempo de execuo. Existe ainda um mecanismo de sobrecarga, onde dois mtodos de uma classe podem ter o mesmo nome, porm com assinaturas diferentes (tipos de retorno ou tipos de argumentos diferentes), entretanto, esta sobrecarga no recebe o nome de polimorfismo. Como dito anteriormente, tal situao no gera conflito, pois o compilador capaz de detectar qual mtodo deve ser escolhido a partir da anlise dos tipos dos argumentos do mtodo. Nesse caso, diz-se que ocorre a ligao prematura para o mtodo correto. Em Java, todas as determinaes de mtodos a executar ocorrem por meio da ligao tardia (ocorrncia em tempo de execuo) exceto em dois casos: mtodos final, que no podem ser redefinidos, e

PROGRAMAO I (JAVA) | Educao a Distncia

139

mtodos private, que tambm no podem ser redefinidos e, portanto, possuem as mesmas caractersticas de mtodos final. Para que seja implementado o polimorfismo de maneira correta, necessrio que os mtodos tenham exatamente a mesma identificao, sendo utilizado o mecanismo de redefinio de mtodos, que o mesmo que sobrescrita (Override) de mtodos em classes derivadas. A redefinio ocorre quando um mtodo cuja assinatura j tenha sido especificada recebe uma nova definio, ou seja, um novo corpo em uma classe derivada. importante observar que, quando o polimorfismo est sendo utilizado, o comportamento que ser adotado por um mtodo s ser definido durante a execuo. Embora em geral esse seja um mecanismo que facilite o desenvolvimento e a compreenso do cdigo orientado a objetos, h algumas situaes onde o resultado da execuo pode ser no intuitivo. Para ilustrar todo este processo, vamos verificar o mtodo cadastra, que est presente nas trs classes do nosso exemplo (Pessoa, Fsica e Jurdica) e acrescentar a implementao do mtodo imprime nestas classes. O cdigo, a seguir, indica a classe abstrata Pessoa, que possui atributos protegidos (podem ser visualizados por seus herdeiros) e mtodos de cadastra() e imprime() implementados.

140 PROGRAMAO I (JAVA) | Educao a Distncia

No cdigo a seguir, temos a implementao da subclasse Fsica, que conta com a implementao do mtodo cadastra() e imprime(). Note que antes da assinatura dos mtodos, existe uma anotao indicando que o mtodo est sobrescrevendo outro. Caso haja necessidade de utilizao do mtodo da superclasse, necessrio invoc-lo como acontece na linha super. cadastra(). Desta forma, o mtodo da classe Pai tambm ser executado.

A implementao da classe Jurdica anloga implementao da classe Fsica, o que difere so as mensagens que sero apresentadas ao usurio do aplicativo, e o atributo CNPJ existente somente na classe Jurdica. O cdigo, a seguir, mostra a implementao da classe Jurdica.

PROGRAMAO I (JAVA) | Educao a Distncia

141

Implementadas as classes filhas e os mtodos sobrescritos, criou-se um mtodo principal para manipular os objetos do tipo Pessoa, dando a opo para que o usurio do aplicativo selecione qual o tipo de Pessoa que se deseja cadastrar. Caso escolha a opo 1, ser criado um objeto do tipo Fsica dentro do vetor de Pessoas, caso a opo escolhida seja o item 2, um objeto do tipo Jurdica ser criado. Caso o usurio queira imprimir os elementos cadastrados at ento, ele pode optar pela opo de nmero 3. Veja esta implementao no cdigo a seguir. Note que o mtodo cadastra chamado apenas uma vez, isto possvel, pois como as subclasses sobrescrevem um mtodo da superclasse, este mtodo pode ter comportamentos diferentes de acordo com o objeto de origem, e isto o polimorfismo!

Outro exemplo de aplicao do polimorfismo ainda no exemplo em questo com o mtodo de impresso, como todas as classes filhas tambm sobrescrevem o mtodo imprime da Superclasse, ele pode ser chamado, que se comportar de acordo com o objeto de origem. Mas e se o no houver sobrescrita do mtodo? Como o compilador se comporta? Nestes

142 PROGRAMAO I (JAVA) | Educao a Distncia

casos, o compilador invoca o mtodo da classe Pai e executa-o. Veja no cdigo, a seguir, a implementao do mtodo de impresso. Note que no necessrio verificar que tipo de Pessoa precisa ser impressa, em tempo de execuo isto resolvido.

Estudo de Caso Animais A seguir, ser mostrado um projeto que implementa Herana e Polimorfismo, e desta forma ilustrar os conceitos aprendidos at aqui. Os animais do zoolgico da cidade de So Paulo precisam ser catalogados pela idade e nome e o zoolgico precisa que, alm disso, fossem catalogadas as formas de se locomover do animal, assim como o som que eles emitem, pois a ideia do zoolgico transformar este software em algo que possa mostrar para os visitantes algumas curiosidades sobre os animais que ali vivem. Para isso, a administrao do zoolgico chamou Oswaldo, um programador JAVA para desenvolver um software que auxiliasse nesta catalogao. Oswaldo ento comeou a fazer a anlise dos requisitos e percebeu que tratava-se de um caso em que a utilizao de tcnicas de polimorfismo e herana eram imprescindveis para que o projeto pudesse ser expandido mais tarde, alm de auxiliar no processo de manuteno. Desta forma, Oswaldo criou uma classe abstrata chamada Animal, e nela colocou as informaes principais solicitadas pelo zoolgico para a catalogao. Ento ele criou as classes Cachorro, Cavalo e Preguia, que herdam as propriedades de Animal e implementam os mtodos abstratos. A seguir, sero apresentados os mtodos desenvolvidos por Oswaldo para resolver esta necessidade do zoolgico. No cdigo a seguir, a classe Animal foi criada como uma classe abstrata, pois Animal uma abordagem geral e precisa ser especificada, esta classe possui dois atributos, nome

PROGRAMAO I (JAVA) | Educao a Distncia

143

e idade do animal, alm dos mtodos abstratos seLocomove() e emiteSom(), que devero, obrigatoriamente, serem implementados nas classes que herdarem a classe Animal.
package animal; abstract public class Animal { private String nome; private int idade; abstract public void seLocomove(); abstract public void emiteSom(); public int getIdade() { return idade; } public void setIdade(int idade) { this.idade = idade; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } }

A Classe Cachorro herda todos os atributos e mtodos da classe Animal, e obrigada a implementar os mtodos seLocomove() e emiteSom(). Note ainda que a classe cachorro possui um Construtor que recebe como parmetro o nome e a idade do Animal. O cdigo, a seguir, ilustra a criao desta classe.
package animal; public class Cachorro extends Animal{ public Cachorro(String nome, int id ){ super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Cachorro: +super.getNome()); System.out.println(Idade: +super.getIdade()); System.out.println(Cachorro correndo, com suas 4 patas); } // @Override public void emiteSom() { System.out.println(Au Au !); } }

144 PROGRAMAO I (JAVA) | Educao a Distncia

A Classe Cavalo, assim como a Classe Cachorro, herda todos os atributos e mtodos da classe Animal e obrigada a implementar os mtodos seLocomove() e emiteSom(), porm, a implementao difere da classe Cachorro, o que resulta em um comportamento diferente, isto o polimorfismo dos mtodos seLocomove() e emiteSom();.
package animal; public class Cavalo extends Animal { public Cavalo(String nome, int id ){ super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Cavalo: +super.getNome()); System.out.println(Idade: +super.getIdade()); System.out.println(Cavalga, Marcha, Trota); } // @Override public void emiteSom() { System.out.println(Nhiiiiiiiiiiii ri ri rin !); } }

No cdigo, a seguir, temos a implementao da classe Preguia, seguindo os padres de implementao dos outros animais.
package animal; public class Preguica extends Animal{ public Preguica(String nome, int id ){ super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Preguia: +super.getNome()); System.out.println(Idade: +super.getIdade()); System.out.println(Subindo na rvore); } @Override public void emiteSom() { System.out.println(GRRRRRRRrrrrrr); } }

PROGRAMAO I (JAVA) | Educao a Distncia

145

A seguir, temos a implementao da classe principal que cria e manipula o vetor de animais. Note que no cdigo de criao do vetor, criam-se ponteiros para cada Animal, mas ainda no se sabe qual animal ser colocado em cada posio. Quem vai determinar o tipo do animal o usurio, de acordo com a ordem de insero por meio do mtodo cadastraAnimal(). Este mtodo questiona ao usurio qual o tipo de animal ser armazenado, sendo que o mtodo fica encarregado de criar o objeto do animal desejado. Depois de cadastrado, possvel verificar que animal ocupa cada posio do vetor por meio do mtodo imprimeAnimais(). Veja que cada objeto sabe exatamente como deve ser seu comportamento ao chamar os mtodos de seLocomove() e emiteSom().
import java.util.Scanner; public class AnimalPrincipal { Animal vetAni[] = new Animal[30]; static int tam=0; public static void main(String[] args) { // TODO code application logic here int opcao=0; Scanner scan = new Scanner(System.in); AnimalPrincipal ap = new AnimalPrincipal(); while(opcao!=3){ System.out.println("Digite a opcao desejada:"); System.out.println("1 - Cadastrar"); System.out.println("2 - Listar"); System.out.println("3 - Sair"); opcao = scan.nextInt(); scan.nextLine(); switch(opcao){ case 1: ap.cadastraAnimal(); break; case 2: ap.imprimeAnimais(); break; case 3: System.out.println("Saindo..."); break; default:System.out.println("Opo invlida"); break; } } } public void cadastraAnimal(){ Scanner scan = new Scanner(System.in); System.out.println("Digite o tipo de animal:"); System.out.println("1 - Cachorro"); System.out.println("2 - Cavalo"); System.out.println("3 - Preguica");

146 PROGRAMAO I (JAVA) | Educao a Distncia

int i = scan.nextInt(); scan.nextLine(); if (i==1 || i==3 || i==2){ System.out.println("Digite o nome do animal"); String n = scan.nextLine(); System.out.println("Digite a idade do animal"); int id = scan.nextInt(); scan.nextLine(); if (i==1) vetAni[tam]= new Cachorro(n,id); else if(i==2) vetAni[tam]= new Cavalo(n,id); else if(i==3) vetAni[tam]= new Preguica(n,id); tam++; }} public void imprimeAnimais(){ Scanner scan = new Scanner(System.in); for (int i=0;i<tam;i++){ System.out.println("Codigo do Animal: "+i); vetAni[i].seLocomove(); } System.out.println("Digite o codigo do animal que deseja ver"); int cod = scan.nextInt(); vetAni[cod].seLocomove(); vetAni[cod].emiteSom(); } }

Execute o projeto Animal e teste voc mesmo as funcionalidades das tcnicas de Herana e Polimorfismo aqui apresentadas.

PROGRAMAO I (JAVA) | Educao a Distncia

147

CONSIDERAES FINAIS
Nesta Unidade, voc estudou conceitos muito importantes para a criao de projetos Orientados a Objetos. Herana e Polimorfismos ajudam e muito no desenvolvimento de aplicaes que so transformadas do mundo real para o mundo computacional, e estes mecanismos possibilitam maior flexibilidade do projeto, aumentando assim a reutilizao de cdigos. Por meio de Herana, voc viu que possvel herdar mtodos e atributos de classes pai, e que o Java consegue identificar qual o tipo de objeto que est sendo trabalhado. Com o Polimorfismo, voc pde perceber a capacidade de sobrescrita do mtodo, alm de entender como um mtodo implementado em uma superclasse e sobrescrito nas subclasses pode agilizar o desenvolvimento, uma vez que no se faz necessria a criao de mecanismos de identificao e desvios para chamar o mtodo correto. Voc tambm viu os conceitos de Interfaces, que nada mais so do que um contrato entre a Interface a classe que se compromete a implementar todos os mtodos abstratos identificados na interface, alm disso, voc tambm pde ver como o JAVA pode simular a herana mltipla utilizando interfaces.

Entendendo e aplicando herana em Java Por Hudson Geovane A herana um princpio da POO que permite a criao de novas classes a partir de outras previamente criadas. Essas novas classes so chamadas de subclasses, ou classes derivadas; e as classes j existentes, que deram origem s subclasses, so chamadas de superclasses, ou classes base. Deste modo, possvel criar uma hierarquia dessas classes, tornando, assim, classes mais amplas e classes mais especfi cas. Uma subclasse herda mtodos e atributos de sua superclasse; apesar disso, pode escrev-los novamente para uma forma mais especfi ca de representar o comportamento do mtodo herdado. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.devmedia.com.br/entendendo-e-aplicando-heranca-em-java/24544>. Acesso em: 15 maio 2013.

148 PROGRAMAO I (JAVA) | Educao a Distncia

Herana em Java Disponvel em: <http://www.youtube.com/watch?v=I9cGMw4QORQ>.

O uso de polimorfi smo em Java Por Higor Medeiros Veja neste artigo os conceitos, utilizao, implementao e a importncia do polimorfi smo. Tambm veremos onde o polimorfi smo utilizado e de que forma ele pode ajudar para termos projetos melhores. Saiba mais sobre o assunto no artigo completo. Disponvel em: <http://www.devmedia.com.br/uso-de-polimorfi smo-em-java/26140>.

Polimorfi smo com classes abstratas Disponvel em: <http://www.youtube.com/watch?v=FH0a-L4OQB4>.

PROGRAMAO I (JAVA) | Educao a Distncia

149

Toda aplicao Java deve envolver a organizao de suas classes de dados de forma polimrfi ca!

ATIVIDADE DE AUTOESTUDO
1. No projeto de animais, crie as classes Gato, Galinha e Avestruz, e crie os mtodos necessrios para cada Animal.

150 PROGRAMAO I (JAVA) | Educao a Distncia

CONCLUSO
Neste livro, busquei mostrar a voc uma introduo programao com a linguagem Java. A fim de possibilitar o seu entendimento, a Unidade I apresentou o histrico da linguagem Java, o processo de compilao e execuo e a mquina virtual Java. Na Unidade II, trabalhamos estruturas bsicas da linguagem Java, por exemplo, tipos primitivos, declaraes e inicializaes de variveis e estruturas importantes ao fluxo de controle e de dados de um programa Java. Voc est lembrado de quais so estas estruturas? As estruturas so: de controle, de repetio e de seleo. A Unidade III foi dedicada exclusivamente ao entendimento da diferena entre classes e objetos Java e como uma classe composta. Mostrei os principais elementos de uma classe: atributos, mtodos e construtores, bem como o conceito de JavaBeans e POJO (Plain Old Java Object). Na Unidade IV apresentei os principais modificadores de acesso da linguagem Java, sendo eles: private, public, protected e default. Apresentei tambm os conceitos essenciais sobre encapsulamento, que foram complementados com atividades de autoestudo. E, para finalizar, vimos na Unidade V o conceito de herana, sendo um dos conceitos mais importantes em programao orientada a objetos. Alm disso, mostrei como acessar os membros de uma classe (atributos e mtodos) por meio de herana e instanciao de objetos. Espero ter alcanado o objetivo inicial deste livro, que era apresentar uma introduo programao em Java. Desejo que voc seja muito feliz profissionalmente utilizando os conceitos apresentados aqui, e se puder ajudar de alguma forma, estou a sua disposio.
Prof. Dr. Edson A. Oliveira Junior

PROGRAMAO I (JAVA) | Educao a Distncia

151

GABARITO DAS ATIVIDADES DE AUTOESTUDO


UNIDADE I 1. Porque uma vez escritos e compilados em bytecodes, s necessria uma mquina virtual Java para um sistema operacional especfico, ficando o programa independente de plataforma. 2. As principais caractersticas esto relacionadas sintaxe da linguagem, com as seguintes melhorias: for enhanced, generics e autoboxing. 3. JCP a Java Community Process. Para submeter uma mudana, uma pessoa deve propor uma JSR (Java Specification Release) e enviar JCP. 4. Java SE para o desenvolvimento de sistemas desktop e distribudos; Java EE para aplicaes corporativas Web e de componentes de negcio; Java ME para o desenvolvimento de aplicaes para dispositivos mveis. 5. Bytecode o cdigo gerado pelo compilador Java. Ele interpretado por meio das instrues presentes na mquina virtual Java. 6. Aps escrito o cdigo .java, ele compilado por meio do compilador Java gerando o bytecode. O bytecode ento carregado e interpretado pela mquina virtual Java que executa suas instrues. 7. O classpath indica o local exato onde esto disponveis todas as classes necessrias para que um programa seja compilado e executado.

152 PROGRAMAO I (JAVA) | Educao a Distncia

UNIDADE II 1. a) 2147483647 b) -2147483648 c) -2147483645 d) 2147483647 e) -2 f) -4 2. a) No existe then em Java. b) if exige o uso de parnteses na expresso. c) Nada errado. d) Falta um ; antes do else.

3. a) int idade = 10; if(idade > 0 && idade <= 12) { System.out.println(criana...); } else if(idade > 12 && idade <= 17) { System.out.println(adolescente); } else if(idade >= 18 && idade <= 65) {
PROGRAMAO I (JAVA) | Educao a Distncia

153

System.out.println(adulto); } else if(idade > 66) { System.out.println(idoso); } b) int mes = 5; int dias = 0;

switch(mes) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: dias = 31; break; case 4: case 6: case 9:

154 PROGRAMAO I (JAVA) | Educao a Distncia

case 11: dias = 30; break; case 2: dias = 28; break; default: dias = 0; } c) for(int i = 0; i < 100; i++) { System.out.println(i: + i); } d) int z = 10; while(z < 5) { System.out.println(z: + z); z--; }

PROGRAMAO I (JAVA) | Educao a Distncia

155

UNIDADE III 1.
// classe Conta public class Conta { double saldo; Conta() { saldo = 0.0; } public void depositar(double quantia) { saldo = saldo + quantia; } public void sacar(double quantia) { if(saldo >= quantia) { saldo = saldo - quantia; } } } //conta poupana public class Inicio { public static void main(String[] args) { Conta contaCorrente = new Conta(); Conta poupanca = new Conta(); contaCorrente.depositar(1000.00); contaCorrente.sacar(500.00); System.out.println(Saldo da conta corrente: + contaCorrente.saldo); poupanca.depositar(2500.00); System.out.println(Saldo da poupanca: + poupanca.saldo); poupanca.sacar(3000.00); System.out.println(Saldo da poupanca: + poupanca.saldo); } }

156 PROGRAMAO I (JAVA) | Educao a Distncia

UNIDADE IV 1.
package localizacao; public class Endereco { private String rua; private int numero; private String cidade; private String uf; public public public public public public public public public } Endereco() { super(); } String getCidade() { return cidade; } void setCidade(String cidade) { this.cidade = cidade; } int getNumero() { return numero; } void setNumero(int numero) { this.numero = numero; } String getRua() { return rua; } void setRua(String rua) { this.rua = rua; } String getUf() { return uf;} void setUf(String uf) { this.uf = uf; }

package pessoal; import localizacao.Endereco; public class Pessoa { protected String nomePessoa; protected Endereco endereco; protected String telefone; public public public public Pessoa() { super();} Endereco getEndereco() { return endereco; } void setEndereco(Endereco endereco) { this.endereco = endereco;} String getNomePessoa() { return nomePessoa; }

public void setNomePessoa(String nomePessoa) { this.nomePessoa = nomePessoa; }

public String getTelefone() { return telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } }

PROGRAMAO I (JAVA) | Educao a Distncia

157

package pessoal; public class Fisica extends Pessoa { private String cpf; public Fisica() { super();} public String getCpf() { return cpf; } public void setCpf(String cpf) { this.cpf = cpf; } }

package pessoal; public class Juridica extends Pessoa { private String cnpj; public Juridica() { super(); } public String getCnpj() { return cnpj; } public void setCnpj(String cnpj) { this.cnpj = cnpj; } }

package caixa; import pessoal.Pessoa; public class Conta { private double saldo; private int numConta; private Pessoa titular; private int tipoConta; public Conta() { super(); } public int getNumConta() { return numConta; } public void setNumConta(int numConta) { this.numConta = numConta; } public double getSaldo() { return saldo; } public void setSaldo(double saldo) { this.saldo = saldo; } public int getTipoConta() { return tipoConta; } public void setTipoConta(int tipoConta) { this.tipoConta = tipoConta; } public Pessoa getTitular() { return titular; } public void setTitular(Pessoa titular) { this.titular = titular; } }

158 PROGRAMAO I (JAVA) | Educao a Distncia

package caixa; import java.util.ArrayList; public class CaixaEletronico { private Conta c; private ArrayList contasCadastradas = new ArrayList<Conta>(); public public public public } void void void void sacar(float valorSaque) {} depositar(float valorDep) {} verificarSaldo(){} transferir(int numContaDestino, float valor) {}

2. Por herana, o atributo protected nomePessoa da classe Pessoa pode ser acessado por qualquer classe que estende tal classe independentemente em qual pacote esteja. Se o atributo for private, este no pode ser acessado de forma direta a partir da classe Jurdica. 3. Acrescente os seguintes atributos classe Conta:
public static final double limiteTransferencia = 3000.0; public static final double limiteSaque = 1000.0; public static final double taxaJuros = 1.5;

4. A sada ser:
Pessoa Construct Pessoa Fisica Vendedor

PROGRAMAO I (JAVA) | Educao a Distncia

159

UNIDADE V 1.
package animal; public class Gato extends Animal { public Gato(String nome, int id) { super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Gato: + super.getNome()); System.out.println(Idade: + super.getIdade()); System.out.println(Gato correndo, com suas 4 patas); } @Override public void emiteSom() { System.out.println(Miauuuuu... !); } }

package animal; public class Galinha extends Animal { public Galinha(String nome, int id) { super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Galinha: + super.getNome()); System.out.println(Idade: + super.getIdade()); System.out.println(Galinha correndo, com suas 2 patas); } @Override public void emiteSom() { System.out.println(Cocoric...!); } }

160 PROGRAMAO I (JAVA) | Educao a Distncia

package animal; public class Avestruz extends Animal { public Avestruz(String nome, int id) { super.setNome(nome); super.setIdade(id); } @Override public void seLocomove() { System.out.println(Avestruz: + super.getNome()); System.out.println(Idade: + super.getIdade()); System.out.println(Avestruz correndo, com suas 2 patas); } @Override public void emiteSom() { System.out.println(Ruuuu... !); } }

PROGRAMAO I (JAVA) | Educao a Distncia

161

REFERNCIAS
DEITEL, Harvey M. Java - Como Programar. 8. ed. Prentice Hall Brasil, 2010. HORSTMANN, Cay S.; CORNELL, Gary. Core Java. V.1 Fundamentos. 8. ed. Pearson, 2010. HORSTMANN, Cay S.; CORNELL, Gary. Core Java. V.2 - Advanced Features. Prentice Hall, 2008. SIERRA, Kathy; BATES, Bert. Use A Cabea! Java. 2. ed. Alta Books, 2008.

162 PROGRAMAO I (JAVA) | Educao a Distncia

You might also like