Você está na página 1de 31

APOSTILA:

PROGRAMAO ORIENTADA

OBJETOS

COM

JAVA VERSO ALUNOS

AUTOR:

Carlos Eduardo Andrio


Esta obra est licenciada sob uma Licena Creative Commons (http://creativecommons.org/licenses/by-nc-sa/2.5/br/)

Creative Commons License Deed Atribuio-Uso No-Comercial-Compatilhamento pela mesma licena 2.5 Brasil

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 1 - Introduo

Introduo
Atualmente o paradigma orientado a objetos tem-se tornado uma importante ferramenta para o desenvolvimento de sistemas computacionais complexos. Seu uso tem aumentado a qualidade dos sistemas, podendo destacar a reusabilidade, a manutenibilidade e, alm disso, de fcil modelagem fazendo uso da notao UML muito difundida atualmente. Java uma poderosa linguagem de programao divertida para os iniciantes e poderosssima para programadores experientes. Esta apostila tem o intuito de inserir no mundo Java programadores que ainda no o conhece alm de aprofundar os conceitos bsicos de quem o conhece superficialmente. Desde o princpio em todos os exemplos sero usadas a notao e as boas prticas recomendadas pela prpria Sun. Os conceitos de Orientao a Objetos sero inseridos de forma gradual acompanhando a evoluo do curso na linguagem. Este curso baseado na nova verso do Standard Java, J2SE 6.0, tratando de seus novos conceitos e funcionalidades que sero apresentados tambm gradualmente. Ainda no primeiro captulo sero tratados os conceitos bsicos de Linguagens de Programao formando uma base slida para a continuao do curso, a histria do Java e a sua arquitetura. Alm dos conceitos o primeiro captulo tambm contm uma apresentao dos recursos necessrios para o desenvolvimento do curso com suas respectivas instalaes e configuraes. Nos captulos posteriores os conceitos fundamentais da linguagem e de Orientao a Objetos sero inseridos de forma clara e aprofundada. Para melhor aproveitamento do curso desejvel que o aluno tenha conhecimento de alguma linguagem de programao estruturada como C ou Pascal. Se aluno j conhecer alguma linguagem Orientada a Objetos como Delphi, C++, C# ou outra poder tambm estabelecer uma relao forte entre estas linguagens e Java, principalmente com C++ e C#. J no segundo captulo sero usadas interfaces grficas simples para o aprendizado da linguagem. Isso considerado arriscado por alguns, mas tem-se mostrado eficaz em aumentar o interesse dos alunos que querem ir direto ao que interessa. Com isso pretende-se usar uma mescla de conceitos e prtica fazendo com que o curso seja atraente e conciso.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Classes e Objetos
O filsofo Descartes (Sculo XVII) j dizia que os seres humanos vem o mundo em termos de objetos e seus relacionamentos. Uma fcil constatao disso tentar elaborar uma lista de objetos e uma lista de no objetos e verificar que a lista de objetos flui muito mais facilmente em nosso crebro. Alm disso, s no fato de se pensar em no-objetos j os aproxima de objetos por torn-los coisas palpveis e com caractersticas prprias. A Programao Orientada a Objetos (POO) tem o intuito de facilitar a modelagem de sistemas de informao por aproxim-la com o que as pessoas vem no mundo real. Por sua vez os computadores lidam com processos, ou seja, uma entrada de dados processada gerando uma nova sada de dados. As linguagens procedurais obrigam os programadores a transformarem a viso do mundo real (objetos) em uma viso de computador (processos), tornando a tarefa de modelagem de um sistema mais complexa. Com isso, a POO fornece um mecanismo de abstrao com uma ligao estreita ao mundo real. O nvel de abstrao inversamente relacionado com o nvel de detalhamento para descrever alguma coisa, ou seja, quanto maior o nvel de abstrao menor a descrio do problema mais simples. Por exemplo: A ao ligar um carro pode ser implementada como enviar uma corrente eltrica ao motor de arranque, rodar a bomba de combustvel e injetar no motor, o motor de passos deve manter a marcha lenta a ponto que o motor no morra. Aumentando o nvel de abstrao, ligar um carro pode ser implementada como virar a chave do arranque.

1.1.Atributos e Mtodos
Um objeto possui caractersticas e comportamentos. Por exemplo, um carro pode possuir as caractersticas: cor, quantidade de portas, tamanho, peso, etc. E pode ter alguns comportamentos: ligar, acelerar, virar, frear, etc. Na Orientao a Objetos as caractersticas so nominadas de Atributos e os comportamentos de Mtodos ou Operaes. Com isso, um objeto carro poderia ser modelado de acordo com seus atributos e mtodos. Mas qual a diferena entre uma classe e um objeto? Uma classe o projeto de um objeto, ou ainda, objetos so instncias (entidades concretas e nicas) de uma classe. Outra definio que pode ser dada que a classe o tipo do objeto, da mesma forma que variveis tem tipos. A UML define uma forma grfica de representar uma classe. No exemplo do carro o desenho da classe Carro pode ser vista na Figura 3.1 utilizando a notao definida pela UML, onde no primeiro compartimento fica o nome da classe, no segundo compartimento os atributos e no terceiro os mtodos.

Figura 3.1 Classe Carro A classe carro o projeto de objetos do tipo carro, ou seja, todos os objetos criados do tipo carro devem ter como atributos cor, quantidadePortas e status; alm dos mtodos ligar e desligar. Nota-se tambm que foram usadas as convenes de nomes para o nome da classe e tambm para o nome dos atributos e mtodos. Nesta classe o status representa o estado do carro ligado ou desligado. Cada atributo tambm deve conter um tipo, assim como cada mtodo deve conter um tipo de retorno. A Figura 3.2 mostra a modelagem da classe Carro com os tipos dos atributos e os tipos de retorno dos mtodos. Lembrando que o tipo de retorno void indica que o mtodo no retorna nada.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Figura 3.2 Classe Carro com os tipo de atributos e retorno de mtodos A implementao dessa classe na linguagem Java apresentada Figura 3.3.

Figura 3.3 Classe Carro implementada Os atributos so definidos dentro da classe e fora dos mtodos. Qualquer mtodo dentro dessa classe tem acesso a esses atributos. Os mtodos so definidos dentro da classe e, por conveno, logo aps a definio dos atributos. Nas linhas 3, 4 e 5, os atributos so definidos de acordo com seus tipos. Os mtodo ligar (linha 8) e desligar (linha 11) alteram o valor do atributo status. Como j foi dito este apenas o projeto da classe Carro e, por enquanto, ainda no temos nenhum carro criado.

1.2.Utilizando Classes na Prtica


Um programa em Java sempre comea a ser executado de um mtodo main. A Figura 3.4 apresenta uma classe Principal com um main que utiliza a classe Carro previamente criada.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Figura 3.4 Classe Principal utilizando a classe Carro A declarao de um objeto do tipo Carro feita na linha 4 da mesma forma que se declara uma varivel de um tipo primitivo, porm nesse ponto apenas indicado que carro1 existe e do tipo Carro. Para efetivamente alocar espao na memria, ou seja, instanciar, necessrio utilizar o operador new como na linha 6. Como carro1 do tipo Carro e uma classe Carro define um projeto para os objetos desse tipo, carro1 possuir os atributos e os mtodos definidos na classe Carro. Para acessar esses atributos e mtodos utiliza-se o caractere . ponto. Ento, nas linhas 9, 10 e 11, os atributos de carro1 esto sendo preenchidos cor e quantidadePortas diretamente e status atravs do mtodo ligar. Obs.: O preenchimento do status poderia ser feito tambm da forma: carro1.status = true; A declarao e instanciao de um objeto pode ser feito em uma mesma expresso, como foi feito com o objeto carro2 na linha 14. Nas linhas 17, 18 e 19 os atributos de carro2 foram preenchidos. Das linhas 22 32 os atributos de carro1 e carro2 so impressos, conforme a Figura 3.5.

Figura 3.5 Impresso das caractersticas de carro1 e carro2. Quando um programa constitudo de diversas classes, todas elas devem ser compiladas seguindo a ordem de independncia, ou seja, compilar as classes que no usam nenhuma outra classe, posteriormente compilar classes que s usam as que j foram compiladas e assim por diante. No exemplo anterior a compilao e execuo seria feita conforme a Figura 3.6.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Figura 3.6 Execuo de Programa com duas classes.

1.3.Construtores e Sobrecarga de Mtodos


Na classe Principal (Figura 3.4) os atributos dos objetos carro1 e carro2 foram inicializados um a um. Um novo mtodo de inicializao poderia ser definido na classe Carro, onde os valores dos atributos fossem passados como parmetros e todos fossem inicializados ao mesmo tempo, conforme a Figura 3.7.

Figura 3.7 Classe Carro com mtodo Incializar O mtodo inicializar recebe trs parmetros contendo a cor, a quantidade de portas e o status do carro. Como os parmetros tm o mesmo nome dos atributos, para fazer referncia aos atributos necessrio utilizar o this, que faz uma referncia instncia prprio objeto, ou seja, this.cor faz referncia ao atributo cor do objeto (o this) do tipo Carro que chamar o mtodo, enquanto que apenas cor faz referncia ao parmetro. Na classe principal bastaria chamar o mtodo inicializar passando os parmetros para atribuir todos os valores, conforme a Figura 3.8, onde ao chamar o mtodo carro1.inicializar o this.cor na classe Carro faz referncia carro1.cor.

Figura 3.8 Utilizando o mtodo inicializar Caso existisse a possibilidade de no ser conhecido o status do carro no instante da inicializao um novo mtodo deveria ser criado, mas ele precisaria ter outro nome? A sobrecarga de mtodos permite que sejam criados mtodo de mesmo nome, porm com lista de parmetros diferentes. Uma lista de parmetros diferentes verificada pelo nmero de parmetros e pelo tipo dos mesmos. Por exemplo, todos os mtodos a seguir tm uma lista de parmetros distinta: metodo(int, float, String); metodo(int, String, float); metodo(int, float); metodo();

Portanto, no exemplo do carro, o mtodo inicializar pode ser sobrecarregado dando a opo de um mtodo sem o parmetro status, conforme a Figura 3.9.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Figura 3.9 Mtodo inicializar sobrecarregado No main a chamada do mtodo inicializar feita da mesma forma, diferenciando-se apenas na lista de parmetros. No caso de todos os valores serem conhecidos o primeiro mtodo inicializar chamado. No caso de no conhecer o status no instante da inicializao o segundo mtodo inicializar chamado. No futuro quando o status for conhecido ele pode ser alterado atravs do mtodo ligar ou desligar, como mostrado na Figura 3.10.

Figura 3.10 Utilizao do mtodo inicializar sobrecarregado A criao de mtodos de inicializao extremamente til, principalmente no caso onde a quantidade de atributos grande e a maioria deles conhecida no instante de criao do mtodo. No entanto, existe uma forma de atribuir valores (ou qualquer outro tipo de expresso) no instante da criao do objeto. Esta forma se chama Mtodo Construtor. Mtodo construtor um mtodo que chamado na instanciao do objeto pelo operador new. O mtodo construtor pertence classe e tem o mesmo nome dela. Isso quer dizer que a chamada new Carro() invoca um mtodo chamado Carro() existente na classe Carro, mas olhando na classe Carro esse mtodo no existe. O que acontece que quando no definimos o mtodo construtor chamado o construtor default que simplesmente aloca espao para o objeto, mas tambm possvel implementar esse construtor, conforme a Figura 3.11 onde no construtor alguns valores considerados default so atribudos aos atributos.

Figura 3.11 Classe Carro com construtor

Com isso, na instanciao de um objeto do tipo carro o cdigo contido dentro do construtor (linhas 9, 10 e 11) ser executado. O programa principal apresentado na Figura 3.12 ir resultar na Figura 3.13, pois a chamada da linha 5 executa o construtor da classe Carro que preenche os atributos de carro1 com os valores default.

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 3 Classes e Objetos

Figura 3.12 Utilizao do Construtor

Figura 3.13 Impresso dos valores default Assim como no mtodo inicializar possvel passar parmetros para preencher os valores dos atributos sobrecarregando o construtor, conforme a Figura 3.14. A chamada aos construtores so feitas como apresentado na Figura 3.15

Figura 3.14 Construtores sobrecarregados

Figura 3.15 Utilizao de construtores sobrecarregados A partir do momento em que um construtor for definido, o construtor default deixa de existir, ou seja, se existirem apenas construtores com um ou mais parmetros a chamada new Carro() dar erro de compilao dizendo que esse construtor no existe.

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

Composio e Herana
Uma caracterstica da Orientao a Objetos proporcionar facilidades para a reutilizao de cdigo. A reutilizao de cdigo feita com a reutilizao de classes nas mais diversas aplicaes. A reutilizao de classes pode ser feita pelos mecanismos de composio e herana. Assim como na vida real, na POO objetos podem ser compostos por outros objetos. Por exemplo a classe Carro poderia ter atributos como: tamanhoMotor, potenciaMotor, valvulasMotor, aroPneu, larguraPneu, alturaPneu e marcaPneu, conforme a Figura 4.16, mas na vida real sabemos que os objetos Motor e Pneu so objetos que compe o objeto Carro. Portanto o ideal que a modelagem fosse feita da forma da Figura 4.17 (utilizando a notao definida pela UML), pois facilita o mapeamento com os objetos da vida real, alm de facilitar o reuso, por exemplo, caso fosse necessrio implementar uma classe Motocicleta as classes Motor e Pneu poderiam ser reutilizadas.

Figura 4.16 Classe Carro com atributos de Motor e Pneu

Figura 4.17 Classe Carro com composio Em termos de cdigo uma composio nada mais do que um atributo do tipo que compe o objeto. No exemplo anterior, primeiramente necessrio implementar as classes Motor e Pneu, conforme a Figura 4.18 e a Figura 4.19, respectivamente. A classe Carro conter um atributo do tipo Motor e um atributo do tipo Pneu, como mostra o cdigo Figura 4.20 Todas as classes implementam o construtor com valores default, sendo assim, quando um objeto do tipo Carro for criado todos os valores so preenchidos e posteriormente podem ser alterados, como mostra a Figura 4.21. Na Figura 4.22 apresentada a seqncia de compilaes e o resultado da execuo da classe Principal, onde os valores definidos no construtor so impressos com exceo dos que foram modificados no programa Principal.

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

Figura 4.18 - Implementao da classe Motor

Figura 4.19 Implementao da classe Pneu

Figura 4.20 Implementao da classe Carro composta

10

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

Figura 4.21 Classe Principal utilizando a classe Carro composta

Figura 4.22 Seqencia de compilao do programa e resultado da execuo da classe Principal Anteriormente foi falado sobre a possibilidade de reutilizao das classes Motor e Pneu caso fosse necessria a implementao de uma classe Motocicleta. Alm de Motor e Pneu a motocicleta teria cor, partidaEletrica e status, alm dos mtodos ligar e desligar. A implementao da classe apresentada no cdigo da Figura 4.23.

11

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

Figura 4.23 Implementao da Classe Motocicleta Na implementao da classe Motocicleta fica perceptvel uma grande repetio do cdigo existente na classe Carro. O ideal que esse cdigo fosse reaproveitado sem a necessidade de cpia, como foi feito. A utilizao de composio nesse caso no adequada, pois ficaria estranho um carro ser um componente de motocicleta. O que importante notar que Carro e Motocicletas possuem diversas caractersticas e mtodos em comum, isso por pertencerem a uma classe mais genrica, por exemplo, Transporte. O mecanismo de herana permite a criao de classes mais genricas (superclasses) que englobam caractersticas em comum de suas filhas. Essas, por sua vez, herdam as caractersticas e mtodos de suas mes. A definio das classes Carro e Motocicleta (utilizando a notao definida pela UML) so apresentadas na Figura 4.24, onde ambas herdam de Transporte todos os atributos (inclusive motor e pneu) e mtodos alm de terem atributos especficos.

Figura 4.24 Classes Carro e Motocicleta com Transporte como superclasse A implementao das classes Motor e Pneu continuariam conforme apresentado na Figura 4.18 e na Figura 4.19 respectivamente. A classe Transporte implementada apresentada na Figura 4.25,

12

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

onde percebe-se que tudo o que comum a Carro e Motocicleta foi implementado. Por sua vez as classes Carro e Motocicleta so apresentadas na Figura 4.26 e na Figura 4.27 respectivamente, onde apenas os atributos especficos so declarados. A palavra extends define a herana, ou seja, Carro e Motocicleta herdam todos os atributos e mtodos de Transporte. Na classe Carro, linha 7, usada a palavra super que faz referncia superclasse, no caso Transporte. Para acessar um atributo da superclasse basta fazer super.atributo. O mtodo super() chama o construtor da superclasse que no exemplo inicializa os atributos da classe Transporte. O mesmo acontece para a classe Motocicleta.

Figura 4.25 Implementao da classe Transporte

Figura 4.26 Implementao da classe Carro herdando de Transporte

Figura 4.27 Implementao da classe Motocicleta herdando de Transporte A criao e utilizao de objetos do tipo Carro e Motocicleta no sofre nenhuma modificao, ou seja, a estrutura hierrquica das classes irrelevante na hora da utilizao. A Figura 4.28 apresenta uma classe Principal que utiliza as classes Carro e Moticicleta, onde na chamada do construtor os

13

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

atributos recebem valores default e posteriormente alguns desses valores so alterado no cdigo do main. Ao final os valores dos atributos so impressos, conforme a Figura 4.29

Figura 4.28 Classe Principal utilizando as classe Carro e Motocicleta

14

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 4 Composio e Herana

Figura 4.29 Impresso da classe Principal

15

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Pacotes, Modificadores de Acesso e Encapsulamento


Um pacote em Java um conjunto de classes agrupadas em uma pasta de arquivos. Geralmente se agrupam classes relacionadas que foram construdas com um determinado propsito dando a idia de bibliotecas de funcionalidades. Alm disso, a utilizao de pacotes elimina possveis conflitos de nomes de classes repetidas. As prprias classes da linguagem so agrupadas em pacotes, por exemplo: java.sql para lidar com banco de dados, java.util com diversas classes utilitrias, dentre diversos outros pacotes. A hierarquia de pastas representada na linguagem por um ponto, por exemplo java.sql significa a pasta sql dentro da pasta java. Dado o exemplo da seo anterior, pensando em utilizar em um sistema de locadora as classes foram alocadas nos seguintes pacotes: Principal em locadora; Motor e Pneu em locadora.pecas; e Carro, Motocicleta e Transporte em locadora.automotores. A Figura 5.30 apresenta a hierarquia de pacotes do sistema de locadora.

Figura 5.30 Hierarquia de pacotes do sistema de locadora Alm da diviso de pacotes preciso indicar no incio da classe em qual pacote ela est utilizando a palavra reservada package como na classe Motor apresentada na Figura 5.31. As outras classes tambm devem conter a descrio do pacote, inclusive a classe Principal no pacote locadora.

Figura 5.31 Classe motor em seu pacote possvel compilar as classes do pacote pecas de uma s vez utilizando: Porm, ao tentar compilar as classe do pacote automotores os seguintes erros sero apresentados:

16

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Esses erros dizem que as palavras Motor e Pneu, utilizadas dentro da classe Transporte, no foram reconhecidas. Isso aconteceu porque uma classe de um pacote est fazendo referncia a outras classes de outros pacotes. Para utilizar uma classe que esteja em outro pacote necessrio import-la utilizando a palavra reservada import, conforme apresentado na Figura 5.32, linhas 3 e 4.

Figura 5.32 Classe Transporte importando as classes do pacote pecas Tambm possvel importar todas as classes de um pacote da seguinte forma: Mas, ainda assim, ao compilar alguns erros aparecero:

17

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Esses erros dizem que as classes Motor e Pneu no so pblicas e, sendo assim, no podem ser acessadas de fora do pacote. E nesse ponto que entram os modificadores de acesso. Existem diferentes formas de acesso: pblica, protegida, amiga e privada. Um membro pblico pode ser acessado de qualquer lugar incondicionalmente utiliza-se a palavra reservada public. Um membro protegido s pode ser acessvel de fora do pacote por membros em subclasses utiliza-se a palavra reservada protected. Um membro amigo s pode ser acessado de dentro do mesmo pacote no tem uma palavra reservada, ou seja, membros sem nenhum dos outros modificadores considerado amigo (friendly). Um membro privado s pode ser acessado de dentro da mesma classe utiliza-se a palavra reservada private. A Tabela 5.1 apresenta os modificadores de acesso. ACESSO Pblic o public Mesma Classe Classes no Mesmo Pacote Subclasses em Pacotes Diferentes Sim Sim Sim Protegid o protecte d Sim Sim Sim Amig o Sim Sim No No Privado private

Sim No No No

No Subclasses em Pacotes Diferentes Sim No Tabela 5.1 Modificadores de Acesso

Portanto, para a classe Transporte ter acesso s classes Motor e Pneu, essas ltimas devem ser pblicas, assim como Carro e Motocicleta para serem acessveis de Principal. A Figura 5.33 apresenta a classe Motor que agora pblica e, alm disso, o construtor tambm deve ser pblico para que objetos do tipo Motor possam ser instanciados de outros pacotes. O mesmo deve ser feito na classe Pneu.

Figura 5.33 - Classe Motor As classes Carro e Motocicleta e seus construtores tambm devem ser pblicos para que se possam criar objetos desse tipo da classe Principal que est em outro pacote, conforme a Figura 5.34. No entanto a classe Transporte no referenciada em nenhum ponto fora do pacote e por isso pode continuar amiga.

18

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Figura 5.34 Classe Carro Depois de acertada a acessibilidade das classes e seus construtores o pacote automotores pode ser compilado sem problemas. Ao tentar compilar a classe Principal, vrios erros sero apresentados, por exemplo:

Esses erros esto dizendo que os atributos e os mtodos no esto acessveis de fora do pacote por no serem pblicos, ou seja, todos os mtodos e atributos que se deseje acessar de fora do pacote devem ser pblicos. Porm, no mundo real um objeto interage com outro sem saber detalhes de seu funcionamento interno e a acessibilidade aos atributos como se a estrutura interna da classe estivesse exposta, por exemplo, uma pessoa no precisa conhecer a estrutura interna de uma televiso e sim apenas sua interface para utiliz-la. O ocultamento de informaes de funcionamento interno na Orientao a Objetos chamado de Encapsulamento. A definio da interface de uma classe se d pela utilizao dos modificadores de acesso, onde o recomendvel no liberar o acesso direto aos atributos e quando for necessria a modificao direta devem-se criar mtodos pblicos para isso. Mtodos que s sejam utilizados internamente tambm devem ter acesso restrito. Os cdigos a seguir apresentam o programa com sua diviso de pacotes e utilizando o encapsulamento, onde alguns pontos devem ser notados: Todos os atributos de todas as classes so privados. Todos os mtodos de todas as classes so pblicos. Por conveno, todos os mtodos de modificao de atributos tm o nome do atributo prefixado por set. Por conveno, todos os mtodos de acesso aos atributos tm o nome do atributo prefixado por get. A exceo quando o tipo de retorno boolean onde o mtodo prefixado por is. O retorno dos mtodos getters e o argumento dos mtodos setters tm exatamente o mesmo tipo de seu atributo. Agora, na classe principal, todos os atributos so acessados atravs de seus mtodos getters e setters. No foi criado um mtodo setStatus na classe Transporte, pois existem os mtodos ligar e desligar com essa finalidade. A classe Transporte e seu construtor so amigos, pois s so acessados de dentro do prprio pacote, porm os mtodos getters, setters, ligar e desligar so e, por isso, so pblicos.

19

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

20

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

21

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Para compilar e executar o compilador e posteriormente a mquina virtual devem ser chamados de fora dos pacotes fazendo referncia a eles pela linha de comando, como mostra a Figura 5.35. Na compilao passado o diretrio a partir do local da chamada do compilador. Na execuo passado o nome da classe e este deve conter o nome completo, incluindo o pacote separado por ponto.

22

Sob Licena C.C.

Carlos Eduardo Andrio Captulo 5 Pacotes, Modificadores de Acesso e Encapsulamento

Figura 5.35 Compilando e Executando o programa

23

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 6 Atributos e Mtodos de Classe e de Instncia

Atributos e Mtodos de Classe e de Instncia


At agora em todos os exemplos dados os atributos criados em uma classe so especficos em cada instncia, por exemplo, o atributo cor pode assumir um valor diferente para qualquer instncia da classe Carro ou Motocicleta. Supondo que a empresa de locao estabelea uma cor nica para todos os seus carros e motocicletas, por exemplo, branco. Do jeito que o programa est, basta atribuir a cor branco ao atributo cor no construtor da classe Transporte. Porm, se por algum motivo a empresa resolver trocar a cor de seus carros e motocicletas para prata? O construtor deve ser modificado para cor receber prata, alm disso, todos os Carros e Motocicletas que j estavam criados devem ter seus atributos cor modificados um a um. Neste exemplo fica claro que o atributo cor de todos os objetos Carro e Motocicleta tm o mesmo valor e do jeito que est criado um desperdcio de memria alm de se tornar dispendioso uma troca de valores. Isso ocorre porque o atributo cor foi criado como um atributo de Instncia. Uma forma de resolver isso cri-lo como um atributo de Classe, ou tambm chamado atributo esttico. Um atributo de classe nico para todos os objetos daquela classe, ao alter-lo todas os objetos daquela classe tero esse atributo alterado automaticamente. Outra caracterstica importante dos atributos de classe que no necessrio ter nenhum objeto daquela classe criada para se atribuir valores a eles. Para se definir um atributo como atributo de classe utiliza-se a palavra reservada static antes do tipo do atributo, como mostra a Figura 6.36 que contem um trecho da classe Transporte.

Figura 6.36 Trecho da classe Transporte com cor esttico Na linha 7 percebe-se que o atributo cor agora de classe pelo uso da palavra reservada static. A atribuio do valor branco foi feita na prpria declarao do atributo, sendo comentada no construtor (linha 14), pois, caso contrrio, em toda criao de um objeto o valor de todos os outros voltariam a ser branco. A Figura 6.37 apresenta um programa que modifica o atributo esttico cor. Das linhas 7 a 9 o objeto carro1 foi criado e sua cor foi impressa. Na linha 12 a cor do carro1 modificada para azul e como um atributo esttico a cor do carro2, criado na linha 13, tambm ser azul, conforme impresso nas linhas 15 a 17. Na linha 20 alterada para verde a cor do carro2 e novamente a cor de qualquer objeto do tipo Carro ser alterada tambm, conforme impresso nas linhas 22 a 24. A Figura 6.38 apresenta o resultado da execuo do programa Principal2, conforme o esperado.

24

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 6 Atributos e Mtodos de Classe e de Instncia

Figura 6.37 Modificao e Impresso do atributo esttico cor

Figura 6.38 Execuo do programa Principal2 Apesar de cor ser um atributo esttico foi necessria a criao de objetos para alterar seu valor. Isso se deve ao fato dele ser privado e seu acesso s pode ser feito atravs de mtodos. Uma soluo seria torn-lo pblico e no main seu valor poderia ser alterado apenas pelo nome da classe como a seguir:

Com isso todos os carros j criados e os futuros assumiriam o valor Azul para o atributo cor. Porm, o que foi dito na seo de encapsulamento que os atributos devem ser privados e s podem ser acessados atravs de mtodos. Assim o correto tornar os mtodos getCor e setCor mtodos de classe. Um mtodo de classe um mtodo que no precisa de instncias de uma classe para ser invocado. Como no precisam de instncias apenas podem acessar e/ou modificar atributos estticos. A Figura 6.39 apresenta os mtodos setCor e getCor estticos pelo uso da palavra reservada static. Um detalhe importante que no mtodo setCor ao invs de ser utilizado this.cor foi utilizado Transporte.cor, pois cor um atributo da classe Transporte enquanto que o this faz referncia instncia que chamou o mtodo, instncia que pode no existir pelo mtodo ser esttico.

Figura 6.39 Mtodos setCor e getCor estticos A Figura 6.40 apresenta a utilizao dos mtodos estticos setCor e getCor.

25

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 6 Atributos e Mtodos de Classe e de Instncia

Figura 6.40 Utilizao de Mtodos Estticos Na linha 9 o valor do atributo esttico foi alterado sem antes ter sido criada nenhuma instncia de Carro. As linhas 14, 15 e 18 mostram que os mtodo estticos tambm podem ser utilizados sobre instncias, tendo o mesmo efeito de serem utilizados sobre a classe. Na linha 21 foi utilizado o mtodo esttico para imprimir o valor do atributo tambm esttico cor. Obs.: Por que o mtodo main esttico. Isso porque por ele que o cdigo comea a ser executado e, portanto, quem criaria um objeto da classe Principal para depois chamar o mtodo main sobre essa intncia? Executar um programa Principal como se fosse chamar Principal.main.

26

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 7 Classes Abstratas e Interfaces

Classes Abstratas e Interfaces


Quando classes so criadas o primeiro pensamento que outros objetos vo criar instncias dessas classes, mas nem sempre isso verdade. No exemplo anterior da locadora, no existe nenhuma instncia da classe Transporte criada, pois ela apenas uma classe que generaliza Carro e Motocicleta, no sendo razovel criar instncias dessa classe e sim de suas subclasses. Com essa finalidade existem as classes abstratas. As classes abstratas so somente utilizadas como superclasses em uma hierarquia de classes, no sendo possvel criar instncias dessas classes. Uma classe abstrata definida pelo uso da palavra abstract antes da declarao da classe. A classe Transporte como classe abstrata ficaria: Se na classe Principal uma tentativa de instanciar um objeto da classe com um new Transporte(); um erro de compilao seria apresentado pelo compilador. Uma classe abstrata pode possuir mtodos abstratos. Mtodos abstratos so mtodos que no possuem implementao e, com isso, todas as classes que herdarem da classe abstrata devem (obrigatoriamente) implementar seus mtodos abstratos. Ou seja, uma classe abstrata no precisa ter mtodos abstratos, em contrapartida se uma classe tem pelo menos um mtodo abstrato ela deve ser abstrata e todas suas subclasses devem implementar seus mtodos abstratos. Um mtodo abstrato utilizado quando um mesmo mtodo existe na superclasse abstrata, porm tem comportamento (implementao) diferente nas subclasses. Um mtodo abstrato declarado pela utilizao da palavra reservada abstract antes do tipo de retorno do mtodo. A declarao do mtodo termina com um ponto-e-vrgula. No exemplo anterior, tanto a classe Carro quanto a classe Motocicleta poderiam ter um mtodo imprimirCaractersticas(). Como um mtodo em comum ele poderia estar na superclasse Transporte. Porm ele dever ter implementaes diferentes nas classes Carro e Motocicleta, pois Carro tem quantidade de portas enquanto Motocicleta tem partida eltrica. A Figura 7.41, a Figura 7.42 e a Figura 7.43 apresentam a classe Transporte, Carro e Motocicleta respectivamente, onde a classe Transporte abstrata e possui um mtodo abstrato e suas subclasses implementam esse mtodo de forma diferenciada.

Figura 7.41 Classe abstrata Transporte

Figura 7.42 Classe Carro

27

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 7 Classes Abstratas e Interfaces

Figura 7.43 Classe Motocicleta Aprofundando em classes abstratas, o que significaria uma classe abstrata que s tivesse mtodos abstratos? Uma classe que herdasse dessa classe abstrata herdaria apenas a obrigao de implementar todos seus mtodos abstratos. A utilidade de uma classe abstrata assim seria a de definir quais mtodos a classe que herdasse deveria ter, ou seja, definiria a interface da classe. O problema de usar essa abordagem que uma classe s pode herdar de apenas uma classe. Se uma herana de uma classe abstrata fosse feita apenas para definir a interface da subclasse mais nenhuma outra herana poderia ser feita. Para isso a orientao a objetos define que uma classe abstrata seja definida como uma interface (interface). Uma interface uma classe abstrata que contm todos os seus mtodos abstratos. definida pela palavra reservada interface antes de seu nome: Uma interface tambm definida em um arquivo onde o nome deve ser o nome da interface com a extenso .java, por exemplo a interface anterior ficaria no arquivo Locadora.java. As interfaces fazem uso de modificadores de acesso da mesma forma que as classes. Com o uso de interfaces o problema da herana resolvido, pois uma classe no herda de uma interface e sim implementa. Com isso, uma classe pode implementar uma interface e herdar de outra classe, ou ainda mais, permitido a uma classe implementar vrias interfaces. Uma classe implementa uma interface utilizando a palavra reservada implements. No exemplo da locadora uma interface locadora definida com o mtodo abstrato imprimirCaractersticas(), conforme a Figura 7.44.

Figura 7.44 Interface Locadora A classe Transporte poderia implementar essa interface locadora, isso faria com que a classe Transporte fosse obrigada a implementar o mtodo imprimirCaractersticas(). Mas, como j foi dito este mtodo tem uma implementao especfica em Carro e Motocicleta. Para tirar a obrigatoriedade da implementao Transporte continuar a ser abstrata. Em resumo, uma interface define mtodos que devem ser implementados pelas classes concretas que implementar a interface ou por classes concretas que herdarem de classes abstratas que implementar a interface. Se uma classe for implementar mais de uma interface, as mesmas ficaro separadas por vrgulas: Uma interface pode conter atributos, porm esses atributos sero static e final implicitamente: Uma interface pode herdar de outras interfaces e no implementar outras interfaces: O uso de uma interface til para casos onde classes que no tem uma superclasse, mas tm mtodos em comum, por exemplo, mdulos de um programa devem ter obrigatoriamente um mtodo enviarDados(). um mtodo em comum, mas no vem ao caso criar uma superclasse, pois so

28

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 7 Classes Abstratas e Interfaces

mdulos no relacionados. Isso pode ser resolvido criando uma interface com esse mtodo e obrigando todos os mdulos a implementar essa interface. Outra utilidade de classes abstratas e interfaces no polimorfismo, assunto de sees futuras. A UML tem notaes definidas para classes abstratas e interfaces. Classes abstratas tm seu nome definido em itlico e interfaces podem ser definidas como crculos ou como classes com o esteritipo <<interface>>. A Figura 7.45 apresenta um diagrama de classes com duas interfaces (Locadora e OutraInterface) e uma classe abstrata (Transporte).

Figura 7.45 Diagrama de Classes com Interfaces

29

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 8 Tratamento de Excees

Polimorfismo
Na orientao a objetos o polimorfismo indica a capacidade de um objeto assumir mltiplas formas. Com isso possvel criar um objeto mais geral e depois especializ-lo. Com o polimorfismo possvel projetar e implementar sistemas que so facilmente extensveis, ou seja, se os objetos so mais gerais, novas classes podem ser acrescentadas sem muita alterao no cdigo. No exemplo da locadora um uso de polimorfismo seria criar objetos do tipo mais genrico, a classe Transporte. Porm, instanci-los nas formas mais especficas:

Um objeto t polimrfico foi criado, pois seu tipo da superclasse Transporte, mas ele pode assumir mais de uma forma das subclasses Carro e Motocicleta. Na seo de Classes Abstratas e Interfaces foi falado que elas ajudavam no polimorfismo. A definio de um mtodo abstrato na classe Transporte imprimirCaracteristicas() faz com que seja possvel chamar: Pois, se esse mtodo estivesse definido apenas em Carro e Motocicleta t no o conheceria. Ento, sobre t s podero ser invocados mtodos que pertencem a Transporte. Isso faz com que seja possvel criar objetos da interface polimrficos:

O polimorfismo muito til tambm quando usamos arrays ou colees para guardar grupos de objetos. Por exemplo, seria possvel armazenar em um nico array objetos Carro e Motocicleta, bastando que seu tipo fosse da superclasse Transporte ou da interface Locadora:

Se fosse necessrio imprimir as caractersticas de todos os Carros e Motocicletas no array bastaria fazer:

Neste ponto a vantagem fica clara: (1) em um mesmo vetor possvel armazenar objetos de diferentes tipos. (2) possvel chamar um mtodo que diferente para cada objeto da mesma forma sem a necessidade de saber qual o objeto daquela posio. O prprio mecanismo de polimorfismo verifica qual a instncia naquela posio e chamar o mtodo especfico daquela instncia. Como j foi dito, transportes [i] retorna um objeto Transporte e possvel chamar sobre ele mtodos que foram definidos em Transporte (abstratos ou no, herdados ou no). Mas se fosse necessrio chamar um mtodo especfico? Para isso basta fazer um downcast para a subclasse. Se fosse conhecido que na posio 0 tem um Carro poderamos fazer: O mesmo para Motocicleta. Mas se no fosse conhecido qual objeto tem em cada posio? Seria possvel utilizar o operador instanceof que retorna o nome da Classe. Um for para alterar a quantidade de portas quando for Carro e alterar a partida eltrica quando for Motocicleta ficaria:

30

Sob Licena C.C.

Carlos Eduardo Andrio

Captulo 10 Polimorfismo

Bibliografia
Deitel. (2006). Java Como Programar (6 Edio ed.). So Paulo, SP: Prentice Hall. Varejo, F. M. (2005). Linguagens de Programao. So Paulo: Campus.

31