INTRODUÇÃO A LINGUAGEM JAVA

download INTRODUÇÃO A LINGUAGEM JAVA

of 77

Transcript of INTRODUÇÃO A LINGUAGEM JAVA

Introduo Linguagem Javapor Christian Cleber Masdeval Braz

Sumrio1 Introduo ao Java 1.1 Histrico da Linguagem 1.2 Caractersticas da Linguagem 1.3 Plataformas Java 1.4 Java 2 System Development Kit 1.5 A Mquina Virtual Java 1.6 Garbage Collection 1.7 Produtos e Terminologias da Tecnologia Java 2 Estrutura bsica de um programa 2.1 Princpios Bsicos da Linguagem 2.2 Membros de uma Classe 2.3 O mtodo Main 2.4 Modificadores de Acesso 2.5 Conveno de Nomes 2.6 Compilao e Execuo de Programas 2.7 Passagem de Parmetro na Linha de Comando 3 Variveis e Operadores 3.1 Nome de Variveis 3.2 Tipo de Dados 3.3 Escopo de Variveis 3.4 Converses Entre Tipos Primitivos de Dados 3.5 Operadores 3.6 Constantes 4 Controle de Fluxo 4.1 Comando if else 4.2 Comando switch 4.3 Comando while 4.4 Comando do - while 4.5 Comando for 4.6 Comando break 4.7 Comando continue 5 Mtodos 5.1 Modificadores de Acesso 5.2 Nome de Mtodos 5.3 Argumentos 5.4 Retornando Valor a Partir de um Mtodo 5.5 Passando Parmetros para um Mtodo 4 4 4 5 5 5 6 7 8 8 8 9 9 9 10 10 13 13 14 17 17 18 20 22 22 23 23 24 24 24 25 28 28 28 28 29 29

2

6 Classes e Objetos em Java 6.1 Encapsulamento 6.2 Criando Objetos e Acessando Dados Encapsulados 6.3 Construtores 6.4 O Ponteiro this 7 Mais Sobre Classes e Objetos 7.1 Pacotes 7.2 Atributos e Mtodos de Classe 7.3 Destrutores e o Mtodo finalize() 8 Herana e Polimorfismo 8.1 Herana 8.2 Polimorfismo 8.3 - Criao de um objeto de uma subclasse e o ponteiro super 8.4 Mtodos e Classes final 9 Estruturando o Cdigo com Classes Abstratas e Interfaces 9.1 Classes Abstratas 9.2 Interfaces 10 Usando Strings e Arrays 10.1 Strings 10.1.1 Operaes em Strings 10.1.2 Convertendo primitivos para Strings e vice-versa 10.1.3 A classe StringBuffer 10.2 Arrays 10.2.1 Arrays de Primitivos 10.2.2 Arrays de Referncias 10.2.3 Arrays como Objetos 10.2.4 Arrays e Excees 10.2.5 Arrays Multidimencionais 11 Tratamento de Excees 11.1 Classes de Excees 11.2 Tratando de Excees 11.2.1 Capturando Excees 11.2.2 Deixando uma exceo passar atravs do mtodo 11.2.3 Capturando uma exceo e disparando outra diferente

32 35 36 37 39 43 43 44 45 48 48 49 52 53 56 56 57 62 62 63 64 64 65 65 66 66 67 67 72 72 73 73 75 76

3

1 Introduo ao JavaA linguagem Java foi desenvolvida pela Sun Microsystems em 1995. Apesar de relativamente nova, a linguagem obteve uma espetacular aceitao por programadores do mundo inteiro, tendo se difundido como nunca antes ocorreu com uma linguagem de programao. Um fator que colaborou com isso, o fato da linguagem possuir vantagens agregadas tais como: orientao a objetos, independncia de plataforma, multitarefa, robusta, segura e distribuda. Com o advento da Internet, que tornou ainda mais necessrio a comunicao entre plataformas heterogneas, estes fatores fizeram com que o Java fosse a tecnologia perfeita para este novo cenrio. 1.1 - Histrico da Linguagem No incio da dcada de 90, um pequeno grupo de projeto da Sun pretendia criar uma nova gerao de computadores portteis inteligentes, que pudessem se comunica entre si de diversas formas. Para isso, decidiu-se criar uma plataforma de desenvolvimento onde o software pudesse ser executado em diversos tipos de equipamentos. Para o desenvolvimento desta plataforma foi escolhida a linguagem de programao C++. A linguagem C++ no permitia realizar com facilidade tudo o que o grupo pretendia. Neste ponto, James Gosling, coordenador do projeto, decidiu criar uma nova linguagem de programao que pudesse atend-los em suas necessidades. A criao dos chips inteligentes foi abandonada devido ao alto custo de produo. Posteriormente, a exploso da Internet no mundo todo fez surgir a necessidade de uma tecnologia onde computadores de diferentes plataformas pudessem conversar. Surge da, baseada na linguagem criada para o projeto de Gosling, a linguagem Java. 1.2 Caractersticas da Linguagem Orientada a Objetos : Paradigma atual mais utilizado na construo de softwares. Dentre suas vantagens, podemos citar reaproveitamento de cdigo e aumento da manutenibilidade dos sistemas assim desenvolvidos. Simples e Robusta : Java representa em muitos aspectos um aperfeioamento da linguagem C++. Ela possui certas caractersticas que permitem a criao de programas de forma mas rpida, pois tiram do programador a possibilidade de cometer erros que so comuns de ocorrer em C++. Algumas dessas caractersticas so o tratamento obrigatrio de excees e o gerenciamento automtico de memria. Gerenciamento Automtico de Memria : Em Java no existe ponteiros, isto , no permitido ao programador acessar explicitamente uma posio de memria. Java automaticamente gerencia o processo de alocao e liberao de memria, ficando o programador livre desta atividade. O mecanismo responsvel pela liberao de memria que no est mais sendo utilizada conhecido como Garbage Collector. Independncia de Plataforma : Um dos elementos chave da linguagem Java a independncia de plataforma. Um programa Java escrito em uma plataforma pode ser utilizado em uma outra distinta da original. Este aspecto da linguagem geralmente referenciado como write once, run anywhere. Isto conseguido atravs da utilizao da Java Virtual Machine (JVM) a qual roda numa plataforma especfica e interpreta um programa Java para cdigo de mquina especfico da plataforma em questo. Como os programas em Java executam sob o controle da JVM, eles podem rodar em qualquer plataforma que possua uma disponvel.4

Multi-threading : Um programa Java pode conter mltiplas threads para realizar vrias tarefas em paralelo.

1.3 Plataformas JAVA A tecnologia Java est organizada em trs plataformas com objetivos especficos: Java 2 Standard Edition (J2SE): ferramentas e APIs (Application Program Interface) essenciais para qualquer aplicao Java (inclusive para as outras plataformas). suficiente a utilizarmos se quisermos desenvolver aplicaes desktop com ou sem interface grfica. Java 2 Enterprise Edition (J2EE): ferramentas e APIs para o desenvolvimento de aplicaes distribudas. Engloba tecnologias tais como RMI, EJB, CORBA, JMS, etc. Java 2 Micro Edition (J2ME): ferramentas e APIs para o desenvolvimento de aplicaes para aparelhos portteis (palms, celulares, eletrodomsticos).

Neste curso, ser suficiente para ns utilizarmos apenas a plataforma J2SE, j que nosso objetivo principal aprender a linguagem Java. 1.4 Java 2 System Development Kit (J2SDK) O J2SDK corresponde ao produto disponibilizado pela SUN que implementa a plataforma J2SE, provendo o ambiente bsico necessrio para o desenvolvimento de aplicaes. Ele pode ser obtido no site da SUN no endereo http://java.sun.com. O J2SDK consiste de: JRE (Java Runtime Environment): ambiente para execuo de aplicaes Ferramentas para desenvolvimento: compilador, debugger, gerador de documentao, empacotador JAR, etc Conjunto de APIs e cdigo fonte das classes

1.5 A Mquina Virtual Java O JRE um conjunto de programas que possibilita executar aplicaes Java. O corao do JRE a Mquina Virtual Java ou Java Virtual Machine (JVM). a JVM que possibilita uma das caractersticas mais impressionantes da linguagem Java, a portabilidade do cdigo. Vamos compreender um pouco como isso funciona No processo de compilao, ao invs do programa ser compilado para cdigo de mquina da plataforma que vai ser executado, o programa compilado para bytecode O bytecode genrico, isto , no especfico para nenhum sistema operacional em particular Quando um programa Java executado, o arquivo bytecode interpretado pelo interpretador da tecnologia java, que denominado Java Virtual Machine. Existe uma JVM diferente para cada plataforma onde a tecnologia Java pode ser executada e dever existir uma instalada no computador no qual ser executado um programa Java. Os browsers, por exemplo, incorporam uma JVM para a execuo de applets.5

MeuPrograma.java_____ _____ _____

=> Cdigo fonte

Compilao => javac MeuPrograma.class_____ _____ _____

=> Bytecode

Execuo => java JVM

DOS JVM

SCO JVM

Win JVM

Linux JVM

Figura 1- Esquema de compilao e execuo de um programa em Java. 1.6 Garbage Collection No C e C++ (e em outras linguagens) o programa desenvolvido responsvel pela alocao e desalocao da memria, o que um dos principais pontos causadores de erros nestes programas. Em Java, quando um objeto criado (e quase tudo em Java um objeto), a memria necessria alocada automaticamente para ele, pois no h forma de se manipular a memria diretamente. Podem existir inmeras variveis no programa referenciando um mesmo objeto e, durante o ciclo de execuo do programa, o Java verifica se um objeto ainda est sendo referenciado por alguma varivel e, caso no esteja, o Java libera automaticamente esta rea que no esta sendo utilizada. Ou seja, quando no resta mais nenhuma referncia para um objeto, ele marcado para ser coletado pelo garbage colletor ou coletor de lixo, que libera a memria ocupada por ele. O coletor de lixo executado de tempos em tempos num processo de baixa prioridade. Quando a JVM no est realizando nenhum processamento, ela executa o coletor de lixo que vasculha a memria em busca de algum objeto criado e no referenciado. Quando uma grande quantidade de objetos ou objetos muito grandes no so mais necessrios e no se quer esperar at que o coletor de lixo seja executado para liberar essa memria, pode-se chama-lo explicitamente no programa da seguinte forma : System.gc();

6

1.7 Produtos e Terminologias da Tecnologia Java Produto Java Virtual Machine (JVM) Java Runtime Environment (JRE) Descrio Interpreta arquivos .class (bytecode) para instrues especficas de plataforma. Somente o JVM no suficiente para uma aplicao Java ser executada. O JRE consiste do JVM mais ncleo de classes da plataforma Java e arquivos de suporte. O JRE o que deve estar instalado para a execuo de uma aplicao Java. Biblioteca de classes e interfaces que auxiliam no desenvolvimento das aplicaes. Corresponde ao nome da tecnologia Java at Novembro de 1999. JDK 1.1 foi a ltima verso. composto por : JVM, JRE, compilador, ferramentas e APIs. o nome da tecnologia a partir de Novembro de 1999. Corresponde ao JDK 1.2 na antiga terminologia. composto por : JVM, JRE, compilador, ferramentas e APIs. Corresponde a documentao das APIs. A ltima verso pode ser encontrada em http://java.sun.com/j2se/1.4.2/docs/api/. A ferramenta Javadoc auxilia na criao da documentao das classes.

Application Program Interface (API) Java Developer`s Kit (JDK)

Java 2 Platform, J2SE (Standard Edition )

Javadoc

7

2 Estrutura bsica de um programaO desenvolvimento de aplicaes Java sempre feito atravs de classes. A definio de uma classe Java deve respeitar a seguinte sintaxe : class { public static void main( String args[] ) { //corpo principal do programa } } Exemplo 1 : Modificador de Acesso public class Exemplo1 Nome da Classe { Varivel de Instncia String mensagem = Meu primeiro programa em Java!; public void Imprime_Msg() { //Mostra um texto na tela System.out.println(mensagem); } public static void main (String [] args) { Imprime_Msg(); } } 2.1 Princpios Bsicos da Linguagem Java case-sensitive As classes, mtodos ou blocos de cdigo sempre estaro delimitados por um abrir ( { ) e fechar ( } ) de chaves. Um comando deve sempre ser finalizado por um ponto e vrgula ( ; ) Dois tipos de comentrio : //Comentrio de uma linha e /* Comentrio de Vrias */ Nomes de variveis, classes e mtodos devem sempre comear por letras, $ ou _

Definio de Mtodos

Corpo do Programa

2.2 Membros de uma Classe As variveis de instncia formam os atributos de um objeto e, juntamente com os mtodos, so os elementos bsicos para a formao de uma classe. Eles so denominados membros da classe. Os atributos so espaos em memria reservados para armazenar informaes durante a execuo da classe. Eles consistuem o estado interno de um objeto. Os atributos so inicializados no incio da execuo da classe e ficam disponveis para utilizao por8

todos os seus mtodos. Os mtodos por sua vez definem as operaes que podem ser realizadas pela classe. Mais sobre atributos ser visto no captulo Variveis e Operadores e os mtodos sero vistos em maiores detalhes no captulo Mtodos. 2.3 O Mtodo Main Uma aplicao em Java caracterizada por possuir o mtodo main(). A declarao do mtodo deve ser : public static void main( String[] args ). O mtodo main um mtodo especial pois representa o ponto de entrada para a execuo de um programa em Java. Quando um programa executado, o interpretador chamar primeiramente o mtodo main da classe. ele quem controla o fluxo de execuo do programa e executa qualquer outro mtodo necessrio para a funcionalidade da aplicao. Nem toda classe ter um mtodo main. Uma classe que no possui um mtodo main no pode ser executada pois no representa um programa em Java. Ela ser sim, utilizada como classe utilitria para a construo de outras classes ou mesmo de um programa. 2.4 Modificadores de Acesso A declarao de uma classe geralmente comea com o modificador de acesso public, o que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe ser visvel apenas por outras classes do mesmo pacote que a contm. 2.5 Conveno de Nomes Nome de Arquivos : O cdigo fonte de programas Java armazenado em arquivos com extenso .java. Um arquivo fonte poder armazenar a definio de mais de uma classe, mas uma boa prtica armazenar apenas uma classe por arquivo fonte. Use o nome da classe principal do arquivo como sendo o nome do arquivo. Quando compilamos um arquivo fonte, ser gerado um arquivo com extenso .class para cada classe definida e com o mesmo nome da classe. O arquivo .class contm o bytecode gerado com a compilao. Exemplos : Cliente.java , ItemEstoque.java Nome de Classes : Utilize substantivos ou frases substantivas descritivas para nome de classes. Deixe maiscula a primeira letra de cada substantivo que compe o nome, por exemplo : MyFirstClassName Nome de Mtodos : Use verbos para nome de mtodos. Faa a primeira letra do nome minscula com cada letra inicial interna maiscula. Por exemplo : getUserName() Nome de Variveis : Escolha nomes que indiquem o uso pretendido da varivel. Utilize a primeira letra do nome minscula e a inicial das outras palavras que formam o nome maiscula. Exemplos : customerName, customerCreditLimit

9

2.6 Compilao e Execuo de Programas Para compilarmos e executarmos um programa Java necessrio que a mquina possua o J2SE instalado. Para compilarmos um programa na linha de comando, fazemos: prompt> javac Exemplo1.java - Sada do Compilador prompt> Se no ocorrer nenhum erro de compilao aps a execuo do comando, ser gerado o arquivo Exemplo1.class. Para o executarmos fazemos : prompt> java Exemplo1 Perceba que omiti-se a extenso .class Meu primeiro programa em Java! prompt> Isto ir chamar a JVM que carregar o arquivo Exemplo1.class e tentar chamar seu mtodo main (). Se o Exemplo1.class chama mtodos em outras classes, a JVM carregar estas outras classes somente quando for necessrio. 2.7 - Passagem de Parmetros na Linha de Comando Aplicaes Java permitem que se passe parmetros atravs da linha de comando. Os parmetros so separados por espaos em branco. Para passar um parmetro que contm ele prprio espaos em branco deve-se coloc-lo entre aspas duplas. Os parmetros so passados para as aplicaes atravs do vetor de strings do mtodo main. Atravs do mtodo length pode-se verificar o nmero de parmetros passados. O acesso feito indicando-se a posio no array, sempre iniciando em 0. Exemplo 2 : class ParametroLinhaComando { public static void main( String [] args ) { System.out.println(Meu nome : + args[0] + e tenho + args[1] + " anos." ); System.out.println("Tamanho do segundo parametro : " + args[1].length() + " Nmero de parametros : " + args.length); } } A seguinte chamada a este programa prompt> java ParametroLinhaComando Maria 18 gerar a seguinte sada : prompt> Meu nome Maria e tenho 18 anos. parametro : 2 Nmero de parametros : 2 Tamanho do segundo

10

Exerccios : 1 Siga os passos abaixo para criar e executar sua primeira aplicao Java. Ela possui alguns erros do jeito que est. Tente descobrir e corrigi-los antes de compilar. Caso no consiga, compile e tente descobrir os erros a partir da sada apresentada. a) Abrir um editor de textos e escrever o programa class PrimeiraApp { public void main( String args ) { System.out.println(Primeira aplicao.) } } b) Salvar o arquivo dando a ele o mesmo nome da classe e com a extenso .java. c) Compilar o arquivo prompt> javac PrimeiraApp.java Se a compilao foi com sucesso, ela gerou um arquivo PrimeiraApp.class, que o arquivo a ser executado. d) Execute o programa utilizando o interpretador java prompt> java PrimeiraApp 2 Examine o cdigo abaixo e responda as questes que seguem. public class HelloWorld { private int age; private String telephone; private String address; public static void main (String[] args){ showMessage(Hello World!); } static void showMessage(String msg) { int messageNumber = 0; int messagePriority =; messageNumber = messageNumber + 1; System.out.println(msg + + messageNumber); } }11

a) Qual o nome da classe ? b) Quais os nomes dos mtodos ? c) Quais os nomes dos atributos ? d ) Quais os nomes das variveis do mtodo ? 3 Diga o que est de errado no cdigo abaixo : class mais_erros { int 1_Idade; int segundaIdade; public void somaIdades (){ System.out.println(A soma das idades : + (1_Idade + SegundaIdade) ); public static void main (String[] args) { // Esta chamada de metodo ira imprimir a soma das idades na tela. SomaIdades; } }

12

3 Variveis e OperadoresUma varivel um nome simblico para uma poro de memria na qual um valor pode ser armazenado. Toda varivel tem as seguintes caractersticas : Deve ser declarada antes de ser utilizada; Possui um tipo, um identificador e um escopo; Podem ser locais, quando declaradas dentro de mtodos, ou atributos, quando declaradas no corpo da classe; Podem ser inicializadas;

Como Java uma linguagem fortemente tipada, todas as variveis devem ser declaradas antes de serem usadas. O tipo de uma varivel determina o tipo de informao que pode ser armazenada nela. Variveis em Java podem ser declaradas como atributos, no corpo da classe, ou podem ser declaradas localmente em qualquer parte da implementao de um mtodo. Variveis tambm possuem um escopo, o qual determina onde no programa ela estar visvel e poder ser acessada. A declarao de variveis no Java segue a seguinte sintaxe : String msg = Exemplos de declarao de variveis ; int umInteiro, UmInteiro; float umFloat = 0.5; char caracter = i; boolean flag = false; umInteiro = 90;

tipo identificador [= valor] [, identificador [= valor]];

3.1 Nome de Variveis O nome de uma varivel deve comear com uma letra (a-z/A-Z), um underscore ( _ ), ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9. Como no existe restrio quanto ao tamanho dos nomes das variveis, recomendado que se escolha nomes significativos e que representem a real inteno de uso para a varivel ou constante. Resumindo : Conveno : Escolha nomes que indiquem o uso pretendido da varivel. Utilize a primeira letra do nome minscula e a inicial das outras palavras que formam o nome maiscula. Exemplos : customerName, customerCreditLimit

Exemplos de nomes para variveis : Legais a itemCost item$Cost Palavras-Chaves Toda linguagem tem um grupo de palavras que o compilador reserva para seu prprio uso. Essas palavras-chaves no podem ser usadas como identificadores em seus programas. Em Java, as palavras reservadas so :13

Ilegais item#Cost item*Cost 2itemCost item-Cost sem%

item_Cost _itemCost itemCost2

abstract boolena break byte case *cast *catch char class *const continue default

do double else extends final finally float for *future generic *goto if

implements import *inner instanceof int interface long native new null operator *outer

package private protected public *rest return short static super switch synchronized this

throw throws transient try *var void volatile while

*os itens marcados com asterisco so para implementaes futuras da linguagem. 3.2 Tipos de Dados Uma varivel em Java pode ser de um dos quatro tipos de dados : classes, interfaces, arrays e tipos primitivos. No momento da compilao, o compilador classifica cada varivel como uma referncia ou um valor primitivo. Uma referncia um ponteiro para algum objeto. As classes, interfaces e os arrays so armazenados como referncias. Os tipos primitivos so diretamente armazenados e seu tamanho fixo. O tamanho e as caractersticas de cada tipo primitivo so consistentes entre as plataformas, no h variaes dependentes de mquina como em C e C++, um benefcio da portabilidade do Java. Tipos Primitivos de Dados Java possui 8 tipos primitivos onde 6 so tipos numricos, um tipo char para caracteres e um tipo booleano.

CategoriaInteiro Inteiro Inteiro Inteiro Ponto Flutuante Ponto Flutuante Caracter Lgico Inteiro

Tipobyte short int long float double char boolean

Tamanho8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 16 bits true / false

Os tipos de dados dessa categoria armazenam valores numricos inteiros, isto , nmeros sem casas decimais. O Java possui 4 tipos primitivos desta categoria e o que diferencia um do outro a sua capacidade de armazenamento.

14

Tipobyte short int long

Tamanho8 bits 16 bits 32 bits 64 bits

Variao-128 a + 127 -32.768 a +32.767 -2.147.483.648 a +2.147.483.647 9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

Por default, literais1 inteiros so de 32 bits (int) e podem ser especificados como decimais, octais e hexadecimais. Para definir um literal como um nmero decimal, basta atribuir um nmero decimal qualquer, como octal deve-se acrescentar um 0 no incio do nmero e como hexadecimal um 0x ou 0X. Os octais contm os dgitos de 0-7 e os hexadecimais os caracteres 0-9 e A-F em maisculo ou minsculo. possvel tambm definir literais inteiros do tipo long, ou seja, com 64 bits. Para isso, basta acrescentar um L no final do nmero. O efeito disso que, se a varivel foi definida como int, o compilador passa a interpret-la como long. Exemplos de literais do tipo Inteiro : Decimal Octal Hexadecimal Long Ponto Flutuante 0 02 0x0 365L 1998 077 0x2a 077L -23456 0123 0X1FF 0x1ffL

Os tipos de dados de ponto flutuante armazenam nmeros que possuem uma parte decimal, isto , representam nmeros reias. Em Java so dois os tipos dessa categoria : float e double. O tipo float permite representar valores reais com preciso simples (32 bits) enquanto o tipo double permite representar com preciso dupla (64 bits). Deve ser utilizado o ponto como separador de casas decimais. Quando necessrio, os nmeros podem ser escritos em notao exponencial, usando o caracter e ou E. Por exemplo : 4.2 * 106 pode ser representado por 4.2e6. A representao de um literal com ponto flutuante , por default, considerada do tipo double. Para representar um literal do tipo float com preciso simples (32 bits) devemos incluir a letra F ou f no final do nmero. Alguns exemplos de literais com ponto flutuante so : 1.0 , 4.7 , .47 , 1.22e19 (1.22 * 1019 ) , 4.6E-9 (4.6 * 10-9) , 6.2f , 6.21F Caracter

O nico tipo dessa categoria o tipo char. Uma varivel do tipo char permite armazenar apenas um caracter. Caso seja necessrio armazenar palavras ou textos dever ser utilizado o tipo String, que no um tipo primitivo. necessrio utilizar aspas simples para atribuir um literal para uma varivel do tipo char, por exemplo : char letra = a;

1

Enquanto variveis armazenam valores, os literais so os prprios valores. Literais podem ser usados em qualquer parte de um programa Java. 15

Java utiliza o padro UNICODE para armazenar as variveis do tipo char. Nesse padro, cada caracter ocupa 16 bits, podendo representar at 32.768 caracteres diferentes. Os literais dessa categoria podem representar caracteres imprimveis ou no. Abaixo segue uma relao de alguns deles : a-z A-Z \n \ \ Uma letra de a - z Uma letra de A- Z Nova linha Aspas duplas Aspas simples \r Retorno de carro \b Retrocesso do cursor \u006F Valores Unicode \t Tabulao

Lgico

Essa categoria tambm possui apenas um tipo de dado que o tipo boolean. Uma varivel do tipo boolean pode armazenar apenas dois valores lgicos : true ou false. O Java no associa valores numricos para true e false como ocorre em outras linguagens de programao. Tipos de Dados Armazenados por Referncia Os tipos podem ser primitivos ou de referncia. Os primitivos representam valores numricos, caracteres individuais e valores booleanos. Os tipos de referncia so representados por Classes, Interfaces e Arrays e podem ser definidos pelo usurio. A principal diferena entre os tipos primitivos e de referncia a memria que deve ser alocada, em tempo de execuo, para uma varivel de referncia, pois o ambiente de execuo no sabe quanta memria ser necessria. Na lista de tipos primitivos no encontramos um para tratar de strings de caracteres, isto porque em Java strings so manipuladas atravs de uma classe especfica para isso, a classe String. Veremos mais sobre ela posteriormente. Todo programa em Java possui dois tipos de memria : principal (stack) e auxiliar (heap). Uma varivel do tipo primitivo armazena o seu contedo diretamente na memria principal. J uma varivel do tipo referncia armazena o seu contedo na memria auxiliar e armazena na memria principal apenas o endereo onde foi armazenado o contedo da varivel. Abaixo segue uma representao grfica desse esquema : Memria Stack Memria Heap (Tipo Primitivo)Var1 valorvalor(es)

(Tipo Referncia) Var2

endereo

16

3.3 Escopo de Variveis O escopo de uma varivel o bloco de cdigo dentro do qual ela acessvel e determina quando a varivel criada e destruda. O bloco determinado por { e }. De maneira geral, uma varivel em Java pode ser um atributo, quando declarada na classe, ou uma varivel local a um mtodo, quando declarada dentro deste. Um atributo pode ser acessado por qualquer mtodo de uma classe e s so destrudos quando todo o objeto for. Uma varivel local pode ser acessada apenas dentro do mtodo onde ela foi definida. Mais especificamente, o escopo de uma varivel est diretamente relacionada ao bloco onde ela est contida. Uma varivel ser visvel apenas dentro do bloco imediatamente superior a ela. O exemplo abaixo ilustra essa regra : void metodo () { int x; { int y; x = 10; } y = 20; }

Incio do bloco de x

Incio do bloco de y OK ! A varivel x est sendo acessada dentro de seu bloco ! Fim do bloco de y ERRO ! A varivel y est sendo acessada fora de seu bloco ! Fim do bloco de x

3.4 - Converses Entre Tipos Primitivos de Dados A converso entre tipos primitivos de dados uma prtica bastante comum e necessria, porm, deve-se ter cuidado ao efetu-la para no perder informaes e obter um resultado no esperado. Java automaticamente converte um valor de um tipo numrico para outro tipo de maior capacidade de armazenamento. Por exemplo, se tentarmos atribuir um byte para um short, o compilador automaticamente converte o byte em short antes de realizar a atribuio. O esquema abaixo simboliza as converses automticas :short int long

byte

O contrrio no verdadeiro. Para efetuarmos uma converso de um tipo maior para outro de menor capacidade necessrio usar um mecanismo chamado type cast, caso contrrio um erro ser lanado. Isso feito colocando-se o tipo pretendido para converso entre parnteses em frente da expresso ou varivel. Quando fazemos isso, foramos o compilador a realizar a converso. importante estar ciente que isto pode resultar em perda de dados e em resultados imprevisveis. Exemplo : byte b1 = 127, b2 = 127, b3;17

b3 = b1+ b2; Erro, pois b1 + b2 resulta em 254 b3 = (byte) (b1 + b2); Est correto, mas ir ocorrer perda de informao! A tabela abaixo apresenta um resumo das possibilidades de cast, apontando os casos quando isso poder causar perda de dados. Tipo Original byte Short int long float double char boolean Tipo Destino long float double

byte C, P C, P C, P C, P C, P C, P X

short

int

C, P C, P C, P C, P C X

C, P C, P C, P C X

C, P C, P C, P C X C, P C X

C

C X

char boolean C X C X C, P X C, P X C, P X C, P X X X

C Utilizar cast explcito P Perda de magnitude ou preciso X Java no permite converso

3.5 Operadores Operadores so caracteres especiais usados para instruir o compilador a executar uma determinada operao em um operando. Operador de Atribuio Operador = Nome Atribuio Exemplo int var1 = 0, var2 = 0; var2 = var1 + 10; var1 = var2 = 50;

Operadores Aritmticos Operador + * / % Nome Adio Subtrao Multiplicao Diviso Mdulo (resto da diviso) Exemplo 23+29 29-23 0.5 * salario 100/50 20%3 Resultado 52 6 2 2

Nas operaes envolvendo byte, short ou char , estes valores so promovidos para int antes da operao, e o resultado ser tambm um int. Exemplo : byte b1 = 1, b2 = 2 , b3; b3 = b1 + b2 Erro pois o resultado um int! b1 = 100; b2 = 100; b3 = b1 + b2; Erro pois o resultado um int! b3 = (byte) (b1 + b2); Com o cast no apresentar erro, porm ocorrer perda de informao. Ao invs de ter 200 em b3, como ele um byte o valor ser 56 !18

Se a operao envolve um long em um dos argumentos do operador, ento o argumento do outro lado promovido para long e o resultado tambm ser um long. Operadores Relacionais Operador == != < > >= 5) ( 10 >11 ) || (10 < 12 ) !( 1= = 4 ) ( 1!= 0) ^ ( 2< 3 ) Resultado true true true false Nome Igual Diferente Menor Maior Maior ou igual Menor ou igual Exemplo x = = 10 3 != 2 10 < 10 10 > 6 3 >= 3 7 < > = = = != & ^ | && || ?: = op= L = Esquerda Comentrios Operadores Unrios Multi., Divi., Resto Add, Sub. Shift Relacionais Igualdade Bit/Loginal AND XOR (ou exclusivo) Bit/Logical OR AND OR Condicional Atribuio Associatividade R L L L L L L L L L L R R

3.6 Constantes Uma constante pode tanto ser definida como um atributo de classe como uma varivel local. Uma constante uma vez que foi declarada e atribudo um valor para a mesma, no permitido que outra atribuio seja efetuada, ocasionando um erro de compilao caso isso ocorra. A atribuio do valor inicial pode ser feita no momento da declarao, ou posteriormente em outra parte do programa. Para declarar uma varivel do tipo constante, devemos utilizar o modificador final dessa forma : final [= valor]; Declare constantes com nomes descritivos, escritos com todas as letras em maisculo. Separe nomes internos com underscores ( _ ). Exemplos : final double MIN_WIDTH = 100.0; final long MAX_NUMBER_OF_TIMES;

20

Exerccios : 1 Encontre os erros nas declaraes de variveis no cdigo abaixo e os corrija. 1. 2. 3. 4. 5. 6. 7. byte sizeof = 200; short $mom = 43; short hello mom; double old = 0.1 double new = 78; boolean consequence_2 = true; char maine = New England;

2 Crie um programa seguindo as orientaes abaixo. Faa tudo que pede dentro do mtodo main. a) Declare duas variveis para armazenar os valores de dois itens de venda. Os valores dos dois itens devem ser 2.95 e 3.50. Pense em nomes significativos para as variveis e tambm considere qual deve ser seu tipo. b) Use o System.out.println() para mostrar o contedo de suas variveis. Execute o programa e veja a sada. Apresente uma mensagem significativa como O Item 1 custa 2.95 e ... (Dica : utilize o operador + para concatenar o texto com o valor da varivel). c) Declare uma outra varivel para armazenar o custo total dos itens. Utilize o operador de adio para realizar o clculo e imprima o resultado. d) Crie uma constante para armazenar a taxa de 8.25 % que deve ser cobrada sobre o valor total. Armazene o clculo numa varivel chamada taxaCalculada e imprima o resultado. e) Adicione ao valor de cada item o valor da taxa calculado. Use a menor linha de cdigo possvel para fazer isso. Some novamente os dois valores e atribua o resultado a uma varivel chamada novoCusto. f) Crie uma varivel booleana chamada muitoCaro. Escreva uma assertiva lgica para setar esta varivel para true se novoCusto for maior que 10 e para false caso contrrio. Imprima o valor obtido em muitoCaro. (No utilize if para escrever a assertiva.) 3 Declare uma varivel chamada Long do tipo long e a inicialize com 100. Agora declare duas variveis do tipo int, int1 e int 2, e inicialize int1 com 200. Agora faa int2 receber int1 mais Long e explique os resultados. Arrume o cdigo para que no ocorra o erro anterior.

21

4 Controle de FluxoA maioria dos programas tomam decises que afetam seu fluxo. Os comandos que tomam essas decises so chamados de comandos de controle. 4.1 Comando if else Sintaxe : if ( boolean_expr ) comando1; [else comando2;] Exemplo : if ( fim = = true ) System.out.println(Trmino!); else System.out.println(Continuando...); Para mais de um comando ser executado depois da declarao, utiliza-se o conceito de blocos, delimitados por { }. Exemplo: if ( fim = = false ) && (cont > 0){ cont ++; System.out.println(Continuando...); } else { cont = 0; System.out.println(Trmino!); } recomendado sempre usar blocos de comandos para facilitar a leitura e compreenso do cdigo. possvel tambm criar comandos if aninhados. Exemplo : if ( fim = = false) && (cont < 0){ cont++; } else if (fim = = false) && (cont > 0){ cont--; } else { cont = 0; System.out.println(Trmino!!); }22 Expresso booleana formada pelos operadores lgicos e relacionais. Se a expresso boolena for verdadeira (true), executa comando1, caso seja falsa (false), executa comando2.

4.2 Comando Switch Utilizamos o comando switch para avaliar uma expresso contra vrios resultados possveis. Aceita somente um char, byte, short ou int como sua expresso de comparao. O valor procurado nas declaraes case que vem depois da declarao switch e o cdigo adequado executado. Sintaxe : switch ( expresso ) { case constant1 : comando1; break; case constant2 : comando2; break; ... [default : comando_default;] } Exemplos : switch ( cmd ){ case 0: System.out.println(Item do menu 1); menu = ++cmd; break; case 1: System.out.println(Item do menu 2); menu = ++cmd; break; case 2: System.out.println(Item do menu 3); menu = ++cmd; break; default: System.out.println(Comando invalido!); } 4.3 Comando while Implementa um loop para executar um bloco de comandos sucessivas vezes. A expresso de comparao avaliada antes que o lao seja executado. Sintaxe : while ( boolean_expr ) { comandos; }Enquanto a expresso for verdadeira o lao ser executado Deve resultar em char, byte, short ou int. Deve ser um literal ou uma constante !

Quando encontra u ma opo vlida, os comandos so executados at um break ser encontrado, o qual transfere o controle para o comando seguinte ao comando switch. Ou seja, se um break no especificado ao trmino de um case, todas as diretivas dos cases subsequentes sero executadas at que um break seja encontrado ou o comando switch termine.

Exemplo : while ( i != 0 ){ salario = salario * 0.5; i--; }

23

4.4 Comando do - whileUtilizado quando se quer que o corpo do lao seja necessariamente executado pelo menos uma vez A expresso de comparao avaliada depois que o lao for executado. Sintaxe: do { comandos; } while ( boolean_expr ); Exemplo: do { salario = salario * 0.5; i--; }while ( i != 0 );

4.5 Comando forComumente, um loop for possui uma parte inicial com a inicializao das variveis, seguida por uma expresso de comparao e depois a parte final com o incremento ou decremento das variveis do lao. Sintaxe : for ( inicializao; condio; iterao ) { comandos; } Exemplo: for (i = 0; i < 20; i ++){ salario = salario * 0.5; }

Pode-se declarar variveis na inicializao do for. for (int i = 0 ; i < 10 ; i++) comando;

O nico elemento realmente imprescindvel a condio. possvel construir laos for sem a inicializao e/ou o incremento. int 1 = 2; for ( ; i 2 ; i ++, j-- ) comando;

4.6 Comando break O break utilizado para transferir o controle para o final de uma construo de lao (for, do-while, while) ou de um switch. O lao vai encerrar independentemente de seu valor de comparao e o comando aps ele ser executado. Exemplo :

24

int i = 0; while (true) { System.out.println(i); i++; if ( i > 10 ) break; } ... 4.7 Comando continue Quando o comando continue encontrado (somente dentro de um lao), ele pra a execuo naquele ponto e a transfere de volta para o incio do lao para dar incio a uma nova iterao. Exemplo : for (int i = -10; i= 0) if (y < 0) System.out.println(y menor que x); else System.out.println(x negativo); int x = 7; if (x = 0) System.out.println(x zero); 1

2

int x = 15, y = 24; if ( x %2 == 0 && y%2 == 0) ; System.out.println(x e y so pares);

3

2 Determine o nmero de dias num ms. Voc deve usar um comando switch para setar um inteiro com o nmero de dias no ms especificado. Por enquanto adicione todo o cdigo no mtodo main(). a) Declare trs inteiros, um para manipular os dias (1-31), outro os meses (112) e um terceiro para manipular o ano. Inicialize estas variveis com um dia da sua escolha. b) Imprima a data no formato dd/mm/yyyy. c) Declare uma varivel para armazenar o nmero de dias que contm o ms escolhido. Ento, usando o comando switch, determine o valor para esta varivel. So 30 dias em Abril, Setembro, Junho e Novembro e 31 nos restantes exceto para Fevereiro que tem 28 (ignore o ano bissexto). Experimente executar o programa com diferentes valores para o ms. O que acontece se ele for executado com um ms invlido como 13 ? Para 27 de Janeiro de 2000 a sada deve ser algo como 27/1/2000 31 dias no ms 3 Use um lao for para mostrar datas. a) Usando um lao for, estenda seu programa de forma que ele imprima todas as datas entre a que voc especificou at o final daquele ms. Para 27/1/2000 a sada deve ser 27/1/2000 28/1/2000 29/1/2000 30/1/2000 31/1/200026

b) Teste o programa para verificar se ele est funcionando corretamente com vrias datas diferentes. c) Agora o modifique para que ele imprima no mximo 10 datas. Por exemplo, se a data for 19/1/2000 o programa deve imprimir apenas as datas 19/1/2000 at 28/1/2000. J se a data for 30/1/2000, dever ser impresso apenas 30/1/2000 e 31/1/2000. d) Compile seu programa, corrija os erros se ocorrer algum, e teste com vrias datas para ter certeza que est funcionando corretamente. 4 Determine se o ano especificado um ano bissexto. a) Crie uma expresso booleana para testar se o ano bissexto. Um ano bissexto se : ele divisvel por 4, e ele no divisvel por 100, ou divisvel por 400 b) Modifique o comando switch da questo 2 para tratar de anos bissexto. Lembre-se que o ano Fevereiro tem 29 dias em anos bissextos e 28 nos outros. c) Compile e teste seu programa. A tabela abaixo apresenta alguns anos que so e outros que no so bissextos para voc poder testar seu programa : Anos Bissextos 1996 1984 2000 1964 Anos no Bissextos 1997 2001 1900 1967

5 Considere que a data que voc escolheu a data de emprstimo de uma mercadoria e que necessrio saber qual a data de devoluo da mesma. A data de devoluo a data atual mais 3 dias. a) Declare trs variveis para controlarem o dia , ms e ano da data de devoluo e uma outra com a quantidade de dias de emprstimo (inicializada com 3). b) Crie o cdigo para calcular a adio do tempo de emprstimo com a data escolhida. A sada deve se assemelhar a algo como : Data do Emprstimo : 27/2/2001 Nmero de Dias : 3 Data da Devoluo : 2/3/2001 Preste ateno na sada acima. A soma de trs dias na data de emprstimo resultou na passagem de um ms para outro. Alm disso, como o ano 2001 no bissexto e o ms de emprstimo foi fevereiro, ao somar-se 3 dias os dias que se passaram foram : 28/2 1/2 2/3 . Voc deve estar atento tambm para : Se o emprstimo passar de um ms para outro o ms deve ser incrementado Se o emprstimo passar de um ano para outro o ano dever ser incrementado

27

5 MtodosQuando definimos um objeto num programa orientado a objetos, implementamos todo o comportamento desse objeto em um ou mais mtodos. Um mtodo em Java equivalente a uma funo, subrotina ou procedimento em outras linguagens de programao. No existe em Java o conceito de mtodos globais. Todos os mtodos devem sempre ser definidos dentro de uma classe. A sintaxe para construo de um mtodo a seguinte : [modificador] tipo_retorno identificador ([argumentos]) { //Corpo do mtodo } 5.1 Modificadores de Acesso Java controla o acesso a atributos e mtodos atravs do uso dos modificadores de acesso. So eles : public : o menos restritivo de todos. Atributos e mtodos declarados como public em uma classe podem ser acessados pelos mtodos da prpria classe, por classes derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais sobre pacotes e classes derivadas posteriormente). protected : Atributos e mtodos definidos como protected so acessveis pelos mtodos da prpria classe e pelas classes derivadas. private : o mais restritivo. Atributos e mtodos declarados como private s podem ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e por qualquer outra classe dentro do mesmo pacote. importante destacar que esse controle no se aplica s variveis locais aos mtodos. 5.2 Nome de Mtodos O nome de um mtodo deve comear com uma letra (a-z/A-Z), um underscore ( _ ), ou um sinal de dlar ( $ ). Os caracteres subsequentes podem incluir os dgitos de 0 a 9. Conveno : Use verbos para nome de mtodos. Faa a primeira letra do nome minscula com cada letra inicial interna maiscula. Por exemplo : getUserName(), getMaxPrice().

5.3 Argumentos Um mtodo pode ter zero ou mais argumentos (ou parmetros).

28

Caso no tenha argumentos, necessrio informar os parnteses vazios tanto na definio como na chamada do mtodo. O nome do mtodo acrescido de seus parmetros denominado assinatura do mtodo. Cada argumento deve ser declarado como define-se uma varivel, especificando o seu tipo e nome. Caso seja mais de um argumento, cada declarao deve estar separada por vrgula.

Exemplos : public void setAge(int newAge) { age = newAge; } public void displayAge() { System.out.println(Age is : + age); }

public void setUser(int newAge, String newName) { age = newAge; name = newName; } 5.4 Retornando Valor a Partir de um Mtodo possvel associar um valor de retorno a um mtodo. Para isso, preciso definir, na frente do nome do mtodo, o tipo do valor a ser retornado. O tipo pode ser um primitivo ou ento uma classe ou interface. Caso o mtodo no retorne valor algum, obrigatria a utilizao do tipo void na assinatura do mtodo. Exemplos : public int getAge () { return age; } public String getName () { return name; }

O comando return utilizado para passar o valor requerido de volta para quem chamou o mtodo e obrigatrio quando o tipo de retorno no void. Ele deve receber um nico valor ou uma expresso que deve ser compatvel com o tipo de retorno especificado para o mtodo. Quando o comando encontrado, o mtodo termina sua execuo imediatamente, ignorando todas as instrues subsequentes. Um comando return sem valor de retorno retorna o tipo void, mas no obrigatria sua utilizao nestes casos. 5.5 Passando Parmetros para um Mtodo Passando um Primitivo : Quando um valor primitivo passado na chamada de um mtodo, uma cpia deste valor criada e atribuda para o argumento do mtodo responsvel por receb-la. Se o mtodo mudar este valor, apenas o valor do argumento local ao mtodo afetado. Quando o mtodo terminar sua execuo, o29

valor original da varivel utilizada para passar o valor primitivo na chamada do mtodo permanecer inalterado. public void incrementa (int num) { num++; int num = 10; System.out.println(num : + num); } incrementa (num); Imprimir 11 System.out.println(num : + num); Imprimir 10

Passando a Referncia de um Objeto : Quando o tipo passado para o mtodo no for um primitivo mas sim um objeto, esse comportamento muda. Quando passamos um objeto, uma referncia ao objeto original passada ao invs de uma cpia do objeto. A referncia contm o endereo de memria onde est contido o objeto original e qualquer modificao feita pelo mtodo no argumento que recebeu esta referncia afetar tambm o objeto original. StringBuffer texto = new StringBuffer("Texto inicial!"); System.out.println("O valor de texto : " + texto); concatMsg(texto); System.out.println("O valor de texto : " + texto);Texto inicial! Texto inicial! Esta frase foi acrescentada ao objeto dentro do mtodo!

StringBuffer

public void concatMsg (StringBuffer msg){ msg.append(" Esta frase foi acrescentada ao objeto dentro do mtodo!"); }

30

Exerccios : 1) Digite e execute o cdigo abaixo, onde um objeto da classe String passado como parmetro para um mtodo. Ocorreu algo de inesperado? Procure explicar o que. public class testeMetodos{ public testeMetodos() { } public void concatMsg (String msg){ System.out.println("O valor de texto : " + msg.concat("Esta frase foi acrescentada ao objeto dentro do mtodo!")); } public static void main(String[] args) { testeMetodos testeMetodos1 = new testeMetodos (); String texto = new String("Texto inicial!"); System.out.println("O valor de texto : " + texto); testeMetodos1.concatMsg(texto); System.out.println("O valor de texto : " + texto); } }

31

6 Classes e Objetos em JavaA orientao a objeto a tcnica de desenvolvimento e modelagem de sistemas que facilita a construo de programas complexos a partir de conceitos que nos permitem modelar o mundo real to prximo quanto possvel da viso que temos desse mundo. Enquanto o desenvolvimento estruturado baseia suas abstraes para compreenso de um problema nos procedimentos necessrios para sua soluo, a orientao a objetos nos permite model-lo num nvel maior de abstrao, atravs da identificao natural que fazemos das entidades que o compe, caracterizando-as a partir de certas propriedades que definem seus principais aspectos estruturais e comportamentais. Objetos so um conjunto de dados mais um conjunto de procedimentos que representam a estrutura e o comportamento inerentes s entidades, concretas ou abstratas, do mundo real. Entidades concretas so aquelas que representam objetos concretos tais como um carro ou um avio. Possuem uma coleo de atributos (material, caractersticas mecnicas, custos, mtodos construtivos) e uma coleo de mtodos prprios que manipulam e fornecem respostas a partir dos valores desses atributos (reaes, deslocamentos, custo total). Alm destas, entidades no to concretas, como a representao de elementos geomtricas num plano, por exemplo, so tratadas como objetos. Nesse caso, a estrutura composta por atributos que constituem variveis como o nmero de lados e valores dos ngulos internos e o comportamento ditado por mtodos que informam a rea ou algum outro valor que servir de contribuio para a soluo de um problema matemtico. Na Programao Orientada a Objeto (POO), nada impede que a essncia de um objeto seja o processamento ao invs da estruturao ou vice-versa. Na verdade, objetos podem ser, em princpio, o modelo de qualquer coisa, desde um processamento puro at um dado puro, sendo todos, sob a tica da POO, igualmente considerados objetos. O paradigma da orientao a objetos prev a definio de objetos como principal artifcio na modelagem de uma aplicao. Sendo assim, a primeira atividade a ser executada na implementao de uma aplicao orientada a objetos a identificao dos objetos que a compe e suas propriedades. Essa identificao sempre depende do propsito, porque o propsito que permite determinar quais informaes sero representadas e que operaes sero executadas pelos objetos. Em outras palavras, a identificao de quais atributos e mtodos ter um objeto depende sempre do contexto da aplicao, de como pretendemos usar o objeto. S tendo isso em mente podemos levantar os atributos e mtodos relevantes ao objeto e suprimir aqueles irrelevantes para o sistema em questo. A classe a construo de linguagem mais comumente utilizada para implementar um objeto em linguagens de programao orientada a objeto. Objetos com a mesma estrutura e o mesmo comportamento pertencem a mesma classe de objetos. O conjunto de dados de um objeto chamamos atributos e o conjunto de procedimentos de mtodos do objeto. Uma classe, portanto, uma descrio dos atributos e dos mtodos de determinado tipo de objeto. Em termos de programao, definir classes significa formalizar um novo tipo de dado e todas as operaes associadas a esse tipo, enquanto declarar objetos significa criar variveis do tipo definido. Uma instncia um objeto gerado por uma classe. A classe apenas a representao de um objeto enquanto a instncia de uma classe o objeto propriamente dito, com tempo32

e espao de existncia. O contedo de um objeto, ou seu estado interno, definido por suas variveis de instncia (atributos), sendo que dois objetos diferentes da mesma classe podem possuir valores diferentes para seus atributos e conseqentemente apresentarem estados internos diferentes. Exemplo: public class Ponto { double x; double y; void girar (int grau, Ponto ponto) {Os atributos ou variveis de instncia formam o estado interno de um objeto. Eles definem os dados que um objeto deve possuir. Os mtodos representam as operaes que um objeto pode executar. Estas operaes podem, dentre outras coisas, alterar o estado interno do objeto.

//Cdigo para girar esse ponto em torno de outro } } Ponto P1;Aqui, estamos definindo uma varivel do tipo Ponto. Dizemos que P1 uma instncia da classe Ponto, isto , corresponde a um objeto desta classe.

Estudo de Caso Vamos analisar o problema abaixo extrado da computao grfica: Desenhar um crculo na tela do computador. Deve ser possvel configurar a cor que o crculo estar preenchido bem como seu dimetro. Dado o problema e seus requisitos, devemos proceder com a modelagem do mesmo, isto , analisar suas caractersticas para decidir qual a melhor forma de representar a soluo numa abordagem orientada a objetos. Vamos supor que no esteja disponvel uma rotina que execute o que se pede. A nica coisa que sabemos como imprimir na tela do computador uma linha dado seus pontos de origem e destino. Sendo assim, baseado no que sabemos fazer, teremos que analisar o problema at conseguirmos decomp-lo em estruturas mais primitivas que, quando combinadas, iro produzir uma soluo. Os passos de raciocnio poderiam ser estes: Deve ser possvel configurar o dimetro do crculo e o dimetro mede duas vezes o raio. O raio pode ser representado por uma linha cujo ponto inicial o centro do crculo e o ponto final sua extremidade. Uma linha formada por dois pontos, cada um com suas coordenadas (x,y) e possui uma cor. Uma cor definida por seus componentes RGB (Red, Green, Blue). Bem, se sabemos pintar uma linha na tela, podemos definir o raio do crculo e ir pintando uma linha do lado da outra, mantendo as coordenadas do centro constantes e calculando as coordenadas da extremidade de forma que represente um grau de distncia da linha anterior at completar 360.

De acordo com a descrio acima, podemos identificar 4 entidades com caractersticas prprias e que so candidatas a tornarem-se objetos da nossa aplicao: cor ponto linha circulo33

Em Java, os dados e os mtodos pertinentes a cada uma dessas entidades poderiam ser modelados nas seguintes classes: public class Cor { double Red; double Green; double Blue; } public class Ponto { double x; double y; void girar (int grau, Ponto p) { Compoenentes RGB da cor

Coordenadas do ponto

Mtodo que implementa o comportamento do ponto de saber girar em torno de outro.

//Cdigo para girar o ponto em torno de outro ponto p a quantidade definida em //grau } } public class Linha { Ponto a; Ponto b; Cor color; void imprimeLinha() { Uma classe pode (deve) ser construda a partir de outras. A este relacionamento d-se o nome de agregao. Neste caso, a classe Linha utiliza as classes Ponto e Cor para compor seus atributos. Ela tambm possui um mtodo que implementa a operao de impresso da linha.

//Cdigo para imprimir essa linha na tela } } public class Crculo { final int GRAU = 360; Linha raio; Cor cor; void criaCrculo () { A classe Crculo a abstrao de mais alto nvel desse problema. Na verdade, criamos todas as outras classes para conseguirmos no final gerar um crculo na tela. O fato de quebrarmos um grande objeto (problema) em um nmero de objetos de mais baixo nvel, consiste numa abordagem eficaz para compreendermos problemas complexos e possibilita freqentemente a reutilizao destes objetos na soluo de outros problemas.

raio.imprimeLinha(); for (int i = 0 ; i < GRAU ; i++) { //gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro) raio.b.girar(i, raio.a); //imprime a linha resultante Este mtodo utiliza a Linha que raio.imprimeLinha(); representa o raio do crculo e gera um crculo da mesma cor da linha. A }//fim for funcionalidade do mtodo }//fim criaCirculo basicamente executada por chamadas a }//fim Circulo mtodos de outras classes, simplificando sua implementao.

34

A classe Crculo foi composta basicamente pela agregao de outras classes que implementam funcionalidades mais especficas. Essa abordagem bottom-up no tratamento de um problema, onde pequenos mdulos so agrupados para gerarem outros maiores e com funcionalidades mais complexas, facilita a implementao, aumenta a legibilidade do cdigo e melhora em muito a manutenibilidade da aplicao. 6.1 Encapsulamento Diferente da abordagem estruturada, onde dados e procedimentos so definidos de forma separada na cdigo, na programao orientada a objeto os dados e procedimentos que manipulam estes dados so definidos numa unidade nica, o objeto. Isso possibilita uma melhor modularidade do cdigo, porm, a idia principal poder utilizar os objetos sem ter que se conhecer sua implementao interna, que deve ficar escondida do usurio do objeto que ir interagir com este apenas atravs de sua interface. propriedade de se implementar dados e procedimentos correlacionados em uma mesma entidade e de se proteger sua estrutura interna escondendo-a de observadores externos d-se o nome de encapsulamento. O objetivo do encapsulamento separar o usurio do objeto do programador do objeto e seus principais benefcios so: possibilidade de alterar a implementao de um mtodo ou a estrutura de dados escondidos de um objeto sem afetar as aplicaes que dele se utilizam; criao de programas mais modulares e organizados, o que possibilita um melhor reaproveitamento do cdigo e melhor mantenabilidade da aplicao.

Via de regra, as variveis de instncia declaradas em uma definio de classe, bem como os mtodos que executam operaes internas sobre estas variveis, se houverem, devem ser escondidos na definio da classe. Isso feito geralmente atravs de construes nas linguagens de programao conhecidas como modificadores de acesso, como por exemplo o public, protected e private do Java. Quando definimos uma classe, recomendado (para alguns uma regra sagrada) que declaremos pblicos apenas os mtodos da sua interface. na interface (ou protocolo) da classe que definimos quais mensagens podemos enviar s instncias de uma classe, ou seja, quais so as operaes que podemos solicitar que os objetos realizem. Por exemplo, na classe Ponto acima, deveramos ter feito seus atributos protegidos e apenas o mtodo pblico: public class Ponto { private double x; private double y; public void girar (int grau, Ponto p) { //Cdigo para girar o ponto em //torno de outro ponto p a quantidade // definida em grau } public void setX (double k) { x = k; } public void setY (double k) { y = k; } public double getX () { return x; } public double getY () { return y; } }35

Os mtodos pblicos consistuem a interface da classe.

comum em programao orientada a objeto definir mtodos gets e sets que provm acesso aos dados protegidos da classe.

6.2 Criando Objetos e Acessando Dados Encapsulados Criamos objetos em Java de forma muito similar a criao de variveis de tipos primitivos. Se uma aplicao quisesse usar a classe Crculo, poderia declarar uma varivel deste tipo da seguinte forma: Crculo crculo; Como Java case-sensitive pode-se declarar desta forma.

Esta sentena cria uma varivel crculo do tipo Crculo. Entretanto, isso no suficiente para acessarmos os mtodos e atributos pblicos da classe. A sentena acima somente declara uma varivel mas no cria um objeto da classe especificada. Em Java, objetos so criados usando o operador new da seguinte forma: Crculo crculo; crculo = new Crculo(); O operador new cria uma instncia da classe e retorna a referncia do novo objeto. Como vimos, todos os objetos em Java so tratados atravs da referncia ao endereo de memria onde o objeto est armazenado. O operador new realiza trs tarefas: 1. Aloca memria para o novo objeto 2. Chama um mtodo especial de inicializao da classe chamado construtor 3. Retorna a referncia para o novo objeto importante compreender o que ocorre na declarao da varivel e na inicializao da varivel. Quando fazemos O null um valor vlido em Java epermite comparaes como:

Crculo crculo;

null

if (crculo == null)

reservado uma poro da memria principal do Java (stack) para armazenar o endereo na memria auxiliar (heap) onde o objeto ser armazenado. Como apenas com a declarao da varivel o objeto ainda no existe, o contedo inicial dela ser o valor nulo (null), indicando que ela ainda no se refere a nenhum objeto. Apenas aps a inicializao crculo = new Crculo();raio; cor;

que uma varivel de um tipo no primitivo estar valendo algo e atravs dela ser possvel acessar os dados e operaes do objeto em questo. Uma vez um objeto tendo sido criado, seus mtodos e atributos pblicos podem ser acessados utilizando o identificador do objeto (varivel que armazena sua referncia) atravs do operador ponto: . . A aplicao que criou o objeto Crculo acima pode solicitar ao objeto que ele se desenhe fazendo : crculo.criaCrculo();36

6.3 Construtores O construtor de uma classe um mtodo especial com as seguintes caractersticas: o primeiro mtodo executado por um objeto Deve ter o mesmo nome da classe No pode ter um tipo de retorno utilizado quando um objeto instanciado atravs do operador new Na maioria das vezes declarado como public

obrigatrio uma classe conter ao menos um construtor. Se uma classe for definida sem a presena de um, o compilador Java ir criar automaticamente um construtor default da seguinte forma:Construtores devem ter o mesmo nome da classe. O construtor default criado pelo compilador no executa comando algum e no possui nenhum parmetro.

Crculo() { }Construtores no devem ter tipo de retorno.

Na classe Crculo no definimos nenhum mtodo construtor, mas mesmo assim podemos criar a varivel crculo chamando o construtor default da classe. Como os construtores so os primeiros mtodos executados por um objeto eles geralmente so utilizados para inicializar variveis de instncia da classe, porm, nada impede que executem qualquer operao que se queira. Vamos alterar nossas classes acima e definir construtores para elas: public class Cor { Cor(double vermelho, double verde, double azul) { Red = vermelho; Grenn = verde; public class Ponto Blue = azul; { } private double x; double Red; private double y; double Green; Ponto(double p1,double p2){x = p1; y = p2;} double Blue; public void girar (int grau, Ponto p) { } //Cdigo para girar o ponto em //torno de outro ponto p a quantidade public class Linha // definida em grau } { public void setX (double k) { x = k; } Ponto a; public void setY (double k) { y = k; } Ponto b; public double getX () { return x; } Cor color; public double getY () { return y; } void imprimeLinha() { ... } } Linha(Ponto ori, Ponto dest, Cor c) { a = ori; b = dest; color = c; } }37

public class Crculo { final int GRAU = 360; Linha raio; Cor cor; Crculo() {}

Quando definimos algum construtor para a classe, temos que implementar manualmente o construtor default caso queiramos us-lo.

Crculo(Ponto centro, Ponto extremidade, Cor c) { raio = new Linha(centro, extremidade, c); cor = c; } Crculo (double x1, double y1, double x2, double y2, Cor c) { raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c); cor = c ; } void criaCrculo () { raio.imprimeLinha(); for (int i = 0 ; i < GRAU ; i++) { //gira o ponto b do raio (extremidade) i graus em relao ao ponto a (centro) raio.b.girar(i, raio.a); //imprime a linha resultante raio.imprimeLinha(); }//fim for }//fim criaCirculo }//fim Circulo Dado os construtores definidos, vamos analisar as possibilidades de implementao para se construir um crculo: Usando o construtor Crculo(): Se quisermos criar um crculo usando o construtor default, teremos que criar antes uma linha e uma cor e ento atribuirmos seus valores manualmente para o crculo.Crculo crculo = new Crculo(); Cor c = new Cor (1.0, 2.0, 1.0); Ponto p1 = new Ponto(0,0); Ponto p2 = new Ponto(2,0); Linha l = new Linha (p1, p2, c); crculo.raio = l; crculo.cor = c; crculo.criaCrculo();

Uma classe pode ter mais de um construtor.

Usando o construtor Crculo(Ponto, Ponto, Cor):Cor c = new Cor (1.0, 2.0, 1.0); Ponto p1 = new Ponto(0,0); Ponto p2 = new Ponto(2,0); Crculo crculo = new Crculo(p1,p2,c) crculo.criaCrculo();

38

Usando o construtor Crculo(double x1, double y1, double x2, double y2, Cor c):Cor c = new Cor (1.0, 2.0, 1.0); Crculo crculo = new Crculo(0, 0, 2, 0, c); crculo.criaCrculo();

Definir mais de um construtor para a mesma classe fornece maior flexibilidade para sua utilizao. 6.4 O Ponteiro this Todos os mtodos de instncia recebem um argumento implcito chamado this, que pode ser usado dentro do mtodo para se referir ao objeto ao qual aquele mtodo pertence. Mas para que iramos querer um ponteiro para o prprio objeto se dentro de um mtodo possvel acessar qualquer outro mtodo ou atributo da classe? Existem duas situaes onde devemos usar uma referncia explcita ao this: Quando o nome de uma varivel de instncia escondido por um argumento de um mtodo. Por exemplo, se tivssemos criado o construtor Crculo(Linha r) como Crculo (Linha raio) { raio = raio; cor = raio.color ; } a atribuio raio = raio no ia causar o efeito desejado pois onde raio aparece dentro do mtodo est se referindo ao argumento e no a varivel de instncia. Para este cdigo funcionar apropriadamente teramos que usar o ponteiro this da seguinte forma: Crculo (Linha raio) { this.raio = raio; cor = raio.color ; } Quando preciso passar uma referncia ao objeto corrente como argumento a um outro mtodo. Vamos supor a existncia de uma classe chamada Transforma capaz de realizar transformaes geomtricas num crculo qualquer. Vamos supor tambm que a classe Crculo possua um mtodo chamado Duplica() para duplicar seu tamanho e que este mtodo utiliza um objeto da classe Transforma. O cdigo de Duplica() : Duplica() { Transforma t = new Transforma(); t.duplicar(this); } Passa o prprio objeto como parmetro.

39

Exerccios : 1) Para iniciar a prtica deste captulo, voc deve modelar o problema descrito abaixo, que descreve o negcio da ACME Vdeo Locadora. Sero apresentadas inmeras informaes que ajudaro voc a determinar as classes, mtodos, atributos e associaes que compem o negcio. Fique livre para escolher o formato que pretende usar para comunicar o que voc encontrou. A ACME vdeo locadora est no negcio de aluguel de vdeos e estamos interessados neste momento em automatizar o processo de retirada das fitas. Este processo consiste do cliente, aps ter escolhido as fitas que deseja, lev-las at o balco de retirada. O funcionrio responsvel ir solicitar o nmero do carto de associado do cliente e depois cadastrar os IDs dos itens que este escolheu. Nossos clientes devem se cadastrar como associados antes de poderem efetuar qualquer locao. Ns armazenamos informaes como nome, endereo e telefone e cada cliente possui um ID nico que utilizar para efetuar as locaes. Quando uma locao efetivada, damos um nmero nico para ela que ser utilizado posteriormente para mantermos o controle da mesma. A efetivao de uma locao possui informaes como: data de incio, o cliente que solicitou e uma lista dos itens alugados. Para cada item alugado controlamos a data que deve ser devolvido e a data que realmente foi devolvido. A data de devoluo dependente de quantos dias um item pode permanecer emprestado, sendo assim, cada item pode ter uma data diferente. Os itens para emprstimo so atualmente apenas fitas de vdeo. Mas pretendemos alugar em breve jogos e DVDs. Cada item para emprstimo possui as seguintes informaes: preo do aluguel, o nmero de dias que pode permanecer emprestado, o ttulo do filme, [0][0] uma breve descrio (sinopse) e uma categoria (ao, aventura, etc). a) Identifique as classes que compem o negcio da ACME Locadora. Escreva uma breve descrio sobre ela para ter certeza de sua relevncia para o negcio. b) Identifique os atributos de cada uma das novas classes. Lembre-se que um atributo pode ser outra classe. c) Defina alguns comportamentos para cada uma das classes. 2) A partir da anlise do exerccio anterior, provavelmente (:-)) voc vai ter chegado nas seguintes classes, atributos e mtodos:ItemAlugado dataDevolucao dataDevolvida item getPreco() calcDataDevolucao Item Id titulo descricao categoria preco numeroDias setPreco getPreco ...

;;;Aluguel numeroAluguel dataInicio cliente AddItem() ... Cliente Id nome endereco telefone getNome() ...

40

Agora vamos iniciar a implementao da aplicao ACME Vdeo Locadora. Voc ir criar um projeto e adicionar as classes identificadas. Estas classes formam a base para a aplicao que ser desenvolvida no restante deste curso. a) Abra o projeto chamado ACMEVideo que deve conter um mtodo main. b) Crie a classe Cliente de forma que ela no contenha um mtodo main(), seja pblica e contenha um construtor default. Adicione ento os atributos privados da classe: int id String nome String endereco String telefone Adicione tambm mtodos pblicos para setar e pegar cada um dos atributos privados. Utilize um padro de nome como setId, setNome, getId, getNome, etc: void setId(int id){ this.id = id;} No mtodo main() do projeto crie dois clientes e estipule valores para seus atributos utilizando os mtodos pblicos da classe. At este momento no h uma forma de apresentar o contedo de um objeto cliente. Para remediar esta deficincia adicione classe Cliente o mtodo toString(), que retorna uma String contendo o id, nome do cliente, endereo e telefone. Voc pode usar o operador + para concatenar Strings. Chame este mtodo e imprima a String de retorno usando System.out.println(...). public String toString(){ return (atributo1 + + atributo2 ...); } c) Crie a classe Item como pblica, sem construtor e sem mtodo main(). Defina seus atributos privados e mtodos para setar (setId) e ler (getId) os atributos. int getId(){ return id;} Os atributos desta classe so: int id String titulo String descricao String categoria double preco int numeroDias Crie no mtodo main do projeto ACMEVideo alguns Itens para testar os mtodos.

41

Adicione classe um mtodo toString() que apresenta as variveis titulo, descrio e categoria. d) Vamos agora adicionar um outro construtor na classe Cliente. Este deve inicializar os atributos nome, endereo e telefone do objeto. Modifique o mtodo main() da aplicao ACMEVideo para usar o novo construtor. Compile e teste o programa imprimindo o contedo dos objetos Cliente criados para ter certeza que o construtor os inicializou corretamente. e) Adicione um construtor default que no faz nada para a classe Item e tambm um que inicialize os atributos titulo, descricao, categoria, preo e numeroDias. Modifique novamente o mtodo main() para usar este novo construtor e teste a aplicao como feito com a classe Cliente.

42

7 Mais Sobre Classes e Objetos7.1 Pacotes Um pacote uma coleo de classes que esto logicamente relacionadas. Um pacote consiste de todas as classes Java contidas num diretrio. Por exemplo, as classes da aplicao ACME Vdeo que estamos desenvolvendo em nossos exerccios localizam-se no diretrio do projeto chamado ACMEVideo e consequentemente fazem parte do pacote ACMEVideo. O nome do pacote deve ter o mesmo nome do diretrio onde as classes esto armazenadas e a declarao do pacote a qual uma classe pertence dever ser feita no incio do arquivo fonte da classe da seguinte forma: package ACMEVideo; Como sabemos, Java tem uma vasta biblioteca2 de classes que podem ser utilizadas para ajudar-nos no desenvolvimento de nossos programas. Para termos acesso a uma biblioteca Java em nossa aplicao devemos utilizar o comando import da seguinte forma: import java.util.Vector; se quisermos utilizar apenas a classe Vector do pacote util, ou import java.util.*; se quisermos deixar todas as classes do pacote java.util disponveis para nossa aplicao. O comando import deve ser especificado antes da definio de todas as classes. O caminho java.util corresponde ao diretrio onde as classes do pacote util foram armazenadas, colocando-se o ponto (.) para referenciar a passagem de um diretrio para outro. importante ter em mente que, diferentemente do C, acrescentar pacotes num programa Java no implica em as classes contidas neles serem carregadas dentro do programa. Isto apenas instrui ao compilador e JVM onde procurar pelas classes que sero necessrias para a execuo. Resumindo, inserir comandos import no degrada a performance da aplicao. Alm de possibilitar uma melhor organizao, os pacotes servem para o Java desempenhar dois controles importantes: 1. Controle de nomes de classes: Dentro de um pacote no pode haver duas classes com o mesmo nome, porm, em pacotes diferentes, isto totalmente possvel. Se assim no fosse, teramos que nos certificar sempre que as classes que estamos desenvolvendo no possuem o mesmo nome de nenhuma classe em algum pacote que estejamos utilizando. Por exemplo, possvel definirmos uma classe chamada Vector pertencente ao pacote ACMEVideo. Se uma terceira classe X quiser utilizar a classe Vector do pacote util e a classe Vector do pacote ACMEVideo dever

2

Pacotes so distribudos em arquivos com extenso .JAR e consistem nas APIs do Java.43

especificar o nome completo dos pacotes na declarao das variveis da seguinte forma: class X { java.util.Vector atributo1; ACMEVideo.Vector atributo2; ... } 2. Controle de acesso: Vamos recapitular os mecanismos de controle de acesso a mtodos e atributos vistos no Captulo 5: public: o menos restritivo de todos. Atributos e mtodos declarados como public em uma classe podem ser acessados pelos mtodos da prpria classe, por classes derivadas desta e por qualquer outra classe em qualquer outro pacote (veremos mais classes derivadas posteriormente). protected: Atributos e mtodos definidos como protected so acessveis pelos mtodos da prpria classe e pelas classes derivadas. private: o mais restritivo. Atributos e mtodos declarados como private s podem ser acessados pelos mtodos da prpria classe.

Quando nenhum modificador definido (acesso do tipo package), os atributos e mtodos podem ser acessados pelos mtodos da prpria classe, pelas classes derivadas e por qualquer outra classe dentro do mesmo pacote. Alm disso, existem os modificadores de acesso a classes. A declarao de uma classe geralmente comea com o modificador de acesso public, o que significa que pode ser acessada por qualquer outra classe. Se for omitido, a classe ser visvel apenas por outras classes do mesmo pacote que a contm. 7.2 Atributos e Mtodos de Classe Variveis de classe so declaradas de forma semelhante s variveis de instncia, com a diferena de que devemos acrescentar a palavra reservada static: static tipo identificador [= valor]; Uma varivel de classe compartilhada por todas as instncias desta classe. Por exemplo, considerem a classe X e o trecho de cdigo que utiliza X: class X { public static int a = 10; ... } X var1 = new X(); X var2 = new X(); System.out.println(var1.a); //imprime 10 var1.a = 20; System.out.println(var2.a); //imprime 20

44

Quando var1 modifica a varivel de classe a, o novo valor visvel a todos os objetos desta classe, pois a representa a mesma posio de memria acessada por todos. Variveis de classe no podem ser inicializadas nos construtores. Se precisarem de inicializao, isto geralmente feito no momento da declarao da varivel. Mtodos de classe tambm so declarados com o auxlio do modificador static: [modificador] static tipo_retorno identificador ([argumentos]) { //Corpo do mtodo } Como um mtodo de classe compartilhado por todas as instncias da classe, ele no se refere a um objeto em particular e por isso no recebe o ponteiro implcito this. Mtodos de classe podem acessar somente variveis de classe e outros mtodos estticos. Uma caracterstica interessante dos mtodos estticos, bem como dos atributos, que eles podem ser acessados mesmo sem a existncia de uma instncia da classe. class X { public static int a = 10; static void setA(int x){ a = x; } ... } No exemplo acima, o mtodo e atributo esttico da classe X foram acessados diretamente referenciando-se a classe, sem a necessidade de criarmos uma instncia da mesma . Nas bibliotecas do Java encontramos inmeros casos de atributos e mtodos estticos. Nosso conhecido mtodo main(), por exemplo, um mtodo esttico, que chamado pela JVM quando uma aplicao executada. A classe Math prove mtodos de classe que executam vrias funes matemticas, como funes trigonomtricas e logaritmos. Um exemplo o mtodo Math.sqrt() que calcula a raiz quadrada de um nmero no negativo. A classe System prove variveis de classe para representar o estado do sistema inteiro. System.out uma varivel de classe que faz referncia ao objeto PrintStream, que representa o fluxo padro de sada. O mtodo println() um mtodo de instncia da classe PrintStream. 7.3 Destrutores e o mtodo finalize() Em linguagens como C, uma classe pode ter um destrutor, utilizado normalmente para liberar recursos requisitados pelo objeto, como memria alocada, arquivos abertos, etc. Java gerencia a memria automaticamente, ento um objeto no precisa liberar qualquer memria alocada. Consequentemente, Java no suporta destrutores. Ao invs disso, para permitir a um objeto liberar outros recursos (diferentes de memria), tal como arquivos abertos, Java possibilita a implementao de um mtodo finalize().45

... X.setA(20); System.out.println(X.a);

O mtodo finalize() chamado automaticamente quando um objeto coletado, portanto no possvel saber quando este ser chamado. Ele no possui tipo de retorno e no assume nenhum parmetro.

46

Exerccios : 1) Dada a classe abaixo, assinale as expresses que so corretas. public class Filme { private static float preco = 3.50f; private String taxa; public static void setPreco(float novoPreco) { preco = novoPreco; } public float getPreco() { return preco; } Filme.setPreco(3.98f); Filme mov1 = new Filme(); mov1.setPreco(3.98f); float a = Filme.getPreco(); float b = mov1.getPreco();

2) Nesta lio iremos melhorar as classes da lio passada com os recursos que aprendemos aqui. A classe Cliente possui dois construtores: um sem argumento e outro que recebe o nome, endereo e telefone de um cliente como parmetro. a) Crie uma varivel esttica e privada na classe Cliente do tipo inteiro e chamada proximoId. Esta deve ser inicializada com zero. b) Modifique o construtor default para que este incremente o valor desta varivel e atribua o resultado para o atributo id do novo objeto. c) Modifique o outro construtor para que ele chame o construtor default e desta forma tambm inicialize o atributo id. Obs: Em Java, para chamarmos um mtodo construtor dentro de outro mtodo qualquer, no podemos chamar o mtodo pelo seu nome mas sim utilizando a sintaxe abaixo: this (); d) Recompile e execute novamente a aplicao. Observe que agora o valor de id no mais zero. e) Qual a vantagem de se usar um atributo de classe para fazer o controle do id dos objetos? 3) Faa as mesmas modificaes para a classe Item, porm com a varivel esttica proximoId iniciando em 1000.

47

8 Herana e PolimorfismoNas sees anteriores aprendemos sobre classes, objetos e encapsulamento, conceitos fundamentais do paradigma da orientao a objeto. Nesta seo, abordaremos dois outros conceitos importantes e relacionados entre si: herana e polimorfismo. 8.1 Herana A herana a principal caracterstica de distino entre um sistema de programao orientado a objeto e outros sistemas de programao. As classes so inseridas em uma hierarquia de especializaes de tal forma que uma classe mais especializada herda todas as propriedades da classe mais geral a qual subordinada na hierarquia. A classe mais geral denominada superclasse e a classe mais especializada subclasse. O principal benefcio da herana a reutilizao de cdigo. A herana permite ao programador criar uma nova classe programando somente as diferenas existentes na subclasse em relao superclasse. Isto se adequa bem a forma como compreendemos o mundo real, no qual conseguimos identificar naturalmente estas relaes. A fim de exemplificarmos este conceito, vamos considerar que queiramos modelar os seres vivos pluricelulares existentes no planeta. Podemos ento comear com a classe SerVivo abaixo:SerVivo

Ela modela as caractersticas que todo ser vivo deve possuir, como a capacidade de reproduzir-se ou a necessidade de alimentar-se. Sendo assim, a classe SerVivo define atributos e mtodos tais como: Atributos: Alimentos, Idade Mtodos: Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer

Os seres vivos por sua vez classificam-se em Animais e Vegetais, os quais possuem caractersticas prprias que os distingue:SerVivo

Animal

Vegetal

Analisando o problema em questo (o de modelar os seres vivos), ns naturalmente identificamos classes que so especializaes de classes mais genricas e o conceito de herana da orientao a objeto nos permite implementar tal situao. Os animais e vegetais antes de tudo so seres vivos e cada subclasse herda automaticamente os atributos e mtodos (respeitando as regras dos modificadores de acesso) da superclasse, neste caso, a classe SerVivo. Alm disso, as subclasses podem prover atributos e mtodos adicionais para representar suas prprias caractersticas. Por exemplo, a classe Animal poderia definir os seguintes mtodos e atributos: Atributos: Forma de Locomoo, Habitat, Tempo Mdio de Vida Mtodos: Locomover48

A herana na programao obtida especificando-se qual superclasse a subclasse estende. Em Java isto feito utilizando-se a palavra chave extends: public class SerVivo { //Definio da classe SerVivo } public class Animal extends SerVivo { //Atributos e mtodos adicionais que distinguem um Animal de um SerVivo //qualquer } Em Java, todas as classes, tanto as existentes nas APIs como as definidas pelos programadores, automaticamente derivam de uma superclasse padro, a classe Object. Se uma classe no especifica explicitamente uma superclasse, como o caso da classe SerVivo, ento podemos considerar que esta deriva diretamente de Object, como se ela tivesse sido definida como: public class SerVivo extends Object { ... } Alm disso, Java permite apenas herana simples, isto , uma classe pode estender apenas de uma nica outra classe. Resumindo, a classe SerVivo define os atributos e mtodos que so comuns a qualquer tipo de ser vivo. A subclasse Animal herda estes mtodos e atributos, j que Animal um SerVivo , e tem que especificar apenas seus atributos e mtodos especficos.SerVivo Alimentos, Idade Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer Animal Habitat, Locomoo, TMV Locomover

8.2 Polimorfismo O termo Polimorfismo origina-se do grego e quer dizer "o que possui vrias formas". Em programao est relacionado possibilidade de se usar o mesmo nome para mtodos diferentes e capacidade que o programa tem em discernir, dentre os mtodos homnimos, aquele que deve ser executado. De maneira geral o polimorfismo permite a criao de programas mais claros, pois elimina a necessidade de darmos nomes diferentes para mtodos que conceitualmente fazem a mesma coisa, e tambm programas mais flexveis, pois facilita em muito a extenso dos mesmos. O polimorfismo pode ser de duas formas, esttico ou dinmico: Polimorfismo Esttico: Ocorre quando na definio de uma classe criamos mtodos com o mesmo nome porm com argumentos diferentes. Dizemos neste caso que o mtodo est sobrecarregado (overloading). A deciso de qual mtodo chamar tomada em tempo de compilao, baseada nos argumentos que foram passados.49

Como exemplo de polimorfismo esttico, podemos relembrar dos vrios construtores que criamos para a classe Crculo no Captulo 6: Crculo() {} Crculo(Ponto centro, Ponto extremidade, Cor c) { raio = new Linha(centro, extremidade, c); cor = c; } Crculo (double x1, double y1, double x2, double y2, Cor c) { raio = new Linha(new Ponto(x1, y1), new Ponto(x2, y2), c); cor = c ; } Todos estes mtodos construtores possuem o mesmo nome mas devem ser diferidos entre si pelos parmetros que recebem. Quando num programa fazemos Crculo circulo = new Crculo(linha); o compilador consegue decidir em tempo de compilao qual mtodo chamar, neste caso, o mtodo Crculo que recebe uma linha como parmetro. Polimorfismo Dinmico: Esta associado com o conceito de herana e ocorre quando uma subclasse redefine um mtodo existente na superclasse. Dizemos neste caso que o mtodo foi sobreescrito (overriding) na subclasse. A deciso de qual mtodo executar tomada somente em tempo de execuo, como veremos mais adiante. O polimorfismo dinmico ocorre quando uma subclasse redefine um mtodo de sua superclasse a fim de prover ao mtodo um comportamento mais adequado s suas caractersticas. Vamos rever a classe animal conforme a definimos acima class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } } Como nem todo ser ser vivo nasce, cresce, alimenta-se, respira, se reproduz e morre da mesma maneira, razovel que queiramos redefinir todos estes mtodos na classe animal

50

class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } public void nascer() { ... } public void crescer() { ... } public void alimentar() { ... } public void respirar() { ... } public Animal reproduzir() { ... } public morrer() { ... } } Os mtodos na subclasse devem ser definidos com a mesma assinatura do mtodo na superclasse, isto , com o mesmo nome, tipo de retorno e argumentos. Bem, mas a vantagem do polimorfismo dinmico no apenas a de permitir maior flexibilidade na modelagem das classes de objetos. Para entendermos o que h de mais fantstico nele, temos que nos atentar para o seguinte: ... SerVivo x; Declara uma varivel x do tipo SerVivo Animal y = new Animal(); Declara e inicializa uma varivel y do tipo Animal x = y; ... extremamente comum e til em OO atribuirmos a uma varivel de um tipo base um objeto de um tipo derivado direta ou indiretamente deste tipo base.

Tendo isto em mente, poderamos definir um mtodo da seguinte forma void analisaSerVivo (SerVivo ser) { //Este mtodo faz a anlise clnica de qualquer SerVivo e para isso precisa pedir //ao animal que respire ser.respirar(); ... } e num determinado momento cham-lo desta maneira ... Animal animal = new Animal(); analisaSerVivo(animal); ... Neste caso fica a questo, se o mtodo tem um argumento declarado como SerVivo e recebe como parmetro um objeto Animal, quando tiver que executar o mtodo

51

respirar() qual mtodo ser efetivamente chamado, o mtodo respirar definido em SerVivo ou o mtodo respirar definido em Animal? O mtodo executado ser o mais apropriado, isto , aquele pertencente ao objeto que foi passado varivel, neste caso, o mtodo respirar existente em Animal. Isto o polimorfismo dinmico, que recebe este nome porque o compilador no consegue nestes casos decidir em tempo de compilao qual mtodo chamar, j que uma varivel de um tipo base pode receber qualquer tipo derivado. Esta deciso feita apenas em tempo de execuo, quando a o Java poder saber qual objeto a varivel est de fato referenciando. Se o polimorfismo dinmico no existisse, seria necessrio um mtodo analisaSerVivo para cada ser vivo existente, e sempre que um ser vivo novo fosse acrescentado o cdigo teria que ser modificado. Da forma como aqui est, o mtodo continuar funcionando para qualquer ser vivo existente no projeto. 8.3 Criao de um objeto de uma subclasse e o ponteiro super Objetos so sempre construdos da classe mais alta na hierarquia em direo mais baixa, isto , da classe Object at a classe que est sendo instanciada com o operador new. Isto garante que uma subclasse pode sempre contar com a construo apropriada de sua superclasse. Por padro, os construtores default das superclasses (aqueles sem argumentos) o que so chamados quando a superclasse criada. Se quisermos mudar este comportamento devemos usar o ponteiro super. O ponteiro super uma referncia para a superclasse e est disponvel implicitamente em qualquer classe que possua um ancestral. Como vimos, os mtodos na superclasse podem ser sobreescritos na subclasse atravs da criao de mtodos na subclasse com a mesma assinatura do mtodo da superclasse. Com o super possvel acessar um mtodo especfico da superclasse quando este foi sobreescrito pela subclasse. Por exemplo, vamos recordar a classe Animal definida acima que implementava sua prpria verso de todos os mtodos de sua superclasse, isto , SerVivo: class Animal extends SerVivo{ String formaLocomoo; String habitat; int tempoMdioVida; public void locomover() { ... } public void nascer() { ... } public void crescer() { ... } public void alimentar() { ... } public void respirar() { ... } public Animal reproduzir() { ... } public morrer() { ... } }

52

Vamos supor que num determinado momento quisssemos acessar o mtodo alimentarse tal qual como este foi implementado na superclasse. Para isto devemos usar o ponteiro super da seguinte maneira: ... super.alimentar(); ...Acessa o mtodo alimentar-se de SerVivo.

Bem, mas como afinal de contas podemos mudar o comportamento padro de quando uma subclasse instanciada os construtores default serem executados? Um dos usos mais comuns da referncia super chamar um construtor de uma superclasse. Para isso, este deve ser acrescentado na primeira linha do construtor da subclasse. Por exemplo, se a classe SerVivo tiver um construtor que receba a idade do ser vivo como parmetro SerVivo(int idade){ this.idade = idade; } e queremos que este construtor seja chamado quando a classe Animal for instanciada ao invs do construtor padro SerVivo(), fazemos Animal (int idade){ super(idade); ... } 8.4 Mtodos e Classes final Vimos no Captulo 3 que para criar variveis que so constantes devemos usar o comando final. Vamos agora ver duas novas utilizaes para ele: Mtodos final: Mtodos definidos como final no podem ser sobreescritos. Geralmente isto feito com o intuito de garantir segurana, prevenindo que mtodos vitais, tais como aqueles que fazem autenticao de usurios, sejam redefinidos. Exemplo: public final boolean checkPassword(String p) { ... } Classes final: Uma classe declarada como final no poder ser estendida por outra classe. Esta uma forte deciso no projeto e significa que a classe auto-suficiente para dispor de todos os seus requisitos atuais e futuros. Classes definidas como final podem ajudar o compilador a produzir cdigos mais otimizados. Como uma classe final no pode ser estendida, quando o compilador encontra uma chamada a algum mtodo desta classe ele no gerar o cdigo necessrio para execuo do polimorfismo dinmico, o qual acarreta um overhead durante a execuo, mas sim far um acoplamento esttico com o mtodo em questo.53

Exerccios: Nesta lio voc vai adicionar duas novas classes que derivam de Item. A ACME Vdeo Locadora decidiu expandir seus negcios e comear a alugar jogos alm dos vdeos. Como jogos possuem alguns atributos diferentes dos filmes, voc decidiu criar subclasses para cada um destes tipos de itens. Cada item possui seus prprios mtodos e redefinem o mtodo toString() da classe Item. Abaixo segue o diagrama UML que mostra o relacionamento entre Item, Filme e Jogos. A seta a notao UML para herana.Item int id String titulo String descricao double preco int numeroDias String categoria toString() getId() setId() ...

Filme String diretor int duracao toString() setDiretor() getDiretor() setDuracao() getDuracao()

Jogo int memoria String tipo toString() setMemoria() getMemoria() setTipo() getTipo()

Abra o projeto ACME Video da lio 8. 1) Defina uma nova classe Filme. a) Defina a classe Filme que estende a classe Item. A nova classe deve incluir os atributos e mtodos definidos no diagrama acima. b) Adicione um construtor que aceite a seguinte lista de atributos como argumentos: titulo, decricao, preco, numeroDias, categoria, diretor e duracao. c) Inclua uma chamada ao construtor da superclasse Item usando a seguinte sintaxe super(titulo, descricao, categoria , preco, numeroDias) na primeira linha deste construtor. d) Rescreva o mtodo toString() de forma que este retorne uma string com os valores concatenados de id, titulo, diretor e preco da seguinte maneira: 1001 (filme) A Vida Bela (Leonardo Benine) R$ 6,00

54

O texto deve mostrar (filme) para indicar que este item um filme. 2) Defina uma nova classe Jogo a) Defina a classe Jogo que estende a classe Item. A nova classe deve incluir os atributos e mtodos definidos no diagrama acima. b) Acrescente um construtor que aceite como argu