programação de computadores ii

154

Upload: marcio

Post on 15-Dec-2015

47 views

Category:

Documents


0 download

DESCRIPTION

HistóriaA tecnologia Java foi criada em 1991, a partir de um projetodesenvolvido pela empresa Sun Microsystems (este projeto foi lideradopor James Gosling), e, poucos anos depois, em 1995, ganhounotoriedade mundial. Isto aconteceu a partir do momento em que alinguagem de programação passou a ser o foco principal da empresa.A plataforma Java, desde o momento inicial, quando foi anunciada pelaSun, é composta pela Máquina Virtual Java (JVM) e pela API JAVA; logoem seguida, esta plataforma passou a ser incorporada ao navegadorNetscape Navigator (principal navegador da época). Esse fato impulsionoua grande aceitação no uso da plataforma Java, fato verificado nosanos seguintes.CaracterísticasVejamos a seguir algumas características que propiciaram ocrescimento e a grande aceitação da linguagem Java no cenário dedesenvolvimento web.

TRANSCRIPT

  • Programao de Computadores II

    Alexandre Michael Souza de MeloThiers Garretti Ramos Sousa

  • Jouberto Ucha de MendonaReitor

    Amlia Maria Cerqueira UchaVice-Reitora

    Jouberto Ucha de Mendona JuniorPr-Reitoria Administrativa - PROAD

    Ihanmarck Damasceno dos SantosPr-Reitoria Acadmica - PROAC

    Domingos Svio Alcntara MachadoPr-Reitoria Adjunta de Graduao - PAGR

    Temisson Jos dos SantosPr-Reitoria Adjunta de Ps-Graduaoe Pesquisa - PAPGP

    Gilton Kennedy Sousa FragaPr-Reitoria Adjunta de Assuntos Comunitrios e Extenso - PAACE

    Jane Luci Ornelas FreireGerente do Ncleo de Educao a Distncia - Nead

    Andrea Karla Ferreira NunesCoordenadora Pedaggica de Projetos - Nead

    Lucas Cerqueira do ValeCoordenador de Tecnologias Educacionais - Nead

    Equipe de Elaborao e Produo de Contedos Miditicos: Alexandre Meneses Chagas - Supervisor Ancjo Santana Resende - CorretorAndira Maltas dos Santos DiagramadoraClaudivan da Silva Santana - DiagramadorEdilberto Marcelino da Gama Neto DiagramadorEdivan Santos Guimares - DiagramadorFbio de Rezende Cardoso - WebdesignerGeov da Silva Borges Junior - IlustradorMrcia Maria da Silva Santos - CorretoraMarina Santana Menezes - WebdesignerMatheus Oliveira dos Santos - IlustradorPedro Antonio Dantas P. Nou - WebdesignerRebecca Wanderley N. Agra Silva - DesignerRodrigo Otvio Sales Pereira Guedes - WebdesignerRodrigo Sangiovanni Lima - AssessorWalmir Oliveira Santos Jnior - Ilustrador

    Redao:Ncleo de Educao a Distncia - NeadAv. Murilo Dantas, 300 - FarolndiPrdio da Reitoria - Sala 40CEP: 49.032-490 - Aracaju / SETel.: (79) 3218-2186E-mail: [email protected]: www.ead.unit.br

    Impresso:Grfica GutembergTelefone: (79) 3218-2154E-mail: [email protected]: www.unit.br

    Banco de Imagens:Shutterstock

    Copyright Sociedade de educao Tiradentes.

    M528p Melo, Alexandre Michael Souza de Programao de computadores II / Ale-

    xandre Michael Souza de Melo, Thiers Gar-retti Ramos Sousa. Aracaju : UNIT, 2011.

    152 p.: il.

    Inclui bibliografia

    1. Informtica 2. Programao de com-putadores. I. Sousa, Thiers Garretti Ramos Universidade. II. Tiradentes Educao Distncia III. Titulo

    CDU : 004.42

  • Prezado(a) estudante, A modernidade anda cada vez mais atrelada ao tempo,

    e a educao no pode ficar para trs. Prova disso so as nossas disciplinas on-line, que possibilitam a voc estudar com o maior conforto e comodidade possvel, sem perder a qualidade do contedo.

    Por meio do nosso programa de disciplinas on-line

    voc pode ter acesso ao conhecimento de forma rpida, prtica e eficiente, como deve ser a sua forma de comunicao e interao com o mundo na modernidade. Fruns on-line, chats, podcasts, livespace, vdeos, MSN, tudo vlido para o seu aprendizado.

    Mesmo com tantas opes, a Universidade Tiradentes

    optou por criar a coleo de livros Srie Bibliogrfica Unit como mais uma opo de acesso ao conhecimento. Escrita por nossos professores, a obra contm todo o contedo da disciplina que voc est cursando na modalidade EAD e representa, sobretudo, a nossa preocupao em garantir o seu acesso ao conhecimento, onde quer que voc esteja.

    Desejo a voc bom aprendizado e muito sucesso!

    Professor Jouberto Ucha de Mendona

    Reitor da Universidade Tiradentes

    Apresentao

  • Sumrio

    Parte 1: Princpios da Programao Orientada a Objetos em Java . . . . . . . . . . . . . . . . . . . . . 11

    Tema 1: Introduo Orientao a Objetos . . . . . . . . . . . . . . . . . . . . 13

    1.1 Revisando a Linguagem Java . . . . . . . . . . . . . . . . . . . . . . . . 14

    1.2 Conceitos Bsicos da OO . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

    1.3 Classes e Objetos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

    1.4 Atributos e Mtodos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

    Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

    Tema 2: Herana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .47

    2.1 Construtores e o Gerenciamento da Memria . . . . . . . . . 48

    2.2 Membros de Instncia X Membros de Classe . . . . . . . . . 54

    2.3 Herana no Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .61

    2.4 A classe Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

    Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75

    Parte 2: Aspectos Avanados da Programao Orientada a Objetos em Java . . . . . . . . . . 77

    Tema 3: Polimorfismo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .79

    3.1 Do Conceito Prtica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    3.2 Abstract X Final . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

    3.3 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

    3.4 Interfaces Especiais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

    Tema 4: Excees, Colees e Fluxos . . . . . . . . . . . . . . . . . . . . . . . . 111

    4.1 Tratamento de Excees . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

    4.2 Avanando nas Excees . . . . . . . . . . . . . . . . . . . . . . . . . 120

    4.3 Colees da Java API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128

    4.4 Fluxo de Dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .136

    Resumo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

    Referncias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

  • Concepo da Disciplina

    Ementa

    Introduo Orientao a Objetos: Revisando a Linguagem Java, Conceitos Bsicos da OO, Classes e Objetos, Atributos e Mtodos. Herana: Constru-tores e o Gerenciamento da Memria, Membros de Instncia X Membros de Classe, Herana no Java, A classe Object. Polimorfismo: Do Conceito Prtica, Abstract X Final, Interfaces, Interfaces Especiais. Excees, colees e fluxos: Tratamento de Excees, Avanando nas Excees, Colees da Java API, Fluxos de Dados.

    Objetivos:

    Geral

    Apresentar ao aluno os conceitos do paradigma da Programao Orientada a Objetos na linguagem de programao Java.

    Especficos

    Desenvolver a capacidade de abstrao do mundo real para implementao em aplicaes computacionais;

    Escrever trechos de cdigo reutilizveis e de fcil manuteno, viabilizando a cons-truo de aplicaes mais complexas.

  • Orientao para Estudo

    A disciplina prope orient-lo em seus proce-dimentos de estudo e na produo de trabalhos cientficos, possibilitando que voc desenvolva em seus trabalhos e pesquisas o rigor metodo-lgico e o esprito crtico necessrios ao estudo.

    Tendo em vista que a experincia de estu-dar a distncia algo novo, importante que voc observe algumas orientaes:

    Cuide do seu tempo de estudo! Defina um horrio regular para acessar todo o contedo da sua disciplina disponvel neste material impresso e no Ambiente Virtual de Apren-dizagem (AVA). Organize-se de tal forma para que voc possa dedicar tempo sufi-ciente para leitura e reflexo;

    Esforce-se para alcanar os objetivos pro-postos na disciplina;

    Utilize-se dos recursos tcnicos e huma-nos que esto ao seu dispor para bus-car esclarecimentos e para aprofundar as suas reflexes. Estamos nos referindo ao contato permanente com o professor e com os colegas a partir dos fruns, chats e encontros presenciais. Alm dos recursos disponveis no Ambiente Virtual de Aprendizagem AVA.

    Para que sua trajetria no curso ocorra de forma tranquila, voc deve realizar as atividades propostas e estar sempre em contato com o professor, alm de acessar o AVA.

  • Para se estudar num curso a distncia deve-se ter a clareza que a rea da Educao a Distn-cia pauta-se na autonomia, responsabilidade, coo-perao e colaborao por parte dos envolvidos, o que requer uma nova postura do aluno e uma nova forma de concepo de educao.

    Por isso, voc contar com o apoio das equipes pedaggica e tcnica envolvidas na ope-racionalizao do curso, alm dos recursos tecno-lgicos que contribuiro na mediao entre voc e o professor.

  • Parte 1

    PRINCPIOS DA PROGRAMAO ORIENTADA A OBJETOS EM JAVA

  • 1 Introduo Orientao a ObjetosNeste nosso primeiro tema, veremos uma introduo ao conceito

    de Orientao a Objetos (OO). Inicialmente, comentaremos o novo paradigma de desenvolvimento de aplicaes e em seguida breves comentrios sobre os conceitos bsicos. Haver ainda a apresentao dos conceitos de objetos e tambm de classes, com seus atributos e mtodos. Aps este captulo, estaremos preparados para aprofundar os pilares da programao Orientada a Objetos.

    Caso voc j possua alguma informao a respeito da lingua-gem orientada a objetos (como Java, por exemplo), este livro pode ajud-lo a aprofundar os seus conhecimentos, porm no fi-que preocupado caso voc no possua nenhuma experincia com a programao OO. Como a linguagem Java ser usada para ensinar conceitos de OO, neste primeiro momento ser feita uma breve reviso da linguagem Java (sinta-se vontade para rever o que achar necessrio sobre a linguagem no livro anterior Programao de Computadores I).

  • Programao de Computadores II14

    1.1 Revisando a Linguagem Java

    HistriaA tecnologia Java foi criada em 1991, a partir de um projeto

    desenvolvido pela empresa Sun Microsystems (este projeto foi lide-rado por James Gosling), e, poucos anos depois, em 1995, ganhou notoriedade mundial. Isto aconteceu a partir do momento em que a linguagem de programao passou a ser o foco principal da empresa. A plataforma Java, desde o momento inicial, quando foi anunciada pela Sun, composta pela Mquina Virtual Java (JVM) e pela API JAVA; logo em seguida, esta plataforma passou a ser incorporada ao navegador Netscape Navigator (principal navegador da poca). Esse fato impulsio-nou a grande aceitao no uso da plataforma Java, fato verificado nos anos seguintes.

    CaractersticasVejamos a seguir algumas caractersticas que propiciaram o

    crescimento e a grande aceitao da linguagem Java no cenrio de desenvolvimento web.

    a) Simplicidade: a linguagem Java fcil de aprender e de pro-gramar (ainda mais fcil para desenvolvedores da linguagem C++, j que tem muita semelhana com ela); para no se tor-nar complexa, Java no incorporou mecanismos mais sofisti-cados como ponteiros e herana mltipla; o gerenciamento de memria ainda est presente na linguagem Java, mas no responsabilidade do desenvolvedor, pois o controle totalmente automtico.

    b) Orientada a objetos: Java uma linguagem totalmente OO, (quase) tudo considerado um objeto (a exceo fica por conta dos tipos primitivos, os quais no so objetos por uma questo de desempenho); so oferecidos todos os mecanis-mos presentes nas linguagens orientadas a objetos, como por exemplo polimorfismo, encapsulamento e herana.

  • 15Tema 1 | Introduo orientao a objetos

    c) Portabilidade: a Mquina Virtual Java (JVM Java Virtual Ma-chine) garante a portabilidade de todos os programas escri-tos em Java; estes programas escritos no formato texto (com a extenso .java) quando so compilados geram automatica-mente um outro arquivo bytecode com a extenso .class. Este bytecode pode ser executado em qualquer ambiente desde que l contenha a JVM, garantindo a veracidade da frase wri-te once, run anywhere (traduzindo: escreva uma vez, rode em qualquer lugar).

    Figura 01 - A portabilidade permite que o seu cdigo seja executado em qualquer sistema operacional.

    d) Alto desempenho: por executar um cdigo que j foi ana-lisado e convertido para um bytecode, obtm-se um bom desempenho. O coletor de lixo outro fator que melhora a performance por liberar memria que no est mais sendo usada. Alm disso, o fato de compilar no prprio ambiente que ser posteriormente interpretado, faz com que a perfor-mance seja melhor.

    e) Interpretada: em um primeiro momento ela compilada, gerando um arquivo bytecode intermedirio que pode ser executado em qualquer sistema operacional (desde que con-tenha a mquina virtual Java).

  • Programao de Computadores II16

    Figura 02 - Aps ser compilado, o arquivo fonte (*.java) se transforma em um arquivo binrio (*.class) e em

    seguida pode ser interpretado (podendo antes disso ainda ser verifi cado).

    f) Robustez: entre algumas caractersticas que tornam lingua-gem Java robusta, podemos citar: possuir no momento da compilao uma varredura por cdigo no alcanvel; procu-rar e identificar variveis no inicializadas; ser uma lingua-gem fortemente tipada; inicializar de maneira implcita todos os tipos primitivos e possuir uma eficiente manipulao de excees.

    g) Segurana: ser uma linguagem segura muito importante, j que foi projetada para ambientes distribudos; a JVM garante em um ambiente web que todos as aplicaes Java fiquem protegidas de programas maliciosos escritos em qualquer ou-tra linguagem. Alm disso, a coleta automtica de lixo tam-bm evita erros de gerenciamento de memria frequentes em outras linguagens. H tambm mecanismos de tratamento de erros e o fato de todas as variveis terem obrigatoriamente os tipos informados no momento da declarao fortalecem ainda mais o fator segurana.

  • 17Tema 1 | Introduo orientao a objetos

    h) Multithread: tcnica que projeta e implementa aplicaes paralelas de forma eficiente e que permite a utilizao de mecanismos de sincronizao entre processos.

    Por que usar Java ?H muito tempo Java a linguagem mais utilizada em todo o

    mundo e a plataforma Java o mecanismo que permite aproximar o usurio das informaes, atravs dos inmeros sistemas utilizados na Internet.

    Figura 03 - Ranking tiobe

    A API Java fornece aos desenvolvedores uma vasta biblioteca tanto para ambiente desktop (SWT, Swing) como para aplicaes web (JSP, JSF, servlet).

    A curva de aprendizado desta linguagem muito suave, mais ainda para conhecedores das linguagens C ou C++, das quais Java apresenta muita semelhana; ou mesmo para programadores que co-nhecem o conceito de orientao a objetos.

    Elementos Bsicos da Linguagem JavaComo falamos nas caractersticas da Linguagem Java, ela for-

    temente tipada (suas variveis tm obrigatoriamente que informar o tipo de dado no momento da declarao). Para esta declarao ser feita, podem ser utilizados os tipos primitivos, os quais esto

  • Programao de Computadores II18

    presentes na primeira coluna da tabela abaixo; nas demais colunas, podemos verificar os tamanhos, intervalos e valores iniciais:

    Figura 04 - Os tipos primitivos da linguagem Java.

    Para usar uma varivel, devemos informar o seu nome, tipo e valor inicial, pois o tipo determina o conjunto de valores que esta varivel pode assumir. Devemos lembrar o conceito de escopo de varivel, ou seja, partindo do princpio que uma varivel deve ser definida dentro de um mtodo, fora deste mtodo esta varivel no ser mais visvel.

    Agora devemos comentar sobre os operadores, os quais podem ser categorizados em:

    a) aritmticos: + (soma), - (subtrao), * (multiplicao), / (diviso) e % (mdulo);

    b) unrios: ++ (pr-incremento ou ps-incremento), -- (pr-de-cremento ou ps-decremento);

    c) relacionais: == (igualdade), != (desigualdade), < (menor), (maior), >= (maior ou igual);

    d) lgicos: && (E lgico), || (OU lgico), ! (negao lgica);

  • 19Tema 1 | Introduo orientao a objetos

    e) de atribuio: = (atribuio simples),

    += (x += y; equivale a x = x + y;)

    -= (x -= y; equivale a x = x - y;)

    *= (x *= y; equivale a x = x * y;)

    /= (x /= y; equivale a x = x / y;)

    %= (x %= y; equivale a x = x % y;)

    Para comentar um trecho de cdigo, existem trs possibilidades:

    a) comentrio de linha// isto est comentado

    b) comentrio de bloco/* estas linhasesto comentadas */

    c) iniciando com barra e dois asteriscos, semelhante ao co-mentrio de bloco mas podendo gerar um arquivo html de documentao automaticamente.

    /** estas linhas esto comentadas e podem gerar um html de documentao */

    As instrues de um cdigo so geralmente executadas de maneira sequencial, de cima para baixo, na ordem em que apare-cem. Sentenas de controle de fluxo, no entanto, podem alterar este fluxo de execuo.

    As estruturas de controle disponibilizadas pela linguagem Java so agrupadas da seguinte forma: declaraes de tomada de deci-so (if, if-else, switch), declaraes de lao (for, while, do-while) e as declaraes de interrupo (break, continue, return).

    A declarao if a mais simples das declaraes de controle de fluxo. Um bloco de instrues ser executado somente se um

  • Programao de Computadores II20

    determinado teste (expresso booleana) for verdadeiro. possvel executar outro bloco de instrues quando o teste for falso, para isso basta usar a opo else.

    if (teste) {// instrues quando o teste for verdadeiro

    } else { // instrues quando o teste for falso}

    J a instruo switch permite vrios caminhos de execuo possveis. Simula um cdigo com mltiplos ifs. A nica restrio que o tipo de dado da varivel a ser analisada seja byte, short, int ou char; na verso Java7 j possvel usar String tambm.

    switch (varivel) { case x: instrues A; break; case y: instrues B; break; case z: instrues C; break;}

    As declaraes while e do-while executam repetidamente um bloco de instrues enquanto uma expresso booleana (teste) for verdadeira.

    while (expresso booleana) { // instrues }

    A diferena entre estas declaraes que do-while avalia sua expresso na parte inferior do loop ao invs do topo (como no whi-le). Consequentemente, as instrues dentro do bloco do-while so sempre executados pelo menos uma vez.

    do { // instrues } while (expresso booleana);

  • 21Tema 1 | Introduo orientao a objetos

    A declarao for fornece uma maneira compacta para iterar sobre uma faixa de valores. A forma mais comum segue a orientao do cdigo abaixo:

    for(initializao;teste de trmino; ao) { bloco de instrues}

    A API Java disponibiliza vrias estruturas de armazenamento de dados, uma das mais utilizadas o array. Esta estrutura relativa-mente simples por apresentar um nmero fixo de valores e todos eles devem ser de um nico tipo. O comprimento de um array estabe-lecido no momento da criao. Depois da criao, seu tamanho no pode ser mais alterado.

    Figura 05 - Estrutura de um array.

    Outra caracterstica da linguagem Java que merece ser citada o gerenciamento de memria. Em vrias outras linguagens, o desen-volvedor responsvel por desalocar um recurso no mais utilizado; porm o gerenciamento da memria no uma tarefa simples, sendo comum ocorrer estouro da pilha (stack overflow) ou outros problemas semelhantes. Em Java, o desenvolvedor no precisa se preocupar com um controle deste tipo, uma vez que o gerenciamento da mem-ria feito automaticamente pela mquina virtual.

  • Programao de Computadores II22

    INDICAO DE LEITURA COMPLEMENTAR

    HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7. ed., So Paulo: Alta Books, 2005.

    No primeiro captulo (pg. 1 a 8) feita uma breve introduo ao Java, fazendo um breve histrico e comentando a plataforma Java; o segun-do captulo (pg. 9 a 18) fala sobre o ambiente de programao Java; o captulo 3 faz uma explanao sobre as estruturas fundamentais de programao em Java.

    MENDES, D. R.. Programao Java com nfase em Orientao a Obje-tos. So Paulo: Novatec Editora Ltda, 2009.

    O captulo 1 faz uma introduo linguagem Java (pg. 16 a 54) com destaque s suas caractersticas, enquanto que o captulo 2 apresenta os elementos bsicos da linguagem Java (pg. 77 a 90).

    PARA REFLETIR

    Como possvel escrever e compilar um programa na linguagem de programao Java em um computador com o Sistema Operacional Windows instalado e em seguida pegar o arquivo compilado (*.class) e este arquivo funcionar em uma outra mquina que tenha uma ver-so qualquer do Linux instalada ? Reflita sobre o que faz com que isto acontea e como isto acontece.

  • 23Tema 1 | Introduo orientao a objetos

    1.2 Conceitos Bsicos da OO

    HistriaAs linguagens orientadas a objetos que conhecemos atualmen-

    te surgiram por volta do ano de 1960, porm demorou mais de dez anos para que as empresas de desenvolvimento de software come-assem a adotar este novo estilo de linguagem de programao.

    Naquela poca, as linguagens utilizavam o paradigma da pro-gramao estruturada, com pouca reutilizao de cdigo e muita re-dundncia. Neste paradigma, tambm chamado de procedural, havia um alto acoplamento, ou seja, uma simples alterao em uma das partes do sistema poderia forar uma modificao em vrios locais da aplicao e, consequentemente, exigir que todo o sistema fosse testado de novo, o que aumentava o custo do software e acabava diminuindo o lucro da empresa.

    Mas, com o passar do tempo, as linguagens orientadas a obje-tos (como Java e C++) passaram a ser aceitas no mercado, passando a integrar o processo de desenvolvimento de sistemas da maioria das empresas.

    ParadigmaO paradigma da orientao a objetos possui uma tica diferen-

    te da programao estruturada, uma vez que passa a adotar maneiras de enxergar um sistema muito mais prximo da viso humana. Como, por exemplo, em um sistema de escola, teramos uma classe Aluno, outra classe Professor, outra classe Disciplina, todas elas interagindo entre si.

    No paradigma procedural, eram as funes; no paradigma OO, existe o objeto como centro das atenes. O mundo real, ento, in-terpretado como se fossem objetos interagindo entre si e possuindo os seus respectivos estados e comportamentos. Sendo que os esta-dos so as caractersticas (como por exemplo o nome de um Aluno) e os comportamentos correspondem s aes vinculadas ao objeto (por exemplo, um Aluno pode trancar uma Disciplina).

    de fundamental importncia esta mudana de paradigma (passando de programao estruturada para programao orientada a objetos), pois seria uma pssima prtica utilizar a linguagem Java,

  • Programao de Computadores II24

    por exemplo, pensando de maneira estruturada; desprezando total-mente os recursos e potenciais da linguagem, que foi concebida de fato como uma linguagem OO.

    Hoje em dia, a grande maioria das empresas adota fortemente a Programao OO (OOP). O que se nota que a OOP apenas mais uma etapa natural da evoluo do desenvolvimento de software.

    SurgimentoVamos analisar uma histria que a princpio pode parecer des-

    conexa, mas que tem sim um relacionamento com o conceito OO. Analisando os grandes fabricantes de computadores da atualidade, percebemos que eles tiveram uma curva de crescimento acelerada, isto , o sucesso foi atingido de forma relativamente rpida. Claro que os seus produtos apresentavam uma tima qualidade e que tambm conseguiam vend-los a preos satisfatrios, alm de que a procura por PC crescia muito rapidamente. Mas a questo : como estes fa-bricantes conseguiam produzir tantos modelos de computadores de forma rpida e ainda ser geis o bastante em uma poca de constan-tes evolues?

    Podemos citar alguns fatores que explicam o que aconteceu: es-tes fabricantes conseguiram aperfeioar as suas linhas de produo, passaram a comprar peas de outros fabricantes confiveis e concen-traram os esforos apenas na linha de montagem dos computadores. Isto economizava tempo e recursos na criao e desenvolvimento dos diversos componentes adquiridos. Quando estes fabricantes compra-vam um componente, estavam garantindo que estas partes (com suas propriedades e suas funcionalidades) j estavam pr-testadas, o que tornava o processo inteiro mais eficiente. Por exemplo, ao invs de fabricar um disco rgido com uma determinada capacidade de arma-zenamento e com o papel definido para armazenamento de dados, a empresa de PC comprava este HD de outro fabricante, especializado exclusivamente na construo deste componente. No momento em que estas fbricas deixaram de produzir todas as partes e passaram a comprar componentes, os seus faturamentos cresceram de maneira acentuada.

  • 25Tema 1 | Introduo orientao a objetos

    Tomando este caso como referncia, podemos fazer um pa-ralelo e perceber que a OOP segue o mesmo princpio. Um sistema desenvolvido seguindo o conceito OO composto por vrios objetos (cada um deles com as suas respectivas propriedades e funcionalida-des bem definidas). Desta forma o sistema espera apenas que cada objeto faa a sua parte, sem se preocupar em como isto ser feito, ou seja, no importa a implementao interna de cada um deles, isto responsabilidade do desenvolvedor de cada objeto.

    ObjetivoO principal objetivo da programao orientada a objeto faci-

    litar o desenvolvimento de software atravs da reutilizao de obje-tivos anteriormente desenvolvidos. Esta prtica faz com que os sis-temas sejam desenvolvidos mais rpido, de maneira mais confivel e ainda com custos mais baixos. Este objetivo conseguido atravs diversas caractersticas de programao, sendo possvel utilizar recur-sos como instanciao, polimorfismo, herana, interface, entre outros.

    Conceitos bsicosAssim como no paradigma procedural as funes fazem o papel

    principal, no paradigma OO, o conceito de objeto o ncleo principal. Um objeto pode ser entendido como uma representao codificada de qualquer entidade do mundo real, onde este objeto transferido para linhas de cdigo inclusive com suas caractersticas e seus com-portamentos.

    A programao orientada a objetos parte do princpio que os sis-temas so construdos se espelhando ao mximo nos prprios objetos da vida real. Antes de fazermos um aprofundamento em cada um dos pilares da orientao a objetos, devemos ver de maneira simplificada alguns dos conceitos principais.

    Como acabamos de citar, fica evidente que o elemento conside-rado ponto de partida para o entendimento do conceito OO o prprio objeto. Entendemos um objeto do mundo real como algo concreto (ex: um livro) ou como algo conceitual (ex: uma viagem). Definimos que um objeto possui duas caractersticas: o seu estado e o seu comportamen-to. Portanto, podemos entender o objeto como qualquer entidade real existente no nosso mundo.

  • Programao de Computadores II26

    Outro conceito importante classe, que consiste em um mo-delo para a fabricao dos objetos. Entenderemos a classe como sendo uma abstrao do objeto, algo que define todas as caracte-rsticas comuns a todos os objetos. Estas caractersticas podem ser divididas em estado (que chamamos no momento da codificao de atributos) e em comportamentos (chamados nos nossos cdigos de mtodos). Quando um objeto criado, diz-se haver construdo uma instncia de uma classe. Para que este processo acontea, necessrio fazer uso do conceito de construtor (maneira de criar a instncia), conceito que veremos mais adiante (no contedo 2.1). Classes e objetos sero explorados de maneira mais aprofundada no contedo seguinte.

    Uma instanciao consiste em utilizar classes servindo como modelos para que os objetos possam ser criados. Um objeto pr-definido passa a exisitr quando um programa executado, passando a se chamar ento de instncia de classe.

    Objetos trocam informaes entre eles atravs de mensagens, esta a maneira como um objeto invoca um outro objeto ou ento um mtodo de um outro objeto. Falaremos um pouco mais sobre o conceito de mensagens no contedo 1.4 deste mesmo tema.

    H trs tipos de comunicao entre os objetos, os quais so brevemente comentados a seguir:

    a) associao: so relacionamentos entre classes (ou entre ob-jetos). H dois tipos: agregao e composio;

    b) generalizao: tambm conhecida como herana (um dos pilares da POO), ser brevemente comentada ainda neste mesmo contedo, porm o conceito de herana ser bastan-te comentado no tema seguinte (contedo 2.3);

    c) dependncia: uma alterao em um elemento altera diretamente o seu dependente.

    A utilizao de uma estrutura bem definida, arrumada em pas-tas ou pacotes (no ingls package), facilita bastante a organizao de um sistema composto por um grande nmero de classes. Alm de

  • 27Tema 1 | Introduo orientao a objetos

    uma organizao lgica, o uso de pacotes faz com que um conjunto de classes relacionadas entre si fiquem agrupadas no mesmo diret-rio, ou seja, tambm acaba propiciando uma organizao fsica. Fala-remos mais sobre pacotes (packages) tambm no contedo seguinte.

    Conceitos fundamentaisIremos explorar mais profundamente nos contedos posteriores

    os pilares da programao OO encapsulamento, herana e polimor-fismo faremos, neste momento, uma breve apresentao sobre cada um deles:

    a) encapsulamento: a arte de ocultar uma informao (infor-mation hiding), escondendo o que no precisa ou no deve ser visto; em outras palavras, consiste em controlar o acesso aos detalhes de implementao de uma classe atravs do uso de palavras reservadas (modificadores); como o usurio no tem acesso implementao, esta pode ser alterada, corrigida ou melhorada sem que ele tome conhecimento ou mesmo tenha que fazer qualquer adaptao.

    b) herana: comum termos mais de uma classe compartilhan-do estado e comportamentos de uma classe de referncia (estas classes sero chamadas de super-classes enquanto que as que herdam sero chamadas de sub-classes). O con-ceito de herana aproveita estas semelhanas para melhorar o projeto (reduzindo a repetio de cdigo), criando super-classes que sero compostas justamente por estas simila-ridades, enquanto que as sub-classes tero como objetivo refinar e ampliar as caractersticas e comportamentos da classe superior. No h limites para nveis de herana, po-rm, especificamente na linguagem Java, h apenas a he-rana simples (uma sub-classe s pode herdar de uma ni-ca super-classe), no havendo portanto a herana mltipla (lembrando que este conceito existe em outras linguagens orientadas a objetos). De maneira geral, pode ser dito que a herana o conceito no qual uma sub-classe herda auto-maticamente todos os estados e comportamentos de uma super-classe.

  • Programao de Computadores II28

    c) polimorfismo: como o nome sugere, significa vrias formas diferentes para a mesma funcionalidade. Uma classe pode possuir um mtodo com o mesmo nome (ex: ligar), mas com diferentes assinaturas (quantidade e tipos de parme-tros distintos) para diversos fins (ex: ligar o rdio; ligar o carro). No ser preciso tomar conhecimento de todas as implementaes deste mesmo mtodo, apenas deve ser su-ficiente escolher qual delas a mais apropriada para a sua necessidade; este processo contribui para a simplificao do desenvolvimento do software e facilita a reutilizao de mtodos com os mesmos nomes.

    Outro conceito que merece destaque o de interface. Um grande motivo para a importncia do uso de interface o fato de ela preencher a lacuna deixada pela ausncia da herana mltipla, que, como foi falado anteriormente, no existe na linguagem Java. Uma interface define um conjunto de funcionalidades que precisam ser fornecidas por qualquer classe que venha a implementar esta interface. H uma grande proximidade da interface com a classe abstrata, sendo que uma interface abriga exclusivamente mtodos abstratos. Voltaremos a falar sobre este assunto no tema 3 (conte-dos 3.2 e 3.3).

    No podemos deixar de falar sobre o conceito de abstrao, que consiste em impedir que o desenvolvedor conhea detalhes da implementao de uma determinada funcionalidade. Com a uti-lizao da abstrao, permanece explcita apenas a assinatura do mtodo, ficando oculto todo o cdigo. Ou seja, no precisa tornar pblico como fazer, apenas o que se faz. O importante o que um objeto e o que ele faz sem se preocupar em como a sua implementao.

  • 29Tema 1 | Introduo orientao a objetos

    INDICAO DE LEITURA COMPLEMENTAR

    SINTES, A. Aprenda Programao Orientada a Objetos. So Paulo: Pearson Education do Brasil, 2010.

    A leitura da pgina 1 at a 16 muito interessante, pois faz uma im-portante introduo programao orientada a objetos.

    CADENHEAD, R.; LEMAY, L. Aprenda em 21 dias Java 2. 4. ed. So Paulo: Elsevier Editora Ltda, 2005.

    Para revisar e aprimorar seus estudos neste assunto, sugerida uma leitura nos captulos 5 e 6 (da pg. 73 a 106).

    PARA REFLETIR

    Reflita junto com seus colegas sobre a importncia dos conceitos fundamentais da Orientao a Objetos, que so encapsulamento, herana e polimorfismo.

    1.3 Classes e Objetos

    ClasseUma classe pode ser entendida como um modelo, uma espcie

    de forma (ou ainda de gabarito) para a definio de objetos. Quando nos voltamos para o mundo dos softwares, usamos o conceito de classes para agrupar estes objetos que possuem uma relao entre si (caractersticas que os objetos tm em comum). A premissa da OO trazer para o mundo dos softwares todos os objetos do mundo real.

  • Programao de Computadores II30

    Desta maneira, entendo que, de acordo com o nosso mundo real, avies, navios, carros e motocicletas so classificados como meios de transporte. Apesar de serem objetos de tamanhos, formas e valores diferentes, eles possuem caractersticas comuns inerentes a todos os meios de locomoo (quantidade de passageiros, tipo de combustvel etc). Assim sendo, a meta passa a ser codificar os objetos do mundo real acima citados em uma linguagem de programao.

    Uma classe constri a especificao de todas as informaes comuns a objetos da mesma espcie. Estas informaes so dividi-das em duas categorias: atributos e comportamentos.

    Os atributos da classe so as caractersticas, tais como marca, cor, velocidade. Podemos chamar de propriedades da classe o con-junto de todos os atributos. Vale ressaltar que cada atributo precisa ser implementado com um nome e um tipo de dado correspondente. Por sua vez, os comportamentos so aes que de maneira geral al-teram os atributos. Por exemplo, os comportamentos acelerar e frear que alteram o atributo velocidade; estes comportamentos so imple-mentados atravs de mtodos (que podem ser funes ou procedi-mentos); cada mtodo implementado com uma assinatura (nome do mtodo, tipo de retorno e lista de parmetros) e um conjunto de instrues.

    ObjetosComo no poderia deixar de ser, o conceito de objeto de

    grande importncia para a Programao Orientada a Objetos. uti-lizado em praticamente todo processamento de uma aplicao. o elemento utilizado para representar qualquer coisa, seja ela real (ex: carro) ou mesmo abstrata (ex: viagem). Objetos so simplesmente instncias de uma classe previamente definida.

    A partir do momento que temos uma classe chamada Pessoa com os atributos nome, idade e telefone, podemos criar uma ins-tncia desta classe que representa um objeto real, ou seja, teremos um objeto pessoa com o nome Joo, idade igual a 25 anos e com o telefone 9876-1234.

  • 31Tema 1 | Introduo orientao a objetos

    Uma aplicao orientada a objetos construda por vrios ob-jetos que interagem entre si. Cada interao desta vista como uma troca de mensagens, que ocorre atravs da chamada de mtodos uns dos outros.

    Para assimilar o conceito de classe e objetos, faa a seguinte atividade, agrupar em classes os seguintes objetos: cachorro, note-book, navio, cavalo, bicicleta, impressora, pato, avio e celular.

    CodificandoToda classe deve comear com letra maiscula e deve ter o

    nome igual ao do arquivo; se a classe for Pessoa, o arquivo tem que ser obrigatoriamente Pessoa.java. Todo cdigo escrito na linguagem Java fica dentro desta classe. A sintaxe da assinatura de uma classe consiste em um modificador de acesso + palavra reservada class + nome da classe, de acordo com o exemplo abaixo:

    public class Pessoa { . . .}

    Aps termos criado a classe Pessoa, podemos em qualquer outra classe criar uma instncia de Pessoa, chamada pessoa X com os valores citados anteriormente. Para tanto, utilizaremos a palavra reservada new, de acordo com o cdigo abaixo:

    Pessoa pessoaX = new Pessoa();

    Da maneira acima, precisaremos atribuir as informaes reais (Joo, 25 anos e o telefone 9876-1234) posteriormente. Ou pode-mos fazer da maneira a seguir:

    Pessoa pessoaX = new Pessoa(Joao, 25, 98761234);

    A diferena entre as duas construes acima apenas no cons-trutor, ou seja, na forma que a instncia criada. Falaremos mais sobre construtores no contedo 2.1.

  • Programao de Computadores II32

    PacotesO Kit do Desenvolvedor Java (JDK) contm um conjunto pr-defi-

    nido de classes, todas estas classes juntas compem a API Java. Elas so organizadas por afinidade em vrias pastas chamadas de pacotes. Cada pacote agrupa classes que apresentam propsitos semelhantes, como operaes matemticas, manipulaes de datas e textos, trata-mento de arquivos etc. Outro motivo para a utilizao de pacotes que assim fica possvel a existncia de classes com o mesmo nome, desde que localizadas em pacotes diferentes. Isto possvel, uma vez que quando se deseja referenciar uma classe, faz-se necessrio infor-mar o nome completo da mesma, o que inclui o caminho inteiro do pacote seguido pelo nome da prpria classe.

    Mas claro que, alm de ter disposio uma enorme biblio-teca de classes prontas para os mais variados fins, o prprio desen-volvedor est livre para crias as classes necessrias para a construo do seu software, preocupando-se exclusivamente com as regras de negcio prprias da sua aplicao. Neste momento, quando ns desenvolvedores criamos nossos prprios sistemas computacionais, precisamos criar vrias classes e ento podemos organiz-las tambm em pastas, tambm chamadas de pacotes (ou packages).

    Os pacotes servem para organizar tanto logicamente (por afini-dade), como fisicamente (ficando nas mesmas pastas no sistema de arquivos). Esta organizao melhora a estruturao da aplicao e tambm otimiza o processo de publicao.

    A maneira utilizada para informarmos o pacote ao qual uma classe pertence identificando na primeira linha da classe a sua de-clarao de pacote, de acordo com a sintaxe a seguir:

    Sintaxe:package [.];

    Por exemplo, para a classe Funcionrio, podemos informar que o pacote seria como indicado abaixo:

    package br.com.empresa;

  • 33Tema 1 | Introduo orientao a objetos

    Como falado anteriormente, esta classe deve estar localizada fisicamente na pasta br/com/empresa, que fica na raiz do projeto.

    Caso o pacote no seja citado no incio da classe, a mesma deve estar localizada no raiz do projeto e diz-se que est no pacote default; mas esta prtica no recomendada.

    Sempre que precisarmos fazer uso de qualquer classe que faa parte da API, devemos fazer uma referncia para a mesma com o nome completo (pacote + nome). Isto pode ser feito de duas maneiras:

    a) em toda ocorrncia da classe, a classe deve esta acionada atravs do nome completo;

    b) fazer uma nica referncia de importao no incio do arqui-vo (aps a declarao package, caso exista) utilizando a sintaxe abaixo:

    import [.].;Exemplo:import java.util.Random;

    Utilizando a segunda maneira (com a palavra reservada im-port), sempre que for preciso, a classe (ex: Random) pode ser refe-renciada sem o nome completo do pacote em toda parte do cdigo.

    Estas mesmas regras se aplicam quando precisamos usar clas-ses que ns criamos, caso no estejam evidentemente no mesmo pacote (j que neste caso no se faz necessrio a referncia).

    Exemplo:import br.com.empresa.Funcionario;

    Caso seja necessrio fazer referncia a vrias classes dentro de um mesmo pacote, podemos utilizar uma espcie de coringa (*), o qual referencia todas as classes naquele pacote especfico; isso evita que seja feita a referncia individual para cada uma das classes que se deseja utilizar.

    Exemplo:import br.com.empresa.*;

  • Programao de Computadores II34

    Em apenas um caso no necessrio fazer a importao, esta exceo acontece quando a classe que se deseja utilizar est dentro do pacote java.lang. As classes localizadas neste pacote so essenciais linguagem de programao e, por este motivo, precisam estar sem-pre disponveis para uso; podemos entender a instruo import java.lang.*; como sendo implcita para todas as classes.

    Classes WrappersSo classes Java que possuem os mesmos servios dos tipos

    primitivos, porm com vrias outras funcionalidades acrescentadas. Em ingls, wrap significa envolver, ento temos classes que envol-vem as classes originais (que no caso so os tipos primitivos) e oferecem novas funes.

    Lembrando que os tipos primitivos em Java no so objetos (todo o resto objeto), ento temos para cada um dos tipos primiti-vos, uma respectiva classe Wrapper, sendo esta um objeto. Existem ento oito classes wrappers para os tipos primitivos e, entre as novas funcionalidades, podemos destacar os mtodos de converso entre tipos, mudana de bases decimais e outras operaes que so per-mitidas apenas a objetos (como por exemplo manipulaes com con-juntos). Isto se deve ao fato de tornar possvel o uso da super classe Object implicitamente atravs das classes wrappers. Falaremos mais sobre a classe Object no contedo 2.4.

    Figura 06 - Os tipos primitivos e suas respectivas classes wrappers.

  • 35Tema 1 | Introduo orientao a objetos

    Cada uma das classes wrappers acima fornece dois construtores (formas para se criar uma instncia); na primeira forma, um String es-perado um parmetro e na segunda forma esperado um tipo primiti-vo correspondente ao que est sendo envolvido. A exceo a classe Character com apenas um construtor com um parmetro do tipo char.

    Exemplos:Integer valorA = new Interger(10);Integer valorB = new Interger(10);

    Entre os mtodos adicionais das classes wrappers falados ante-riormente, podemos destacar os mais relevantes, que so:

    a) valueOf ( ) : fornece mais outra maneira para a instanciao, conforme exemplos abaixo;

    Integer valorA = Interger.valueOf(11);Integer valorB = Interger.valueOf(11);Integer valorC = Interger.valueOf(11, 2);// o segundo parmetro indica que o valor est // escrito na base 2; ou seja 11 na base 2 (igual a 3)

    b) xxxValue ( ) : permite converter um objeto das classes wra-ppers numricas para qualquer tipo primitivo.

    exemplos:Integer valorA = new Interger(12);int valorB = valorA.intValue();long valorC = valorA.longValue();float valorD = valorA.floatValue();

    c) parseXxx() : convertem String em um tipo primitivo numrico;

    exemplos:byte valorA = Byte.parseByte(13);double valorB = Double.parseDouble(13.4);

  • Programao de Computadores II36

    d) toString() : facilita a converso de um tipo primitivo qualquer em String.

    exemplos:String strA = Interger.toString(14);String strB = Float.toString(14.5);

    A partir da verso Java 5, quando surgiu o conceito de autobo-xing (ou boxing e unboxing), possvel manipular objetos das classes wrappers como se fossem tipos primitivos.

    Exemplos:Integer valorA = 15;valorA = 16;int valorB = valorA;valorA++;

    Vamos observar agora as facilidades detectadas nas linhas aci-ma em virtude do autoboxing. Na primeira linha, foi criado um ob-jeto Integer sem utilizar o construtor com a palavra reservada new; j nas linhas seguintes, o objeto valorA foi tratado como se fosse realmente um tipo primitivo. importante destacar apenas que os objetos das classes wrappers so imutveis, isto , ao alterar um va-lor, o autoboxing de maneira transparente cria um novo objeto com o novo valor, descarta o anterior e a varivel de referncia (valorA no nosso exemplo) assume este novo objeto.

    INDICAO DE LEITURA COMPLEMENTAR

    HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7. ed., So Paulo: Alta Books, 2005.

    Uma boa recomendao de leitura sobre este contedo o quarto ca-ptulo deste livro, da pgina 51 a 63, que orienta a utilizao de classes predefinidas e ensina a criao e definio das suas prprias classes.

  • 37Tema 1 | Introduo orientao a objetos

    BARNES, D., KOLLING M. Programao Orientada a Objetos com Java. So Paulo: Makron Books, 2006.

    No captulo 1, h uma interessante apresentao ao estudo de objetos (criao e interao) e de classes das pginas 3 a 15.

    PARA REFLETIR

    Se os tipos primitivos foram construdos para oferecerem uma melhor performance, qual a vantagem no uso das classes Wrappers (que emulam os tipos primitivos)?

    Neste momento, preciso que voc faa uma reflexo sobre a preocu-pao com o desempenho na tecnologia Java. Faa uma ponderao sobre o fato dos tipos primitivos permanecerem presentes na espe-cificao da linguagem Java e tambm sobre a existncia das classes Wrappers (que emulam os tipos primitivos).

    1.4 Atributos e Mtodos

    IntroduoAntes de comearmos a falar sobre atributos e mtodos, deve-

    mos lembrar inicialmente do conceito de Classe. Conforme podemos retirar da definio feita no contedo anterior, temos que uma classe composta por duas partes: atributos e comportamentos. Comentare-mos cada uma destas partes separadamente nos prximos pargrafos.

    AtributosTambm chamados de membros de uma classe, os atributos

    representam as caractersticas (propriedades) das classes. So eles

  • Programao de Computadores II38

    os responsveis pelo armazenamento da informao, mantendo as particularidades de cada um dos objetos. Cada classe pode possuir vrios atributos, cada um deles deve ser representado por um nome (identificador). Alm disso, para cada um dos atributos, faz-se necess-rio informar qual o tipo de dado desejado; podendo ser um tipo de dado primitivo ou at mesmo algum outro objeto (a linguagem Java no per-mite a criao de um atributo sem que seja informado o tipo de dado).

    Tomando como exemplo uma classe chamada Pessoa, podemos assumir a existncia de vrios atributos, cada um deles representado pelo seu tipo e seu identificador.

    public class Pessoa { // atributos String nome; int idade;}

    MtodosLembrando que uma classe composta por atributos e por

    comportamentos. A partir de agora passaremos a chamar estes com-portamentos de mtodos. Um mtodo simplesmente um processo que realiza uma ao, podendo em muitas vezes manipular o valor de um ou mais atributos.

    Alm de iniciar sempre com letra minscula, a recomendao para a criao de um mtodo conter um verbo no infinitivo (termi-nao ar, er, ir, or), imediatamente seguido de um substantivo. Por exemplo: calcularIdade(), imprimirDados().

    Sintaxe da assinatura de um mtodo: () Sendo que:

    : palavra reservada que determina o nvel de acesso ao mtodo;

    : indica se haver ou no um tipo de retorno; caso haja um retorno, ser informado o tipo de dado deste retorno;

    : identificador do mtodo (seguir a recomendao acima);: valores esperados pelo mtodo.

  • 39Tema 1 | Introduo orientao a objetos

    Figura 07 - Objeto Pessoa.

    MensagensOs objetos precisam se relacionar, precisam trocar informaes

    para realizar tarefas, no fazem nada sozinhos. Para que esta comuni-cao ocorra, deve existir uma troca de mensagens. Estas mensagens identificam as operaes que precisam ser executadas atravs de trs componentes:

    a) objeto para o qual a mensagem acionada;

    b) mtodo dentro do objeto que ser executado;

    c) parmetros necessrios para a execuo do mtodo.

    Considerando um objeto Veculo, preciso que outro objeto Motorista lhe envie uma mensagem, por exemplo, acionando o m-todo abrirPorta(), passando ainda um parmetro: qual porta deseja abrir. H ainda uma grande vantagem na utilizao da troca de men-sagens: uma vez que as interaes so feitas atravs destas men-sagens, no necessrio que todos os objetos estejam dentro da mesma aplicao, ou seja, possvel acionar mtodos de objetos que esto at mesmo em outro servidor de aplicaes web.

    Temos ento o entendimento que um programa OO consiste simplesmente em um conjunto de objetos, sendo especificado em

  • Programao de Computadores II40

    cada um deles o que o mesmo capaz de fazer. No momento que se desejar utilizar algum mtodo de qualquer objeto, basta que seja enviada uma mensagem solicitando a sua execuo.

    Figura 08 - Utilizando uma mensagem, o objeto Motorista acessa um mtodo do objeto Veculo.

    AcessabilidadeCada uma das linguagens de programao possui a sua prpria

    lista de palavras reservadas para a definio do controle de acesso a vari-veis e mtodos, mas basicamente existem os seguintes nveis:

    a) pblico: permite o acesso por todos os mtodos de todas as classes, no havendo restries. Este o nvel mais libe-rado possvel, j seu uso em um atributo significa que no est sendo utilizado o conceito de encapsulamento.

    b) protegido: acesso permitido aos mtodos da prpria classe, de outras classes do mesmo pacote e tambm por todas as classes que herdam dela (o conceito de herana ser estuda-do no tema seguinte, mais precisamente no contedo 2.3).

    c) privado: o acesso liberado apenas aos mtodos da prpria classe. Este o nvel mais protegido possvel e os atributos devem estar neste nvel de acesso de acordo com a teoria do encapsulamento.

  • 41Tema 1 | Introduo orientao a objetos

    Na linguagem Java, so utilizadas as seguintes palavras-chaves: public, protected e private para definir os respectivos itens acima.

    Porm, h ainda outro nvel de acesso: o default (ou package-private), que caracterizado justamente pela ausncia das palavras reservadas acima citadas. O seu acesso permitido apenas para a prpria classe e para as outras classes do mesmo pacote.

    Figura 09 - Tabela de nveis de acesso.

    EncapsulamentoDe acordo com a teoria de orientao a objeto, encapsular signi-

    fica ocultar, esconder informaes de um objeto. Consiste em construir classes que no permitem o acesso direto aos seus atributos, estes no podero ser lidos ou alterados por outras classes.

    Como ento manipular tais informaes? A nica maneira para fa-zer isso utilizar mtodos da prpria classe construdos especificamente para esta finalidade. Esses mtodos so divididos em dois tipos:

    a) configurador: responsvel pela alterao dos dados, chamado tambm de setter ou mutator, permite a atualizao do valor de um atributo. A recomendao que o seu nome inicie com o prefixo set e seja acompanhado do nome do atributo a ser atualizado, ex: setNome( ).

    b) capturador: mtodo que recupera a informao, tambm chama-do de getter ou accessor, retorna o valor de um atributo. A re-comendao que o seu nome comece pelo prefixo get e seja acompanhado do nome do atributo solicitado, ex: getNome( );

    Alm de esconder a complexidade do cdigo, o encapsulamento tambm tem a funo de proteger os dados de classes externas,

  • Programao de Computadores II42

    evitando que os atributos recebam valores indevidos (tornando-os inconsistentes), uma vez que tais atributos s podem ser acessados pela sua prpria classe.

    O uso de palavras-reservadas modificadoras de acesso permite limitar o acesso s informaes de uma classe. Isso evita que os seus dados se tornem inconsistentes ou at mesmo indevidos, garan-tindo consequentemente a confiabilidade destas informaes. Isso acontece de fato, pois o acesso a um atributo atravs de um mtodo permite que a informao que se pretende atribuir seja avaliada, ve-rificando se realmente possvel executar tal atribuio. Para que uma classe siga corretamente todas as orientaes da teoria do en-capsulamento, todos os seus atributos devem ser privados (palavra reservada private), tornando-os de acesso exclusivo da prpria classe (nem uma eventual sub-classe pode ter acesso), e tambm fornecer mtodos configuradores e capturadores para cada um destes atri-butos, sendo assim possvel a manipulao (leitura e gravao) de todas as suas caractersticas.

    public class Pessoa { // atributos private String nome; private int idade; // mtodos configuradores public void setNome(String nome) { this.nome = nome; } public void setIdade(int idade) { this.idade = idade; } // mtodos capturadores public String getNome() { return this.nome; } public int getIdade() { return this.idade; }}

  • 43Tema 1 | Introduo orientao a objetos

    A palavra-chave this utilizada no exemplo acima serve para fa-zer referncia ao objeto atual, pode ser utilizada em qualquer ponto do cdigo e pode acionar tanto os atributos como os mtodos. Em alguns casos, o seu uso dispensvel, podendo ser usado apenas como o reforo, como nos casos dos mtodos capturadores (exem-plo: getNome), mas, mesmo assim, o seu uso recomendado por simplesmente aumentar a legibilidade do cdigo. Entretanto, em ou-tras situaes, a presena da palavra this imprescindvel, como nos mtodos configuradores (exemplo: setNome), com o propsito de se diferenciar o atributo do parmetro. Claro que este caso poderia ser resolvido de outra forma, por exemplo, alterando-se o nome do parmetro, porm o mais comum realmente a construo acima. Existe ainda outra finalidade para a palavra this, ela pode ser usada quando se deseja passar como parmetro o prprio objeto atual para um mtodo qualquer.

    Sobrecarga de MtodosA programao orientada a objetos permite a existncia de m-

    todos com o mesmo nome, mas com a lista de parmetros diferentes, onde esta diferena pode acontecer tanto na quantidade dos argu-mentos como nos tipos dos mesmos. Esta situao conhecida como sobrecarga (ou overload) de mtodos.

    O uso deste mecanismo no cria um conflito, pois o compilador ser capaz de entender qual mtodo est sendo acionado justamente a partir da verificao da lista de parmetros.

    Para que seja caracterizada uma sobrecarga de mtodos, os seguintes fatos devem acontecer:

    a) os mtodos em questo devem estar na mesma classe ou em classes com relacionamento de herana;

    b) os nomes dos mtodos devem ser o mesmo;

    c) a quantidade de parmetros deve ser diferentes ou os tipos destes mesmos parmetros.

  • Programao de Computadores II44

    No contedo 2.1 (j no prximo tema), veremos que os constru-tores de um objeto podem ser considerados com uma sobrecarga de mtodos, apesar de alguns autores no considerarem os construtores como sendo mtodos normais, mas esta uma discusso para o prximo contedo.

    Vejamos ento um exemplo de sobrecarga. A seguir, temos um mtodo somarNumeros( ) com dois parmetros do tipo inteiro e um retorno do tipo inteiro.

    public int somarNumeros(int nA, int nB) { return nA + nB;}

    Agora veremos o mesmo mtodo somarNumeros( ), s que com dois parmetros do tipo real e um retorno tambm do tipo real.

    public float somarNumeros(float nA, float nB) { return nA + nB; }

    Quando formos invocar o mtodo somarNumeros( ), a imple-mentao a ser acionada depender dos tipos de parmetros infor-mados. Se forem passados dois inteiros, o primeiro cdigo ser exe-cutado, caso sejam passados dois valores reais, o segundo trecho vai ser acionado.

    INDICAO DE LEITURA COMPLEMENTAR

    HORSTMANN, C.S.; CORNELL, G.. Core Java 2. Vol 1 - Fundamentos. 7. ed., So Paulo: Alta Books, 2005.

    Uma leitura recomendada sobre atributos e mtodos encontra-se nas pginas 65 a 71 desta obra, que fala ainda faz uma importante abor-dagem sobre o conceito de mensagens.

  • 45Tema 1 | Introduo orientao a objetos

    BARNES, D., KOLLING M. Programao Orientada a Objetos com Java. So Paulo: Makron Books, 2006.

    O captulo 2 imprescindvel para um maior aprofundamento tanto no conceito de atributos como no de mtodos (inclusive abordando sobrecarga de mtodos), esta recomendao de leitura acontece nas pginas 27 a 40.

    PARA REFLETIR

    Convide os seus colegas para debaterem sobre o encapsulamento. Analise alguns pontos como o acesso restrito empregado a toda in-formao, fazendo inclusive uma espcie de camada de proteo, onde apenas os mtodos getters / setters so pblicos. Aproveite e apresente tambm as suas reflexes para o tutor.

    RESUMO

    Voc est de parabns por ter concludo o nosso primeiro tema, no qual fizemos uma introduo a orientao a objetos. No contedo 1.1, fizemos uma breve reviso da linguagem Java, com suas caracte-rsticas (como portabilidade, robustez e segurana) e seus elementos principais (entre eles as estruturas condicionais e as de controle).

    O contedo 1.2 foi inteiramente dedicado aos conceitos bsicos da orientao a objetos. Foi feita inicialmente uma breve histria do surgimento do paradigma OO e depois foram introduzidos temas b-sicos como objeto (que representa atravs de cdigo qualquer coisa do mundo real) e classes (que so os moldes para a construo dos

  • Programao de Computadores II46

    objetos). Alm de uma apresentao de importantes conceitos: en-capsulamento, herana e polimorfismo.

    O contedo seguinte foi o responsvel por explorar profundamente os temas objetos e classes, sendo mencionado a sua organizao em pacotes (responsveis pela organizao fsica e lgica das classes), explicando o funcionamento atravs de trechos de cdigos, alm de abordarmos das classes Wrappers (que simulam os tipos primitivos).

    E no ltimo contedo, 1.4, acabamos de explorar os atributos e mto-dos de uma classe, sem deixar de citar os nveis de acesso (pblico, protegido e privado), encapsulamento (proteo da informao) e sobrecarga de mtodos.

    Agora que fizemos este passeio introdutrio no mundo orientado a objetos, chegou o momento do aperfeioamento, prepare-se para uma tima leitura sobre herana na linguagem Java.

  • 2 HeranaNesta segunda parte do curso veremos o conceito de herana

    do paradigma de orientao a objetos. A utilizao de herana possui algumas particularidades que at ento no vimos em outras partes do curso. Uma dessas particularidades a reutilizao de classes. Aqui veremos o conceito do que uma herana, qual a diferena entre membros de instncia e membros de classe, entre outros.

  • Programao de Computadores II48

    2.1 Construtores e o Gerenciamento da Memria

    Os construtores so utilizados para realizar a inicializao do objeto.

    Todas as vezes que utilizamos a palavra reservada new, esta-mos criando na memria uma nova instncia do objeto. neste mo-mento que os construtores das classes so executados.

    Como j estamos acostumados a escrever mtodos, devemos ter cuidado para no visualizar um construtor como um mtodo. Um construtor no deve ser considerado um mtodo, isto porque o cons-trutor s pode ser invocado quando o objeto est sendo criado, diferentemente dos mtodos, que podem ser invocados a qualquer momento.

    Os construtores podem ser criados em qualquer regio da clas-se. Porm, obrigatoriamente o construtor deve possuir o mesmo nome que o nome da classe. Por exemplo, se a classe possui o nome Carro, o construtor deve-se chamar Carro. A sintaxe de um construtor deve seguir a seguinte regra:

    ( [] ) { [];}

    Voc deve estar atento sintaxe apresentada. O modificador indica o nvel de visibilidade que este construtor ir possuir, podendo ser private, public ou protected. J o nome do construtor, como dito anteriormente, deve ter o mesmo nome da classe que est sendo criada. E por ltimo temos a lista de parmetros que pode ser op-cional.

    Existem algumas diferentes formas de utilizar os construtores. A primeira forma a padro, onde nenhum argumento passado como parmetro. Na linguagem Java, caso nenhum construtor seja criado, automaticamente criado o construtor padro, sem nenhum parmetro. O construtor padro indica que o objeto ser iniciali-zado sem nenhum valor, ou seja, todos os atributos que o objeto possui so inicializados com seus valores padres. Vamos analisar a seguinte classe:

  • 49Tema 2 | Herana

    2public class Computador{ private String marca; private int qtdMemoria; private int qtdDisco; }

    Para esta situao, ao iniciarmos o objeto computador, atravs do seu construtor padro, todas as variveis da classe sero iniciadas com o valor padro. No caso da String o valor padro ser zero. J para as variveis do tipo int, o valor padro ser zero. Vamos a um exemplo de chamada a um construtor.

    Computator computador = new Computador();

    Neste momento estamos realizando a chamada ao construtor padro criado pelo Java. Porm, podemos criar construtores padro-nizados de acordo com a nossa necessidade. Por exemplo, digamos que todos os computadores quando criados, deve ser informada qual sua marca. Nesta situao devemos criar um construtor que receba como parmetro uma varivel do tipo String para que possamos ini-ciar o atributo marca que possumos. A partir deste momento nossa classe vai possuir a seguinte configurao:

    public class Computador{ private String marca; private int qtdMemoria; private int qtdDisco;

    public Computador (String pMarca) { this.marca = pMarca; }}

    Nesta situao, estamos passando um parmetro denominado de pMarca. Este parmetro vai ser responsvel por iniciar um objeto Computador com o atributo Marca j pr-definido. Automaticamente

  • Programao de Computadores II50

    quando criamos um construtor, o construtor padro que antes era criado pelo Java, deixa de existir. Ento, a partir deste momento, toda vez que formos iniciar um objeto atravs do seu construtor devemos passar como parmetro deste novo construtor criado. A chamada ao construtor agora ser feita da seguinte maneira:

    Computador computador = new Computador(CCE);

    Perceba que agora estamos passando a String CCE como par-metro do construtor. Isto indica que o atributo Marca, ao ser iniciado automaticamente j vai ter o valor CCE. Este valor pode ou no ser alterado. Isto vai depender se foi criado o mtodo set deste atributo.

    Porm, isto no quer dizer que todas as vezes que formos criar construtores devemos passar no mnimo um parmetro. Podemos criar um construtor igual ao construtor padro que criado pelo Java. Mas, para que vamos precisar criar um construtor sem parmetros?

    Em algumas situaes precisamos criar o objeto com valores predefinidos. Vamos imaginar a seguinte situao. No objeto compu-tador, caso no seja informado, todos os computadores devem ter como valores bsicos 512 de memria e 500 de disco. Ento podera-mos criar um construtor com as seguintes caractersticas:

    public class Computador{ private String marca; private int qtdMemoria; private int qtdDisco;

    public Computador () { this.qtdMemoria = 512; this.qtdDisco = 500; }}

    Nesta situao deveremos chamar o construtor da forma pa-dro, deixando a responsabilidade de iniciar os valores do atributo de acordo com o que foi definido.

  • 51Tema 2 | Herana

    Computador computador = new Computador();

    Quando formos usar este objeto computador que acabamos de criar, os atributos qtdMemoria e qtdDisco j tero seus valores que foram predefinidos, porm, nada impede que estes valores sejam modificados.

    Podemos, tambm, dentro de uma nica classe, possuirmos mais de um construtor. Isto indica que, dependendo da situao, podemos inicializar o objeto de maneira diferente. Quando em uma classe tiver-mos mais de um construtor, o compilador vai conseguir identificar di-ferentes construtores de acordo com os parmetros que esto sendo utilizados, seja pela quantidade de parmetros ou pelos tipos dos pa-rmetros. Vamos analisar a nossa classe Computador. Vamos colocar um construtor que no recebe nenhum parmetro e outro construtor que recebe a marca do objeto computador que est sendo criado.

    public class Computador{ private String marca; private int qtdMemoria; private int qtdDisco;

    public Computador () { this.qtdMemoria = 512; this.qtdDisco = 500; }

    public Computador (String pMarca) { this.marca = pMarca; }}

    Quando formos criar o objeto Computador poderemos chamar qualquer um dos dois construtores. Por exemplo:

    Computador computadorEscritorio = new Computador();Computador compudatorSala = new Computador(HP);

  • Programao de Computadores II52

    Nesta situao temos dois objetos com valores de atributos diferentes. O objeto computadorEscritorio no possui um valor especfico para a marca, isto porque o construtor que foi utilizado foi o construtor sem parmetros. Este construtor ir apenas alterar o valor dos atributos qtdMemoria e qtdDisco. J o objeto computadorSala ter apenas o valor da marca atribudo e seus outros dois parmetros com o valor padro, que neste caso ser zero.

    Apesar de os construtores no serem considerados mtodos, podemos realizar a chamada de um construtor para outro, ou seja, um construtor pode realizar apenas uma tarefa e realizar a chamada a outro construtor j existente.

    public class Computador{ private String marca; private int qtdMemoria; private int qtdDisco;

    public Computador () { this.qtdMemoria = 512; this.qtdDisco = 500; }

    public Computador (String pMarca) { this.marca = pMarca; this(); }}

    Nesta situao, podemos continuar utilizando os dois constru-tores. Porm, quando utilizarmos o construtor que possui um par-metro, automaticamente o construtor que no possui parmetros ser invocado. Isto porque, a referncia this indica que estamos invocando um construtor, neste caso sem parmetros.

    Para esta construo de nossa classe, quando criarmos o ob-jeto computador utilizando apenas o construtor que possui um par-metro, estaremos atribuindo todos os valores ao objeto, isto porque um construtor realizou a chamada ao outro.

  • 53Tema 2 | Herana

    Toda vez que estamos criando um objeto especfico, estamos alocando espao em memria para armazenar as informaes dos objetos criados. Com isso, em determinados momentos podemos alocar espao de memria desnecessariamente. Para solucionar este problema o Java possui ferramentas para realizar o gerenciamento de memria.

    A JVM (Java Virtual Machine) possui um mecanismo de coleta de lixo (garbage collector). Esta coleta consiste em realizar a reciclagem de memria no mais utilizada. Esta reciclagem realizada atravs de um algoritmo especfico.

    Este algoritmo realiza a busca de objetos que no podem ser mais alcanados. O algoritmo executado sem que os programadores percebam que ele est sendo executado. O tempo de execuo de uma aplicao interferido diretamente pelo coletor de lixo. Isto por-que o coletor precisa a todo o momento estar realizando a verificao de objetos no mais utilizados.

    INDICAO DE LEITURA COMPLEMENTAR

    DEITEL, P.J.; DEITEL, H. M.. Java Como Programar. 8. ed. So Paulo: Pearson Education do Brasil, 2010.

    Leia o captulo 3, pginas 68 e 69. No trecho deste livro podero ser encontrados exemplos de diversas maneiras de se utilizar os cons-trutores. O livro tambm demonstra, com figuras, como funciona o gerenciamento de memria para as instncias das classes.

    CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus, 2005.

    No captulo 3 do livro podemos encontrar na pgina 39 a importn-cia do gerenciamento de memria quando estamos trabalhando com Objetos. Na mesma pgina temos ainda uma explicao de como funcionam os construtores dos objetos.

  • Programao de Computadores II54

    PARA REFLETIR

    O gerenciamento de memria algo muito importante dentro do con-ceito de herana, j que podemos estar criando objetos sem a real necessidade de utilizao. Discuta com seus colegas de turma como devem ser criados objetos que realmente sejam necessrios, podendo tambm discutir como o funcionamento do coletor automtico de lixo (garbage collector).

    2.2 Membros de Instncia X Membros de Classe

    Os membros de instncia de uma classe so totalmente diferen-tes dos membros de uma classe.

    Quando falamos de membros, estamos falando dos atributos e mtodos que esta classe possui.

    Vamos comear falando sobre os membros de uma instncia. Os membros deste tipo s podem ser acessados atravs de uma ins-tncia de uma determinada classe, ou seja, precisamos primeiro criar um novo objeto da classe que queremos acessar os membros.

    Todos os atributos e mtodos s podero ser acessados quando estivermos trabalhando com um objeto em memria. importante ve-rificar que quando a instncia de um objeto deixa de existir, automati-camente todos os seus mtodos e atributos tambm deixam de existir. Vamos a um exemplo:

  • 55Tema 2 | Herana

    public class Computador{ private int qtdMemoria; private int qtdDisco;

    public Computador (int pQtdMemoria, int pDisco) { this.qtdMemoria = pQtdMemoria; this.qtdDisco = pDisco; } public void AdicionarMemoria(int pQntMemoria) { this.qtdMemoria = this.qtdMemoria + pQnt-Memoria; }}

    Agora vamos criar um objeto do tipo Computador e vamos ma-nipular os seus mtodos e seus atributos.

    Computador computador = new Computador(512,500);computador. AdicionarMemoria(512);

    No exemplo acima, criamos um objeto computador. No momen-to de sua criao o computador foi criado com 512 de memria e 500 de disco rgido. Esses valores s sero vlidos para o objeto compu-tador que foi criado. Quando adicionamos um valor memria do computador, teremos o mesmo comportamento descrito. A adio de memria ao computador s ser vlida para este objeto.

    Quando criarmos um novo objeto, automaticamente os valores que esto armazenados no objeto anterior deixam de existir e novos valores so assumidos. Vamos a um exemplo:

    Computador computadorSala = new Computador(1024,160);

    Neste segundo caso, os valores que so atribudos ao computa-dor so de 1024 de memria e de 160 de disco. Ou seja, dois valores diferentes para duas instncias tambm diferentes.

  • Programao de Computadores II56

    Sendo assim, os membros de instncia, sejam os atributos ou os mtodos, s vo existir quando houver um objeto instanciando determinada classe, e automaticamente deixam de existir quando estes objetos no estiverem mais em memria.

    J os membros de classe possuem uma caracterstica bem di-ferente dos de instncia. Todos os membros de classe so tambm conhecidos como membros estticos.

    No Java os membros estticos so representados pela palavra reservada static. atravs desta palavra reservada que indicamos para o compilador que estamos criando um membro esttico.

    Este tipo de membro nunca ir pertencer a uma instncia de uma classe. Ele sempre estar ligado diretamente a uma classe.

    Toda vez que criarmos uma classe, mesmo que ela no seja instanciada, todos os membros estticos so os primeiros a serem carregados. Vamos incluir, na classe de computador, um atributo es-ttico que vai representar um membro de classe para o computador.

    public class Computador{ private int qtdMemoria;private int qtdDisco; private static int qtdComputadores; public Computador (int pQtdMemoria, int pDisco) { this.qtdMemoria = pQtdMemoria; this.qtdDisco = pDisco; }}

    Podemos ver que agora existe um atributo esttico dentro da classe, o atributo qtdComputadores. Este atributo vai pertencer a toda a classe, no mais a alguma instncia especfica. Quando preci-samos utilizar a varivel esttica, no precisamos mais declarar uma

    varivel do tipo da classe nem criar um novo objeto. Basta apenas chamar o atributo diretamente da classe. Por exemplo:

    Computador.qtdComputadores++;

  • 57Tema 2 | Herana

    No exemplo anterior, estamos apenas aumentando a quanti-dade de computadores. Se analisarmos a situao acima, podemos perceber que, apesar de no termos nenhum objeto criado, pode-mos manipular a quantidade de computadores. Precisamos, ento, de muita ateno quando formos utilizar este tipo de atributo.

    Como o atributo estar presente durante todo o ciclo de vida da classe, as variveis estticas tambm estaro presentes e manten-do o seu valor.

    Assim como os atributos de uma classe, ns podemos ter os mtodos estticos. Estes mtodos iro funcionar da mesma maneira que os atributos, ou seja, vo existir sem a dependncia de uma instncia de uma classe. Porm, importante lembrar que quando temos um mtodo esttico no iremos sobrescrever este mtodo na subclasse, iremos ver o conceito de subclasse no tpico de hierar-quia. Caso, na subclasse, formos usar o mesmo mtodo esttico, teremos que redefinir este mtodo.

    Para utilizar um mtodo como esttico, precisamos colocar a palavra reservada static logo aps o modificador de visibilidade. Por exemplo, iremos colocar o mtodo esttico na classe computador.

    public class Computador{ private int qtdMemoria; private int qtdDisco; private static int qtdComputadores; public Computador (int pQtdMemoria, int pDisco) { this.qtdMemoria = pQtdMemoria; this.qtdDisco = pDisco; } public static void Imprimir() { System.out.Println(Quantidade de com-putadores cadastrados: + qtdComputadores); }}

  • Programao de Computadores II58

    Da mesma maneira que os atributos de classe so utilizados sem ser necessrio instanciar uma classe. Porm, importante obser-var que em mtodos estticos s podemos utilizar atributos tambm estticos.

    Isto faz sentido, j que os membros de instncia s existem quando possumos uma instncia da classe em memria. Neste caso, se usamos o mtodo imprimir diretamente da classe como no exem-plo abaixo, poderamos tentar imprimir alguma varivel de uma ins-tncia, sendo que esta instncia ainda no existe.

    Computador computador = new Computador(512,160);Computador.qtdComputadores++;Computador.Imprimir( );

    Da mesma maneira que no podemos utilizar os atributos no estticos, ou seja, de instncia de uma classe, tambm no podemos utilizar a palavra reserva this. Vale lembrar que esta palavra reservada utilizada para fazer algum tipo de referncia a uma classe instanciada.

    importante tambm perceber que, quando possuirmos uma instncia de uma classe iremos conseguir utilizar os mtodos estticos.

    Computador computador = new Computador(512,160);computador.Imprimir();

    Apesar deste tipo de chamada ser possvel, ou seja, no possuir um erro de sintaxe, no devemos utiliz-lo. Isto porque se criamos um mtodo ou atributo esttico ns devemos acess-lo de forma esttica. Quando falamos de acessar de forma esttica estamos querendo dizer em acess-lo diretamente atravs da classe e no de uma instncia.

    Na linguagem Java ainda podemos criar um tipo de atributo que depois de iniciado no pode ter seu valor alterado. Este tipo de atributo pode ser tanto um membro de classe como um mem-bro de instncia. Estes atributos so tambm conhecidos como constantes. Este tipo de atributo vai ser representado atravs da palavra reservada final.

  • 59Tema 2 | Herana

    Vamos ao primeiro exemplo utilizando um membro de instncia. Neste exemplo, a varivel ser inicializada no construtor do objeto.

    public class Computador{ private static int qtdComputadores; private final int qtdMaxComputadores; public Computador (int pQtdMemoria, int pDisco) { this.qtdMaxComputadores = 10 this.qtdMemoria = pQtdMemoria; this.qtdDisco = pDisco; }}

    Neste exemplo, aps iniciado o objeto, a varivel qtdMax-Computadores ir ser inicializada com o valor 10 (dez) e no poder ter seu valor alterado durante o ciclo de vida deste objeto. A inicia-lizao do atributo deve, obrigatoriamente, ser realizada dentro do construtor da classe. Para utilizarmos este atributo iremos primeiro instanciar um objeto para depois utiliz-lo.

    Computador computador = new Computador(512,160);System.out.println(Quantidade mxima de computadores:, compu-tador.qtdMaxComputadores);

    Porm, ainda podemos criar os atributos estticos. Neste caso o valor do atributo informado na sua declarao e no pode ter seu valor alterado em nenhum mtodo da classe. Vamos a um exemplo.

    public class Computador{ private static int qtdComputadores; private static final int qtdMaxComputadores = 10; public Computador (int pQtdMemoria, int pDisco) { this.qtdMemoria = pQtdMemoria; this.qtdDisco = pDisco; }}

  • Programao de Computadores II60

    Neste exemplo, o valor do atributo qtdMaxComputadores j est sendo inicializado com o valor 10 (dez) e em nenhum momento pode ter seu valor alterado. Como todos os outros atributos de classe o atri-buto final esttico pode ser acessado diretamente da classe sem a ne-cessidade de uma nova instncia. Vamos demonstrar com um exemplo:

    System.out.println(Quantidade mxima de computadores:, Computador.qtdMaxComputadores);

    Neste exemplo estamos acessando diretamente o atributo qtd-MaxComputadores da classe computador. Lembrando que esse valor vai estar presente at o momento em que o coletor de lixo do Java retire a classe da memria.

    importante entender que no Java apenas os mtodos e os atributos podem ser estticos. No possvel declarar uma classe como esttica.

    INDICAO DE LEITURA COMPLEMENTAR

    DEITEL, P.J.; DEITEL, H. M. Java Como Programar. 8. ed. So Paulo: Pearson Education do Brasil, 2010.

    Para aumentar seu conhecimento sobre os membros de classe e de instncia, estude as pginas 262 e 263 do captulo 8.Neste trecho do livro, Deitel apresenta as diferenas na utilizao dos membros de instncia para os membros de classes. O trecho tambm exemplifica as diferenas entre os dois tipos de membros.

    CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus, 2005.

    Os autores demonstram, no captulo 6, nas pginas 99 e 100, os con-ceitos de membros de classe. Na pgina 99 demonstrado um exem-plo para que seja visto como devemos utilizar variveis de classe.

  • 61Tema 2 | Herana

    PARA REFLETIR

    A partir deste momento, comeamos a perceber que existem diferen-tes tipos de criao de variveis, sendo que estas vo depender de como estamos as declarando. Devemos ento construir atributos de classes e de instncia de acordo com a nossa necessidade, sempre tomando cuidado na sua utilizao.

    2.3 Herana no Java

    Um dos principais objetivos do paradigma da Orientao a Obje-tos se refere reutilizao dos objetos. A herana um dos principais conceitos de reutilizao. Com herana podemos criar subclasses que herdem caractersticas e comportamento de superclasses.

    Em determinadas situaes, precisamos criar objetos com algu-mas caractersticas especficas e com outras caractersticas comuns a outros objetos. Vamos a um exemplo para demonstrar o que est sen-do comentado. Por exemplo, digamos que ns possumos uma classe Funcionrio, sendo que este funcionrio tem as seguinte caractersticas.

    public class Funcionario{ private int idade; private String nome;

    public Funcionario(int pIdade, String pNome) { this.idade = pIdade; this.nome = pNome; } public void imprimir() { System.out.println(Funcionrio: + nome + + idade); }}

  • Programao de Computadores II62

    Vamos agora seguinte situao. A minha empresa tem em seu quadro funcional vrios funcionrios, entre eles mdicos, enfermeiros e engenheiros. Se analisarmos as informaes que precisamos arma-zenar dos funcionrios podemos perceber que alguns atributos sero iguais para todos eles, independentemente da atividade que eles realizam, sendo essas caractersticas (idade, nome). Porm, no caso do mdico precisamos informar qual o numero do CRM (Conselho Regional de Medicina), o do enfermeiro necessrio o nmero do CO-REN (Conselho Regional de Enfermagem) e o nmero do CREA (Conse-lho Regional de Engenharia, Arquitetura e Agronomia) do engenheiro.

    Para informar todas estas caractersticas, seria necessrio que crissemos um atributo para cada uma dessas novas informaes. Porm, sempre teramos atributos desnecessrios, ou seja, quando criamos um objeto mdico no vamos ter informaes de enfermeiros e engenheiros.

    Com o intuito de no acontecer este problema, o paradigma orientado a objetos possui uma capacidade denominada de herana.

    O conceito de herana est diretamente ligada ao conceito de reutilizao. Ou seja, um objeto genrico pode ser utilizado por um objeto mais especializado. Este, por vez, herda todas as caractersti-cas do objeto genrico e acrescenta mais atributos ou mtodos.

    Na orientao a objetos a classe genrica conhecida como superclasse e a classe especializada conhecida como subclasse. No nosso exemplo, a classe Funcionrio considerada a superclasse, en-quanto uma outra classe a ser criada, por exemplo, a classe Mdico, ser considerada a subclasse.

    Na herana, uma superclasse pode possuir vrias subclasses. Porm, uma subclasse pode somente possuir uma superclasse. Na lin-guagem Java no permitido heranas mltiplas, ou seja, uma classe herdar comportamentos de mais de uma classe. Para simular herana mltipla podemos utilizar as interfaces. O conceito de interfaces ser visto no prximo tema.

    O conceito de herana ainda permite que uma subclasse seja uma superclasse de uma terceira classe. Ou seja, podemos ter uma herana de uma classe filha. Todos os mtodos e atributos que a subclasse herda da superclasse tambm so herdados da superclasse referente.

  • 63Tema 2 | Herana

    No Java, para indicarmos que uma classe herda da outra usamos a palavra reservada extends. Ou seja, uma classe estende o compor-tamento da outra. A sintaxe para que seja utilizada a herana a seguinte:

    class extends { // definio da classe}

    Vamos agora criar uma classe Mdico, que herda da classe funcionrio.

    public class Medico extends Funcionario{ private String CRM;}

    Na classe Medico ns teremos todos os atributos relativos ao mdico juntamente com os atributos que j existem na classe Funcio-nario. Podemos ento dizer que a classe Medico uma especializao da classe Funcionario, ou seja, Medico um Funcionario. Toda vez que estivermos utilizando a herana vamos ter esta relao X um Y. Para nosso exemplo, Mdico um Funcionrio.

    Com isso todas as informaes (atributos e mtodos) que j existiam no funcionrio podero ser utilizadas pela classe mdico. Sendo assim, quando instanciarmos uma classe do tipo Medico, te-remos uma classe com os atributos bsicos de um funcionrio com adio do atributo CRM.

    Para que a subclasse consiga utilizar todos os mtodos e atri-butos da superclasse, necessrio que os membros da superclasse possuam modificadores de visibilidade que permitam a utilizao, embora eles sejam herdados.

    Por exemplo, a superclasse Funcionrio tem seus atributos como private. Automaticamente a subclasse no ter acesso aos mtodos e atributos. Isto faz sentido. Se as subclasses pudessem modificar os atributos estaramos ferindo o princpio do encapsulamento.

    Como as subclasses herdam o comportamento das superclasses, todos os mtodos e atributos definidos na superclasse podero ser

  • Programao de Computadores II64

    utilizados na subclasse. A herana ainda permite que as subclasses modifiquem o comportamento do que foi determinado na superclasse.

    Atravs da herana podemos criar um mtodo com uma funcio-nalidade diferente da superclasse. Mesmo que este mtodo possua o mesmo nome, tipo de retorno e lista de parmetros.

    Quando isto acontece dizemos que o novo mtodo sobrescreve (override) o mtodo da superclasse. Vamos demonstrar um exemplo atravs da classe Medico. Iremos sobrescrever o mtodo imprimir para que possa ser impresso o CRM do mdico.

    public class Medico extends Funcionario{ private String CRM;

    public void imprimir() { System.out.println(Mdico: + nome + CRM:+ this.CRM); }}

    Desta forma, o mtodo imprimir() ser invocado dependendo de sua instncia. Ou seja, vai depender do objeto que esteja invo-cando o mtodo imprimir. Vamos demonstrar isto atravs de um exemplo.

    Funcionario e = new Funcionario(35,Joo); e.imprimir(); //mtodo imprimir de Funcionario Medico m = new Medico(); m.imprimir(); //mtodo imprimir de Mdico

    Quando instanciamos a classe funcionrio o objeto que chama o mtodo imprimir vai imprimir as informaes genricas do funcio-nrio. Quando criamos o objeto Medico, como esta classe herda de Funcionario, mas sobrescreve o mtodo imprimir(), o que ser impres-so ser as informaes do Medico, ignorando todas as definies do mtodo imprimir() do Funcionario.

    Porm, para realizar a sobrecarga dos mtodos herdados, algu-mas regras devem ser seguidas. Sendo elas:

  • 65Tema 2 | Herana

    O tipo de retorno deve ser exatamente o mesmo;

    A lista de parmetros deve ser igual;

    O mtodo da subclasse no pode ser menos acessvel que o mtodo da superclasse.

    Quando falamos menos acessveis, estamos falando dos modi-ficadores de visibilidade. Ou seja, caso a subclasse esteja herdando de um mtodo public, o mtodo que est sobrescrevendo no pode ser nem private nem protected.

    A herana ainda permite que, alm de sobrescrever os mto-dos, ns possamos nos referir a atributos e mtodos da superclasse. Para realizar esta referncia, utilizamos a palavra reservada super. Para realizar uma chamada a um mtodo da superclasse devemos fazer o seguinte:

    Super.mtodo( )

    Vamos modificar a classe Medico para a utilizao da referncia super.

    public class Medico extends Funcionario{ private String CRM;

    public Medico (String pCRM, String pNome, int pIdade) { this.CRM = pCRM; super(pIdade, pNome); } public void imprimir() { System.out.println(Mdico: + nome + CRM:+ this.CRM); } }

  • Programao de Computadores II66

    No exemplo acima estamos utilizando o mtodo super para rea-proveitar o que foi definido no construtor da classe Funcionario. Com isso, no precisamos reescrever todas as definies do Medico. Basta apenas definir o que foi acrescentado na herana e realizar a chamada ao construtor que possui a mesma caracterstica.

    A chamada ao mtodo continua sendo realizada da mesma ma-neira. Por exemplo, como agora definimos um construtor para a clas-se mdico, quando formos instanciar um objeto deste tipo faremos da seguinte maneira:

    Medico m = new Medico(3245, Pedro, 35);m.imprimir();

    No exemplo apresentado, o construtor da classe Medico ir de-finir o atributo CRM e ir invocar o construtor da classe Funcionrio para que os outro dois atributos (nome e idade) sejam iniciados.

    Apesar de opcional, podemos indicar ao compilador que esta-mos realizando uma sobrescrita de um mtodo. Atravs da diretiva @Override ns conseguimos garantir, em tempo de compilao, que o mtodo que estamos criando uma sobrescrita de um mtodo da superclasse.

    public class Medico extends Funcionario{ private String CRM;

    public Medico (String pCRM, String pNome, int pIdade) { this.CRM = pCRM; super(pIdade, pNome); } @Override public void imprimir() { System.out.println(Mdico: + nome + CRM:+ this.CRM); } }

  • 67Tema 2 | Herana

    Com a herana podemos ainda utilizar membros de instncias. Este tipo de membro deve ser declarado na superclasse. Com isso podemos garantir que, se o valor for alterado na superclasse, todas as classes que herdam desta superclasse tambm herdam as caracte-rsticas da superclasse.

    INDICAO DE LEITURA COMPLEMENTAR

    DEITEL, P.J.; DEITEL, H. M.. Java Como Programar. 8. ed. So Paulo: Pearson Education do Brasil, 2010.

    Faa uma leitura no captulo 9, especialmente nas pginas 279 a 297, onde podero ser encontrados vrios exemplos do conceito de herana.

    Neste captulo do livro, Deitel apresenta, por meio de exemplos, a hierarquia dos objetos do Java API. Alm de descrever boas prticas de utilizao da coleo.

    CADENHEAD, R. ; LEMAY, L. Java 2. 4. ed. So Paulo: Editora Campus, 2005.

    No captulo 1, especialmente nas pginas 13 a 16, os autores demons-tram como podemos utilizar, na Orientao a Objetos as heranas e he-ranas mltiplas, ou seja, como so realizadas as hierarquia de heranas.

    PARA REFLETIR

    Com a utilizao da herana podemos perceber que, quando utilizada de maneira correta e bem modularizada, a herana nos traz uma pro-dutividade maior. Isto porque podemos reutilizar bastante as classes que j foram criadas anteriormente. Reflita com o tutor e com os seus colegas sobre o assunto.

  • Programao de Computadores II68

    2.4 A classe Object

    Depois de demonstrar como funciona a herana, vamos falar um pouco sobre a classe Object. Esta classe faz parte do pacote java.lang. Este o pacote bsico da linguagem Java e neste pacote que esto contidas as classes String e System. Se observarmos, nunca precisamos importar este pacote, isto porque ele automaticamente importado e o nico pacote que possui