77
Introdução à Linguagem Java por Christian Cleber Masdeval Braz

52_Java

Embed Size (px)

Citation preview

  • Introduo Linguagem Java

    por Christian Cleber Masdeval Braz

  • 2

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

  • 3

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

  • 4

    1 Introduo ao Java A 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.

  • 5

    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.

  • 6

    MeuPrograma.java => Cdigo fonte Compilao => javac

    MeuPrograma.class => Bytecode

    Execuo => java 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();

    _______________

    _______________

    JVM

    DOS

    JVM

    SCO

    JVM

    Win

    JVM

    Linux

    JVM

  • 7

    1.7 Produtos e Terminologias da Tecnologia Java Produto Descrio Java Virtual Machine (JVM) Interpreta arquivos .class (bytecode) para

    instrues especficas de plataforma. Java Runtime Environment (JRE) 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.

    Application Program Interface (API) Biblioteca de classes e interfaces que auxiliam no desenvolvimento das aplicaes.

    Java Developer`s Kit (JDK) 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.

    Java 2 Platform, J2SE (Standard Edition ) 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.

    Javadoc 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.

  • 8

    2 Estrutura bsica de um programa O 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 Definio de Mtodos System.out.println(mensagem);

    } public static void main (String [] args) { Imprime_Msg(); Corpo do Programa } } 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 _ 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 por

  • 9

    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

  • 10

    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. Tamanho do segundo parametro : 2 Nmero de parametros : 2

  • 11

    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);

    }

    }

  • 12

    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; } }

  • 13

    3 Variveis e Operadores Uma 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 :

    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 Ilegais 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 :

    String msg = Exemplos de declarao de variveis ; int umInteiro, UmInteiro; float umFloat = 0.5; char caracter = i; boolean flag = false; umInteiro = 90;

    a item_Cost itemCost _itemCost item$Cost itemCost2

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

  • 14

    abstract do implements package throw boolena double import private throws break else *inner protected transient byte extends instanceof public try case final int *rest *var *cast finally interface return void *catch float long short volatile char for native static while class *future new super *const generic null switch continue *goto operator synchronized default if *outer this

    *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.

    Categoria Tipo Tamanho

    Inteiro byte 8 bits Inteiro short 16 bits Inteiro int 32 bits Inteiro long 64 bits

    Ponto Flutuante float 32 bits Ponto Flutuante double 64 bits

    Caracter char 16 bits Lgico boolean true / false

    Inteiro 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.

  • 15

    Tipo Tamanho Variao byte 8 bits -128 a + 127 short 16 bits -32.768 a +32.767 int 32 bits -2.147.483.648 a +2.147.483.647

    long 64 bits 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 0 1998 -23456 Octal 02 077 0123 Hexadecimal 0x0 0x2a 0X1FF Long 365L 077L 0x1ffL

    Ponto Flutuante 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.

  • 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 Uma letra de a - z Retorno de carro A-Z Uma letra de A- Z \b Retrocesso do cursor \n Nova linha \u006F Valores Unicode \ Aspas duplas Tabulao \ Aspas simples Lgico Essa categoria tambm possui apvarivel do tipo boolean pode armaJava no associa valores numricosde programao. Tipos de Dados Armazenados por R Os tipos podem ser primitivos ounumricos, caracteres individuais representados por Classes, Interfacprincipal diferena entre os tipos palocada, em tempo de execuo, pexecuo no sabe quanta memria Na lista de tipos primitivos no encporque em Java strings so manipclasse String. Veremos mais sobre Todo programa em Java possui d(heap). Uma varivel do tipo prmemria principal. J uma varivmemria auxiliar e armazena naarmazenado o contedo da varivesquema : Mem (Tipo Primitivo)Var1 (Tipo Referncia) Var2

    e\t \r 16

    enas um tipo de dado que o tipo boolean. Uma zenar apenas dois valores lgicos : true ou false. O para true e false como ocorre em outras linguagens

    eferncia

    de referncia. Os primitivos representam valores e valores booleanos. Os tipos de referncia so es e Arrays e podem ser definidos pelo usurio. A rimitivos e de referncia a memria que deve ser ara uma varivel de referncia, pois o ambiente de ser necessria.

    ontramos um para tratar de strings de caracteres, isto uladas atravs de uma classe especfica para isso, a ela posteriormente.

    ois tipos de memria : principal (stack) e auxiliar imitivo armazena o seu contedo diretamente na el do tipo referncia armazena o seu contedo na memria principal apenas o endereo onde foi el. Abaixo segue uma representao grfica desse

    ria Stack Memria Heap valor

    ndereo

    valor(es)

  • 17

    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 () { Incio do bloco de x int x;

    { Incio do bloco de y int y; x = 10; OK ! A varivel x est sendo acessada dentro de seu

    bloco ! } Fim do bloco de y

    y = 20; 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 : 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;

    byte shortint

    long

  • 18

    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 Destino Tipo Original byte short int long float double char boolean

    byte C X Short C, P C X

    int C, P C, P C, P X long C, P C, P C, P C, P C C, P X float C, P C, P C, P C, P C, P X

    double C, P C, P C, P C, P C, P C, P X char C, P C C C C C X

    boolean X X X X 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 Exemplo = Atribuio int var1 = 0, var2 = 0;

    var2 = var1 + 10; var1 = var2 = 50;

    Operadores Aritmticos

    Operador Nome Exemplo Resultado + Adio 23+29 52 - Subtrao 29-23 6 * Multiplicao 0.5 * salario / Diviso 100/50 2

    % Mdulo (resto da diviso)

    20%3 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 !

  • 19

    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 Nome Exemplo Resultado = = Igual x = = 10 != Diferente 3 != 2 true < Menor 10 < 10 false > Maior 10 > 6 true

    >= Maior ou igual 3 >= 3 true 11 ) || (10 < 12 ) true ! NOT !( 1= = 4 ) true ^ XOR ( 1!= 0) ^ ( 2< 3 ) false

    Atribuio Composta

    Operador Nome Exemplo (x = 10;) Resultado

    += mais igual x += 10; 20 -= menos igual x -= 10; 10 *= vezes igual x *= 10; 100 %= mdulo igual x %= 10; 0 /= dividido igual x /= 10; 0

    Incremento e Decremento

    Operador ++ incrementa de um. Ex : int var1 = 4; var1++; //var1 = 5

    Operador -- decrementa de um Ex : int var1 = 4; var1--; //var1 = 3 Este decremento ou incremento pode ser feito antes ou depois da utilizao da

    varivel. Colocandose antes, primeiramente ser somado/subtrado 1 da varivel e depois ela ser utilizada. Ao contrrio, se o operador vier aps a varivel, primeiramente ela ser utilizada na expresso e o incremento ou decremento ser feito depois disso. Ex :

    int var1 = 2, var2; var2 = var1++; //var2 vale 2 var2 = ++var1; //var2 vale 3

    Precedncia de Operadores A precedncia refere-se a ordem na qual os operadores so executados. Operadores de mesma precedncia so executados de acordo com sua associatividade. Por exemplo, considere a seguinte linha de cdigo :

  • 20

    int j = 3 * 10 % 7; Os operadores * e % possuem a mesma precedncia e associatividade da esquerda para direita. Assim, o * executado primeiro, produzindo o resultado 2. Se fosse colocado um parnteses para modificar a precedncia desta forma int j = 3 * (10 % 7), o resultado final seria completamente diferente (9). A tabela baixo mostra os operadores Java em ordem de precedncia, onde a linha 1 tem a mais alta precedncia. Com exceo dos operadores unrios, condicionais e o operador de atribuio, os quais so associativos da direita para esquerda, todos os outros operadores com a mesma precedncia so executados da esquerda para direita. Precedncia Operador Comentrios Associatividade 1 ++ -- ! Operadores Unrios R 2 * / % Multi., Divi., Resto L 3 + - Add, Sub. L 4 > Shift L 5 < > = Relacionais L 6 = = != Igualdade L 7 & Bit/Loginal AND L 8 ^ XOR (ou exclusivo) L 9 | Bit/Logical OR L 10 && AND L 11 || OR L 12 ?: Condicional R 13 = op= Atribuio R R = Direita L = Esquerda 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;

  • 21

    Exerccios : 1 Encontre os erros nas declaraes de variveis no cdigo abaixo e os corrija. 1. byte sizeof = 200; 2. short $mom = 43; 3. short hello mom; 4. double old = 0.1 5. double new = 78; 6. boolean consequence_2 = true; 7. 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.

  • 22

    4 Controle de Fluxo A 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!!); }

    Expresso booleana formada pelos operadores lgicos e relacionais. Se a expresso boolenafor verdadeira (true), executa comando1, casoseja falsa (false), executa comando2.

  • 23

    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; }

    Deve resultar em char, byte, short ou int.

    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.

    Deve ser um literal ou uma constante !

    Exemplo : while ( i != 0 ){

    salario = salario * 0.5; i--;

    } Enquanto a expresso for verdadeira o lao ser executado

  • 4.4 Comando do - while Utilizado 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 );

    4.5 Com Comument ossui uma parte inicial com a inicializao das variveis, seguida por de comparao e depois a parte final com o incremento ou decremento lao. Sintaxe : for ( inicia {

    com}

    Pode-se declarar variveis na inicializao do for.

    O nico elemento realmente imprescind laos for sem a inicializao e/ou o incremento

    A inicializao e incremento podem ser feitos com mais de uma varivel. Neste caso

    devem estar separados por vrgula. 4.6 Comando break O break utilizado para transferir o con de lao (for, do-while, while) ou de um switch. Ovalor de comparao e o comando aps el

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

    Exemplo: for (i = 0; i < 20; i ++){

    salario = salario * 0.5; }

    for (int i = 0 ; i < 10 ; i++)comando;

    int 1 = 2; for ( ; i 2 ; i ++, j-- ) le svel a condio. possvel construir. lizao; condio; iterao ) andos; ando for

    e, um loop for p uma expresso das variveis do 24

    ao vai encerrar independentemente de seu er executado. Exemplo :

  • 25

    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

  • 26

    Exerccios : 1 Identifique e corrija os erros dos cdigos abaixo : 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 (1-12) 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/2000

    int x = 3, y = 5; 1 if (x >= 0) if (y < 0) System.out.println(y menor que x); else System.out.println(x negativo);

    int x = 7; 2 if (x = 0) System.out.println(x zero);

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

  • 27

    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 Anos no Bissextos 1996 1997 1984 2001

    2000 1900 1964 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

  • 28

    5 Mtodos Quando 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).

  • 29

    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 : 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 : 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, o

    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; }

    public int getAge () { return age;

    }

    public String getName () { return name;

    }

  • valor original da varivel utilizada para passar o valor primitivo na chamada do mtodo permanecer inalterado.

    int num = 10; 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);

    public void incrementa (int num) { num++; System.out.println(num : + num); }

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

    Texto inicial!

    Texto inicial! Esta frase foi acrescentada ao objeto dentro do mtodo!

    StringBuffer 30

  • 31

    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); } }

  • 32

    6 Classes e Objetos em Java A 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 tempo

  • e espao d istncia. O contedo de um objeto, ou seu estado interno, definido por suas variclasse podapresentare Exemplo: public clas{ double x double y void gira

    //C } } Ponto P1; Estudo de Vamos ana

    Dado o pristo , anasoluo nuuma rotinatela do cobaseado ndecomp-lsoluo. O Deve s

    raio. O raio

    o ponto Uma li

    uma co Uma co Bem, s

    pintande calcudistnc

    De acordoprprias e e ex 33

    veis de instncia (atributos), sendo que dois objetos diferentes da mesma em possuir valores diferentes para seus atributos e conseqentemente m estados internos diferentes.

    s Ponto

    ; ;

    r (int grau, Ponto ponto) {

    digo para girar esse ponto em torno de outro

    Caso

    lisar 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.

    oblema e seus requisitos, devemos proceder com a modelagem do mesmo, lisar suas caractersticas para decidir qual a melhor forma de representar a ma abordagem orientada a objetos. Vamos supor que no esteja disponvel que execute o que se pede. A nica coisa que sabemos como imprimir na mputador uma linha dado seus pontos de origem e destino. Sendo assim, o que sabemos fazer, teremos que analisar o problema at conseguirmos o em estruturas mais primitivas que, quando combinadas, iro produzir uma s passos de raciocnio poderiam ser estes:

    er possvel configurar o dimetro do crculo e o dimetro mede duas vezes o

    pode ser representado por uma linha cujo ponto inicial o centro do crculo e final sua extremidade. nha formada por dois pontos, cada um com suas coordenadas (x,y) e possui r. r definida por seus componentes RGB (Red, Green, Blue). e sabemos pintar uma linha na tela, podemos definir o raio do crculo e ir o uma linha do lado da outra, mantendo as coordenadas do centro constantes lando as coordenadas da extremidade de forma que represente um grau de ia da linha anterior at completar 360.

    com a descrio acima, podemos identificar 4 entidades com caractersticas que so candidatas a tornarem-se objetos da nossa aplicao:

    cor ponto linha circulo

    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.

    Aqui, estamos definindo uma varivel do tipo Ponto. Dizemos que P1 uma instncia da classe Ponto, isto , corresponde a um objeto desta classe.

  • 34

    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) {

    //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() { //Cdigo para imprimir essa linha na tela } } public class Crculo { final int GRAU = 360; Linha raio; Cor cor; 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

    Compoenentes RGB da cor

    Coordenadas do ponto Mtodo que implementa o

    comportamento do ponto de saber girar em torno de outro.

    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.

    A classe Crculo a abstrao de mais alto nveldesse problema. Na verdade, criamos todas as outrasclasses para conseguirmos no final gerar um crculona tela. O fato de quebrarmos um grande objeto (problema) em um nmero de objetos de mais baixonvel, consiste numa abordagem eficaz paracompreendermos problemas complexos e possibilitafreqentemente a reutilizao destes objetos nasoluo de outros problemas.

    Este mtodo utiliza a Linha que representa o raio do crculo e gera um crculo da mesma cor da linha. A funcionalidade do mtodo basicamente executada por chamadas a mtodos de outras classes, simplificando sua implementao.

  • 35

    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; } }

    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.

  • 36

    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 Crculo crculo; 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(); 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();

    null

    raio; cor;

    O null um valor vlido em Java e permite comparaes como:

    if (crculo == null)

  • especial com as seguintes caractersticas:

    m

    ncmo

    nosem a presena de um, o compilador Jadefault da seguinte forma: Crculo() { } Na classe Crculo no definimos nenhpodemos criar a varivel crculo chamando Como os construtores so os primeirosgeralmente so utilizados para inicializar impede que executem qualquer operao q Vamos alterar nossas classes acima e defin public class Cor { Cor(double vermelho, double verde, do Red = vermelho; Grenn = verde; Blue = azul; } double Red; double Green; double Blue; }

    e

    Construtores no devem ter tipo de

    public class Linha { Ponto a; Ponto b; Cor color; void imprimeLinha() { ... } Linha(Ponto ori, Ponto dest, Cor c) { a = ori; b = dest; color = c; } } objeto

    iado atravs do operador new public

    s um construtor. Se uma classe for definida va ir criar automaticamente um construtor

    O construtor default criado pelo compilador no executa comando algum no possui nenhum parmetro. retorno.

    Construtores devem ter o mesmo nome da classe. 6.3 Construtores O construtor de uma classe um mtodo o primeiro mtodo executado por u Deve ter o mesmo nome da classe No pode ter um tipo de retorno utilizado quando um objeto insta Na maioria das vezes declarado co obrigatrio uma classe conter ao me 37

    um mtodo construtor, mas mesmo assim o construtor default da classe.

    mtodos executados por um objeto eles variveis de instncia da classe, porm, nada ue se queira.

    ir construtores para elas:

    uble azul) {

    public class Ponto { private double x; private double y; Ponto(double p1,double p2){x = p1; y = p2;} 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; } }

  • 38

    public class Crculo { final int GRAU = 360; Linha raio; Cor cor; 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 ;

    } 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.

    Usando o construtor Crculo(Ponto, Ponto, Cor):

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

    Uma classe pode ter mais de um construtor.

    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();

    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();

  • 39

    Usando o construtor Crculo(double x1, double y1, double x2, double y2, Cor c): 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); }

    Cor c = new Cor (1.0, 2.0, 1.0); Crculo crculo = new Crculo(0, 0, 2, 0, c);crculo.criaCrculo();

    Passa o prprio objeto como parmetro.

  • Exerccios : 1) Para iniciar a prtica deste captulo, voc modelar o problema descrito abaixo,

    que descreve o negcio da ACME Vdeo adora. Sero apresentadas inmeras informaes que ajudaro voc a dete r as classes, mtodos, atributos e associaes que compem o negcio. F livre para escolher o formato que pretend comunicar o que voc encontrou.

    A ACME dora est no negcio de aluguel de vdeos e estamos interessados neste mom utomatizar o processo de retirada das fitas. Este processo consiste do cliente, scolhido as fitas que deseja, lev-las at o balco de retirada. O funcionrio el ir solicitar o nmero do carto de associado do cliente e depois cadastrar o Nossos clielocao. Npossui um Quando umposteriormpossui infoalugados. Para cada realmente pode perm Os itens paem breve jpreo do auma breve a) Identifi

    breve db) Identifi

    pode sec) Defina 2) A parti

    nas seg

    IdataDdataDitem getPrecalcD;;;

    numerdataInclienteAddIt... e usar para

    vdeo locaento em a aps ter e responsv

    s IDs dos itens que este escolheu.

    ntes devem se cadastrar como assos armazenamos informaes comoID nico que utilizar para efetuar a

    a locao efetivada, damos um ente para mantermos o controle drmaes como: data de incio, o c

    item alugado controlamos a datafoi devolvido. A data de devoluanecer emprestado, sendo assim, ca

    ra emprstimo so atualmente apenogos e DVDs. Cada item para emluguel, o nmero de dias que pode descrio (sinopse) e uma categoria

    que as classes que compem o neescrio sobre ela para ter certeza dque os atributos de cada uma das r outra classe. alguns comportamentos para cada u

    r da anlise do exerccio anterior, uintes classes, atributos e mtodos:

    temAlugado evolucao evolvida

    co() ataDevolucao

    Aluguel oAluguel icio

    em()

    CId nome enderecotelefone getNome...deve Loc

    rminaique 40

    ciados antes de poderem efetuar qualquer nome, endereo e telefone e cada cliente s locaes.

    nmero nico para ela que ser utilizado a mesma. A efetivao de uma locao liente que solicitou e uma lista dos itens

    que deve ser devolvido e a data que o dependente de quantos dias um item da item pode ter uma data diferente.

    as fitas de vdeo. Mas pretendemos alugar prstimo possui as seguintes informaes: permanecer emprestado, o ttulo do filme, (ao, aventura, etc).

    gcio da ACME Locadora. Escreva uma e sua relevncia para o negcio.

    novas classes. Lembre-se que um atributo

    ma das classes.

    provavelmente (:-)) voc vai ter chegado

    [0][0]

    Item Id titulo descricao categoria preco numeroDias setPreco getPreco ... liente

    ()

  • 41

    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.

  • 42

    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.

  • 43

    7 Mais Sobre Classes e Objetos 7.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.

  • especificar o nome completo dos pacotes na declarao das variveis da seguinte forma:

    class X {

    1; ributo2;

    2.

    7.2 Vadif Umex java.util.Vector atributoACMEVideo.Vector at ... } 44

    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.

    Atributos e Mtodos de Classe

    riveis de classe so declaradas de forma semelhante s variveis de instncia, com a erena de que devemos acrescentar a palavra reservada static:

    static tipo identificador [= valor];

    a varivel de classe compartilhada por todas as instncias desta classe. Por emplo, 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

  • 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. N e atributo esttico da classe X foram acessados dm NNpqUniqc 7 El

    Jmpa

    class X { public static int a = 10;

    . . . X.setA(20); System.out.println(X.a); . . . o exemplo acima, o mtodo

    static void setA(int x){ a = x; } } 45

    iretamente referenciando-se a classe, sem a necessidade de criarmos uma instncia da esma .

    as bibliotecas do Java encontramos inmeros casos de atributos e mtodos estticos. osso conhecido mtodo main(), por exemplo, um mtodo esttico, que chamado ela JVM quando uma aplicao executada. A classe Math prove mtodos de classe ue executam vrias funes matemticas, como funes trigonomtricas e logaritmos. m exemplo o mtodo Math.sqrt() que calcula a raiz quadrada de um nmero no egativo. A classe System prove variveis de classe para representar o estado do sistema nteiro. System.out uma varivel de classe que faz referncia ao objeto PrintStream, ue representa o fluxo padro de sada. O mtodo println() um mtodo de instncia da lasse PrintStream.

    .3 Destrutores e o mtodo finalize()

    m linguagens como C, uma classe pode ter um destrutor, utilizado normalmente para iberar recursos requisitados pelo objeto, como memria alocada, arquivos abertos, etc.

    ava gerencia a memria automaticamente, ento um objeto no precisa liberar qualquer emria alocada. Consequentemente, Java no suporta destrutores. Ao invs disso, para

    ermitir a um objeto liberar outros recursos (diferentes de memria), tal como arquivos bertos, Java possibilita a implementao de um mtodo finalize().

  • 46

    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.

  • Exerccios : 1) Dada a classe abaixo, assinale as expresses que so corretas. 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

    3) se Item, porm com a varivel esttica

    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(); objetos?

    Faa as mesmas modificaes para a clasproximoId iniciando em 1000. 47

  • 48

    8 Herana e Polimorfismo Nas 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: 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: 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: Locomover

    SerVivo

    SerVivo

    Animal Vegetal

  • 49

    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. 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.

    SerVivo Alimentos, Idade Nascer, Alimentar, Respirar, Crescer, Reproduzir, Morrer

    AnimalHabitat, Locomoo, TMV Locomover

  • 50

    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 tod