java apostila.pdf



Comments



Description

Linguagem JavaA partir de trechos meus [Jane Tavares A. da Silva - JTAS] e de trechos das apostilas do Prof. Adriano Caminha [AC], Prof. Francisco Santos [FS]. e da Prof a . Letícia Winkler [LK]. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 1 Bibliografia  Bibliografia básica: 1. DEITEL, H. M.; DEITEL, P. J. Java: Como Programar. 6ª Edição. São Paulo: Pearson Prentice Hall, 2005. 2. HORSTMANN, Cay; CORNELL, Gary. Core Java 2 – Volume I: Fundamentos. São Paulo: Pearson Makron Books, 2001.  Bibliografia complementar: 1. CAMARÃO, Carlos; Figueiredo, Lucília. Programação de computadores em Java. Rio de Janeiro: LTC, 2003 2. HORSTMANN, Cay S. Big Java. Porto Alegre ; Bookman, 2004. AVISO: Este material não pretende substituir nenhuma outra apostila, e muito menos qualquer livro. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 2 1. Introdução 1.1. Paradigmas das linguagens de programação [FS] A maioria das linguagens de programação são extensas e complexas e normalmente integram várias idéias. No entanto, cada linguagem baseia-se, normalmente, numa idéia central, ou paradigma.  Existem 4 paradigmas (principais) de programação: o Paradigma Imperativo: Baseado em comandos e procedimentos. Ex.: Pascal, C, Fortran. o Paradigma OO: Baseado em objetos e classes. Ex.: Java, Smalltalk, Simula, C++. o Paradigma Funcional: Baseado em funções. Ex.: Lisp, ML, Scheme, Haskell. o Paradigma Lógico: Baseado na lógica de predicados (fatos e regras) Ex.: Prolog.  Obs: Linguagens de Marcação (HTML) ≠ Linguagens de Programação. Linguagens de Marcação não especificam computações, elas apenas descrevem a aparência geral de documentos. 1.2. Fundamentos básicos de programação em Java [FS] Programação Estruturada x Programação Orientada a Objetos - POO A principal diferença entre o enfoque tradicional da análise estruturada e o enfoque da O.O. está na forma pela qual dados e procedimentos se comunicam.  Análise Estruturada  Ênfase nos procedimentos  Comunicação através de passagem de dados (parâmetros)  Programa = execução de procedimentos cuja tarefa é a manipulação de dados  Análise Orientada a Objetos (AOO)  Dados e procedimentos fazem parte de um só elemento básico (objeto ou classe)  Dados e procedimentos encapsulados em um só elemento. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 3 NOTE : Programação Estruturada DADOS + FUNÇÕES Programação Orientada a Objetos (POO) Atributos (dados) + Métodos (funções) 1.3.Vantagens e características da linguagem Java [JTAS]  Java como uma linguagem de programação:  Desenvolvida na década de 90 por James Gosling da Sun Microsystems  Orientada a Objetos  Independente de plataforma (portável) : Não há aspectos “dependentes da implementação”. Por exemplo: Os tipos primitivos têm tamanhos determinados .  Uso de recursos de rede  Segurança : Para ser usada em ambientes de rede/distribuídos. Mecanismos para sistemas livres de vírus e adulterações, pacotes para criptografia 128 bits, etc. (Não se pode provar que é 100% segura, mas é certamente a linguagem mais segura até hoje por causa destes mecanismos)  Simples (sintaxe similar a C/C++)  Internacionalização (UNICODE)  Distribuída e multitarefa : Os programas podem utilizar recursos na Internet com a mesma facilidade que acessam arquivos locais. Lidam com TCP/IP, HTTP, FTP.  Carga dinâmica de código : Java foi projetada para se adaptar a um ambiente em evolução. As bibliotecas podem adicionar livremente novos métodos e variáveis a qualquer instante (mesmo em execução).  Desalocação automática de memória (garbage collection) Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 4  Java possui 3 tipos de programas, levando em conta como e quando eles são executados:  Applications: programas stand-alone que englobam todos os recursos de acesso ao Sistema Operacional. Semelhantes aos programas convencionais.  Applets: programas que são carregados através de uma rede TCP/IP de um servidor remoto e são executados localmente pela JVM no escopo de um browser. A JVM impõe uma série de restrições aos applets por questões de segurança.  Servlets: programas que são executados remotamente em um servidor Web através de um servlet container. São usados para gerar conteúdo dinamicamente. 1.4. Conceitos Básicos em O.O.  Objeto  possui identidade, características e comportamentos  Classe  objetos com características semelhantes são agrupados em uma classe. Dados e procedimentos associados a uma classe são chamados de membros da classe. Ex. Sistema para informatização de uma loja comercial. Classe: Funcionário Objeto: José da Silva atributos: nome, endereço,data de admissão, salário base, etc. métodos (procedimentos): calcular salário liquido, mostrar dados, etc. 1.5. Alguns conceitos ERRADOS Sobre JAVA [AC] - Java é uma extensão do HTML. - Java é fácil de aprender: 1.500 classes e interfaces, sendo necessário conhecer muitas delas para se construir programas profissionais. - Java é um ambiente fácil de programação: existem ambientes gráficos de programação, mas o melhor caminho para se aprender é um editor simples como o bloco de notas. - Java é interpretada, ou seja, lenta para aplicações sérias: isto pode ser resolvido com o uso de compiladores JIT (Just In Time) que compilam na primeira vez que a aplicação é usada. Não importa que C++ seja mais rápida, Java é mais fácil de programar e é portável. - Todos os programas Java executam dentro de uma página Web. - Os applets Java são um grande risco à segurança: nenhuma linguagem é 100% segura, mas as falhas estão sendo corrigidas e o risco é muito menor que o encontrado em controles ActiveX. - Javascript é a versão mais simples da Java: Javascript foi inventada pela Netscape e apenas utiliza uma sintaxe parecida com a de Java, nada mais tem a ver com Java. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 5 1.6. A Plataforma Java – Características : [JTAS]  O termo plataforma normalmente é usada para designar um conjunto Hardware + Sistema Operacional.  A plataforma Java é definida apenas em software e possui dois componentes:  Máquina Virtual Java (JVM)  Conjunto de bibliotecas que disponibilizam funções comuns (API Java)  Diferentemente das linguagens convencionais, que são compiladas para código nativo, a linguagem Java é compilada para “bytecode" (gerando o .class) que é executado por uma máquina virtual (JVM – Java Virtual Machine). Bytecodes interpretados Código fonte  O modelo inicial (vide figura), que favorece a portabilidade do código, através da interpretação dos bytecodes, foi praticamente substituído por outro em que a interpretação dos bytecodes é substituída por outra compilação (a compilação dos bytecodes), que ocorre quando o programa é executado (compilador JIT , isto é, just-in-time). Essa mudança foi fundamental para tornar Java uma linguagem de alto desempenho. Obs.: compilar just-in-time : o código é compilado quando está em vias de ser executado.  A linguagem Java representa um esforço na direção do conceito write once, run everywhere (“escreva uma vez, execute em todo lugar”)  Uma máquina virtual (Virtual Machine – VM) pode ser definida como “uma duplicata eficiente e isolada de uma máquina real”.  A JVM é, então, uma máquina ‘imaginária” que é implementada através da emulação por software usando uma máquina real.  Com a JVM existe uma camada extra entre o sistema operacional e a aplicação, responsável por “traduzir” (não é apenas isso) o que sua Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 6 aplicação deseja fazer para as respectivas chamadas do sistema operacional no qual ela está rodando no momento. Veja a figura :  A especificação da Máquina Virtual Java fornece as especificações da plataforma de hardware para a qual todo o código Java está compilado. Essa especificação permite que os programas Java sejam independentes de plataforma .  A plataforma Java é composta por 3 outras plataformas:  J2SE ou Java SE (Java Standard Edition): é a base da plataforma e inclui o ambiente de execução e as bibliotecas comuns.  J2EE ou Java EE (Java Enterprise Edition): versão voltada para o desenvolvimento de aplicações corporativas. Ex: Servlets  J2ME ou Java ME (Java Micro Edition): versão voltada para o desenvolvimento de aplicações móveis ou embarcadas. Ex: celular 1.7. O Ambiente de Desenvolvimento [JTAS]  Java 2 System Development Kit (J2SDK)  Coleção de ferramentas de linha de comando para, entre outras tarefas, compilar, executar e depurar aplicações Java Ex: JRE, javac, javadoc, etc.  Java Runtime Environment (JRE)  Tudo o que é necessário para executar aplicações Java  Parte do J2SDK e das principais distribuições Linux, MacOS X, AIX, Solaris, Windows 98/ME/2000 Portanto, lembre-se de baixar o JDK (java development kit, ou seja, kit de desenvolvimento java), e não o JRE (java runtime environment, isto é, ambiente de execução java). O JDK já vem com um JRE, porém o contrário não é verdade. O Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 7 JRE vem sem compilador e ferramentas para desenvolvimento. Acesse o site da Sun (java.sun.com) ou o do JCreator (www.jcreator.com), que possui link para o site da Sun.(Oracle). 1.14. Exemplo de uma Aplicação  Estrutura de uma aplicação Java: [JTAS]  Uma aplicação Java é composta de um ou mais arquivos com extensão .java  Cada arquivo .java deve conter uma e somente uma classe pública.  O nome do arquivo .java tem que ser igual ao nome da classe pública que ele contém. Isso acontece porque a JVM usa o nome da classe para saber em que arquivo ela se encontra.  Cada arquivo .java quando compilado gera um arquivo com o mesmo nome com extensão .class. Esse é o arquivo que contém o bytecode que será executado pela JVM.  Os arquivos .java não precisam estar em um mesmo diretório. Eles podem ser organizados em uma hierarquia de diretórios de acordo com a finalidade de cada um. Esses diretórios são vistos pela JVM como os diversos pacotes que compõem a aplicação.  Podemos dizer, então, que uma aplicação Java mínima é composta de um único arquivo .java contendo uma única classe.  Um Programa Simples em JAVA [AC] - Veremos inicialmente o mais simples programa JAVA: package exemplo; public class Primeiro { public static void main (String[] args) { System.out.println(“É simples !!!”); } }//cuidado com as aspas do MS Word! São diferentes! - Esta mini-aplicação em Java imprime um texto na tela quando executada via linha de comando - Após compilar e executar este programa, nós vamos analisar suas partes principais, que se repetem na maioria dos programas JAVA: o A palavra-chave public é um modificador de acesso; esses modificadores controlam o que outras partes de um programa podem usar desse código; o A palavra-chave class está lá porque tudo em JAVA está dentro de uma classe; por enquanto, uma classe é um projeto preliminar para os Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 8 dados e métodos (funções) que serão parte do aplicativo; um aplicativo pode ser composto por uma ou mais classes; o Os nomes das classes (neste exemplo a palavra Primeiro) precisam começar com uma letra e depois desta quaisquer combinações de letras e dígitos; como padrão, os nomes são substantivos que iniciam com uma maiúscula; o Para começar a execução do programa compilado, o interpretador vai iniciar sempre pelo método main da classe indicada; é absolutamente necessária a presença do main (por se tratar de um aplicativo); o As chaves, { e }, delimitam os blocos de comandos em JAVA; o Os cabeçalhos do método main são sempre idênticos ao exemplo acima; o A palavra reservada static significa que o método é estático. Uma classe que contém apenas métodos estáticos pode ser executada sem a necessidade de instanciar a classe; o A palavra reservada void quer dizer que o método não retorna valor, não tem resposta para o método que o chamou; o Neste exemplo o método main contém apenas uma instrução (ou comando ou sentença da linguagem): a instrução utiliza o método println do objeto System.out, para exibir uma string na console padrão; cada chamada de println escreve uma nova linha; o Java usa a sintaxe geral: objeto.método(parâmetros); o Os métodos em JAVA podem ter zero, um ou mais argumentos, até mesmo o main, mas mesmo que o método não tenha argumentos, ele terá que possuir parênteses vazios na sua assinatura; o Existe também o método print em System.out, que imprime sem quebra de linha no final. o Comentários sobre pacote (package) :  Fica fácil notar que a palavra chave package indica qual o pacote que contém a classe Primeiro. Um pacote pode conter nenhum, um ou mais subpacotes e uma ou mais classes dentro dele.  Quando não se põe a linha do pacote, temos um pacote anônimo.  Os nomes dos pacotes devem ser formados apenas de letras minúsculas, não importa quantas letras estejam contidas nele.  Unidades de Compilação - Três elementos top-level conhecidos como compilation units, não obrigatórios, aparecem em um arquivo Java na seguinte ordem: o Declaração de pacote: package Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 9 o Declarações de importação: import o Definições de class, interface ou enum - Uma declaração de pacote serve para indicar um caminho de pastas onde deverão estar os arquivos (.class) do pacote. Por exemplo: package pasta1.pasta2; indica que os arquivos do pacote estão em pasta2 que está dentro de pasta1. Falaremos de pacote mais adiante. - Uma declaração de import serve para importar uma ou todas as classes de um pacote. O caminho indicado no import é justamente um caminho de pastas. Asterisco significa todos os arquivos da pasta (mas não das subpastas). - É preciso tomar cuidado com ambigüidade nos comandos import. Por exemplo, ao utilizar a classe Date, se importou java.util.* e java.sql.* (ambos contêm classes Date diferentes). Certifique-se de importar explicitamente Date do pacote desejado (por exemplo, java.util.Date). - Exemplo Modelo: package org.templojava; //nome do pacote pode ser o endereço web invertido import java.util.SimpleDateFormat; //importa classe import java.util.*; //o compilador importa classes utilizadas no código public class Exemplo { //codigo }  Pesquisando na Referência da Linguagem Java - Verifique a referência para cada nova classe que for estudada.  Acesse: http://java.sun.com/ Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 10 2. Estruturas Básicas de Programação[AC] 2.1. Comentários em JAVA - Os comentários não aparecem no executável do programa; em JAVA temos comentários de uma linha, sinalizados com //, e temos os comentários de mais de uma linha, entre /* e */: // Este é um comentário de uma linha /* Agora podemos escrever o comentário em várias linhas. */ - Os comentários não podem ser aninhados em JAVA, ao contrário de outras linguagens. 2.2. Tipos de Dados - JAVA é fortemente tipada, ou seja, as variáveis precisam ter um tipo declarado. - Há oito tipos primitivos de dados em JAVA: quatro tipos inteiros, dois tipos ponto flutuante, um tipo para caracteres e outro para variáveis lógicas. a) Inteiros [J TAS] Tipo Tamanho (bytes) Faixa de valores Tipo byte 1 -128 à 127 byte short 2 -32768 à 32767 short int 4 -2147483658 à 2147483657 int long 8 -9223372036854775808 à 9223372036854775807 long - O tipo int é o mais prático e o mais usado; - O mais importante é que os intervalos possíveis não dependem da máquina; b) Ponto Flutuante [J TAS] Tipo Tamanho (bytes) Faixa de valores float 4 ±3.40292347E+38 (6-7 dígitos decimais significantes) double 8 ± 1.79769313486231570E+308 (15 dígitos decimais significantes) Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 11 - O tipo double tem duas vezes a precisão do float. - O double é usado na maioria dos casos. - Os valores mínimos e máximos seguem os correspondentes na tabela dos inteiros. c) O Tipo Caracter (char) - Apóstrofos definem valores char; por exemplo ‘J’ é um caractere e “J” é uma string contendo um único caractere. A faixa é de 0 a 2 16 -1 (16 bits), conjunto Unicode de caracteres. Caracteres Especiais Seqüência de Controle Significado \b backspace (volta um caracter) \t tab (tabulação) \n linefeed (quebra de linha) \r carriage return (início da linha) \“ aspas duplas \’ Apóstrofos \\ barra invertida d) O Tipo Lógico (Boolean) - O tipo boolean tem dois valores possíveis, false ou true. e são armazenados em 1 byte. 2.3. Declaração de Variáveis em Java - Declaram-se as variáveis Java colocando o tipo primeiro e depois o nome da variável, finalizando com ponto e vírgula. - Exemplos: byte b; int numerointeiro1, numerointeiro2; long inteirolongo; //para o valor da nossa dívida externa em centavos char letra; - Um identificador precisa iniciar com uma letra e ser uma seqüência de letras ou dígitos; - Podem ser usados símbolos como ‘_’, ‘’ ou qualquer outro do Unicode (conjunto de caracteres utilizado por Java), mas não é aconselhável usar Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 12 principalmente caracteres com acento, por causa da diferença de conjuntos de caracteres nos vários sistemas operacionais (questão de visualização correta do símbolo). - Comumente não são usados símbolos para nomenclatura em Java, é mais simples usar letras e números, além de seguir as convenções para cada tipo de identificador (classes iniciam com maiúsculas, métodos com minúsculas, variáveis com minúsculas, constantes são escritas com maiúsculas, etc). - Não podem ser usados espaços em nomes de variáveis ou de identificadores quaisquer; 2.4. Atribuições e Inicializações - Deve-se inicializar uma variável antes de utilizá-la, em geral após a sua declaração ou na mesma instrução, exemplos: int numero; //esta é uma declaração numero = 5; //esta é uma atribuição char letra = ‘A’; //esta é uma inicialização - As declarações podem aparecer em qualquer lugar do código, mas uma variável só pode ser declarada uma vez em um bloco. 2.5. Constantes - A palavra final denota uma constante (utilize maiúsculas nos nomes das constantes): final double CMPORPOL = 2.54; Exemplo : public class Constantes { final double G = 9.81; //gravitação em metros por segundo ao quadrado public static void main (String[] args) { System.out.println(G + “ metros por segundo ao quadrado é a aceleração da gravidade.”); System.out.println(“A constante de classe G= ” + G + “ pode ser acessada em qualquer método da classe.”); } } 2.6. Operadores Aritméticos - Operadores aritméticos: + para adição, - para subtração, * para multiplicação e / para divisão; Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 13 - ATENÇÃO: o operador / denota divisão inteira se os dois argumentos forem inteiros e divisão de ponto flutuante se pelo menos um dos operandos for um número real. - O resto inteiro é denotado por %. Exemplos: (15 / 4) é 3, (15 % 2) é 1. - Pode-se utilizar inicializações do tipo: int n = 3; int dobroN = n * 2; - Pode-se utilizar a forma reduzida: n += 4; //que equivale a n = n + 4; 2.7. Exponenciação - Não há operador para exponenciação, deve-se usar o método pow da classe Math, ou seja, Math.pow(operando, expoente). - Para x a , temos: double y = Math.pow (x, a);  Outros métodos da classe Math - Math faz parte do pacote java.lang. Não é necessário importar este pacote, nunca. Podemos usá-la diretamente, com atenção para os argumentos de cada função. Verifique na referência de Java toda a lista de métodos de Math. Método Descrição Exemplo abs (x) Valor absoluto de x Se x = -3, então abs(x) é 3. ceil (x) Arredonda para o próximo inteiro maior que x Se x = 6.7, ceil(x) é 7. Se x = -6.8, ceil(x) é –6. floor (x) Arredonda para o próximo inteiro menor que x Se x = 6.7, floor(x) é 6. Se x = -6.8, ceil(x) é –7. max (x, y) Maior valor entre x e y max(3, 4) é 4. min (x, y) Menor valor entre x e y min(3, 4) é 3. sqrt (x) Raiz quadrada de x sqrt(9) é 3. PI Valor da constante PI 3.14159265358979323846 2.8. Operadores para Incremento e Decremento - Adicionar ou subtrair 1: int x = 10; x++; //adiciona 1 ao valor de x, x=11 x--; //subtrai 1 do valor de x, x=10 Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 14 int y = 5 + ++x; //incrementa x antes, y=16, x=11 //ou, se a posição do operador estivesse trocada: int y = 5 + x++; //incrementa x depois, y=15, x=11 2.9. Conversões entre Tipos Numéricos - Algumas conversões são permitidas diretamente: o byte  short  int  long  float  double o char  int  long  float  double - Em operações binárias, serão seguidas as seguintes regras: o Se um dos operandos for double, o outro será convertido para double; o Se um dos operandos for float, o outro será convertido para float; o Se um dos operandos for long, o outro será convertido para long; o Mesma regra para int, short e byte. - Ou seja, o “maior” tipo sempre manda na expressão, inclusive String (que veremos mais a frente). - Conversões explícitas de tipo ou casts são conversões onde são permitidas perdas de informação: double x = 9.997; int nx = (int) x; - Nesta conversão, a variável nx terá o valor final 9, pois a parte fracionária será descartada. - Se for necessário arredondar um número de ponto flutuante para o inteiro mais próximo, um dos métodos que pode-se usar é o método Math.round (Math é uma classe de java.lang, pacote padrão da linguagem): double x = 9.997; int nx = (int) Math.round (x); - Nesta conversão, a variável nx terá o valor final 10. Mas fique atento, round retorna um long, então ainda é necessário usar o cast se for preciso armazenar em uma variável de outro tipo. É aconselhável sempre testar os valores obtidos com conversões explícitas, a fim de garantir o resultado desejado. - O pacote java.lang é usado naturalmente na compilação, nunca é preciso incluir (importar) este pacote. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 15 2.10. Operadores Relacionais e Lógicos - Igualdade: (3 == 7) , tem resultado false; - Desigualdade: (3 != 7) , tem resultado true; - Os outros operadores mais comuns ‘>’, ‘<’, ‘>=’, ‘<=’, são usados nestas formas mesmo. - Para o and lógico, usa-se ‘&&’, para o ou lógico, usa-se ‘||’. O operador de negação é o ‘!’. 2.11. Hierarquia de Operadores e Parênteses - Como em todas as linguagens, é melhor usar parênteses para indicar a ordem das operações. A tabela de hierarquia de operações em Java é: Operadores Associatividade [], . (ponto), () (chamada de método) ESQ para DIR !, ~, ++, --, + (unário), - (unário) , () (cast), new DIR para ESQ *, /, % ESQ para DIR +, - ESQ para DIR <, <=, >, >=, intanceOf ESQ para DIR ==, != ESQ para DIR && ESQ para DIR || ESQ para DIR ?: ESQ para DIR =, +=, -=, *=, /=, %= DIR para ESQ 2.12. Strings - Strings são seqüências de caracteres como “tudo bem ?”. Não há um tipo String em Java, e sim uma classe predefinida chamada String, que faz parte do pacote padrão de Java. Cada conjunto de caracteres entre aspas é uma instância da classe String: String e = “”; //uma string vazia String saudacoes = “Olá”; a) Concatenação String uniao = “use o sinal de + para ” + “concatenar Strings”; b) Substrings - Java possui um método para se obter um subconjunto de uma string, que é o método nomestring.substring(posicaoinicial, posicaolimite) onde: o posicaoinicial é a primeira posição a ser inclusa na substring Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 16 o posicaolimite a posição imediatamente posterior à última a ser inclusa. - Lembre-se que em JAVA conta-se a partir do 0 (zero), ou seja, a primeira posição de uma string é a posição 0. String saudacao = “Bem vindo”; //0=B,1=e,2=m String s = saudacao.substring(0, 3); //s = “Bem” //o espaço na posição 3 não é incluído c) Edição de Strings - Para descobrir o tamanho de uma string, usa-se o método nomestring.length(): String saudacao = “Bem vindo”; int tamanho = saudacao.length(); //tamanho = 9 - Para descobrir o caracter na posição n de uma string, usa-se o método nomestring.charAt(n): String saudacao = “Bem vindo”; char letra3 = saudacao.charAt(2); //letra3 = m d) Teste de Igualdade entre Strings - Para testar se duas strings são iguais, usa-se nomestring1.equals(nomestring2). O valor true será retornado se forem iguais. Ex: String saudacao = “Bem vindo”; boolean igual = “Bem vindo”.equals(saudacao); //igual = true - Para testar se duas strings são iguais ignorando maiúsculas e minúsculas, usa- se nomestring1.equalsIgnoreCase(nomestring2).  Uma classe pré-definida - Métodos da Classe java.lang.String - A classe java.lang.String possui muitos métodos (verifique na referência da linguagem outros métodos também úteis). A referência da linguagem está acessível a partir de http://java.sun.com/ ou no javadoc que foi instalado junto com seu JDK. Seguem alguns métodos interessantes, dos quais uns já foram especificados acima: o charAt(int indice) //retorna o caractere na posição especificada o int compareTo(String outraString) //retorna um valor negativo se a string vier antes de outraString na //ordem do dicionário, um valor positivo se outraString vier antes e //0 (zero) caso forem iguais Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 17 o boolean endsWith(String sufixo) //retorna true se a string terminar com sufixo o boolean equals(String outra) //retorna true se a string for igual à outra o boolean equalsIgnoreCase(String outra) //retorna true se a string for igual à outra, ignorando maiúsculas e //minúsculas o String toLowerCase() //retorna uma nova string convertendo maiúsculas para minúsculas o String toUpperCase() //retorna uma nova string convertendo minúsculas para maiúsculas o String trim() //elimina espaços iniciais e finais 2.13. Comandos de Decisão a) Comando if - Forma mais simples: if (condicao) instrucao; - Com bloco de instruções: if (condicao) { instrucao1; instrucao2; ... } - Forma mais simples com else: if ( condicao ) instrucao1 else instrucao2; - Forma com else e bloco de instruções: if ( condicao ) { instrucao1; instrucao2; ... } else { instrucao1; instrucao2; ... } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 18 - Exemplo Maior.java: public class Maior { public static void main (String[] args) { int a = 5; int b = 3; if ( a > b ) { System.out.println(“O maior é ” + a); } else { System.out.println(“O maior é ” + b); } } } b) Seleções Múltiplas – A Instrução switch - A instrução if...else pode ser incômoda quando temos várias seleções com múltiplas alternativas. Com a instrução switch pode-se testar o tipo char e todos os inteiros menos long e não se pode usar conjuntos de valores, a não ser que a versão do JDK instalado seja a partir da 1.5 que aceita objetos Enumeration. (veja a referência da linguagem) - Exemplo (trecho de código): int opcao = 2; switch ( opcao ) { case 1: System.out.println(“A opção é 1.”); break; // fim do bloco para opcao = 1 case 2: System.out.println(“A opção é 2.”); break; case 3: System.out.println(“A opção é 3.”); break; default: System.out.println(“Opção inválida.”); break; // a cláusula default é opcional } - É possível ainda retirar o comando break de uma cláusula fazendo com que a execução prossiga para os comandos da cláusula seguinte, mas isso tem que ser feito com bastante cuidado. Nestes casos é aconselhável acrescentar um comentário no código. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 19 2.14. Comandos de Repetição a) Comando for (para-faça) - Se soubermos quantas vezes o conjunto de instruções deve ser processado, o mais simples é usar o comando for: for (instrucao1; expressao1; expressao2) { bloco } - Exemplo ContagemRegressiva.java: public class ContagemRegressiva { public static void main (String[] args) { for ( int i = 10; i > 0; i-- ) { System.out.println(“Contagem: ” + i); } System.out.println(“Lançamento!”); } } - É possível também criar laços for com variáveis e incrementos em ponto flutuante, com cuidado em relação aos erros de arredondamento dos valores (a expressão limite deve ser bem definida). Também é permitido utilizar laços com duas variáveis de controle. b) Comandos while (enquanto faça) e do-while (faça enquanto) - Usados quando não sabemos quantas vezes o conjunto de instruções deve ser processado. O while executa o corpo do laço apenas enquanto a condição for true (verdadeira): while ( condicao ) { bloco } - O while executa o teste da condição antes do início do bloco. Se for preciso executar pelo menos uma vez o bloco de comandos do laço, deve-se usar a versão do de um laço while: do { bloco } while ( condicao ); Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 20 3. Orientação a Objetos [JTAS] Como já foi estudado, as principais características do Paradigma OO são :  identidade  abstração  classificação  encapsulamento  herança  polimorfismo  Conceitos de OO 3.1. Objeto Um objeto é a representação computacional de um elemento ou processo do mundo real. Exemplos : casa, martelo, venda, programa, carro, ... Note que, esses objetos podem ser tanto objetos concretos (carro, livro, nota fiscal), quanto conceitos abstratos (conta corrente, venda, pessoa jurídica). Cada objeto possui estados e comportamentos. Um objeto possui identidade, características e comportamento. Vejamos cada um: a) Identidade : Todo objeto possui uma identidade única que permite que o sistema o selecione dentre um conjunto de objetos similares. Ou seja, a identidade possibilita a referência aos objetos b) Características : Uma característica descreve uma propriedade de um objeto, ou seja, algum elemento que descreva o objeto. Cada característica é chamada de atributo do objeto Exemplo : Objeto moto tem as seguintes características ou atributos : cor, marca, ano de fabricação, tipo de combustível c) Comportamento :  Definição: o Um comportamento representa uma ação ou resposta de um objeto a uma ação do mundo real (AÇÃO ou REAÇÃO) o Cada comportamento é chamado de método do objeto Obs. : Em C++, os métodos podem ser também chamados de funções membro. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 21  Exemplos de comportamento para o objeto moto o Acelerar o Parar o Andar o Estacionar Um sistema pode conter um ou inúmeros objetos ativos. Cada objeto ativo no sistema em particular também é chamado de instância. As diferentes instâncias possuem seu próprio estado. Exemplo : Objeto : Maria  Estado : Idade : 20 anos Altura : 1,60 m Peso : 58 Kg  Comportamento : andar, falar e pular Uma segunda característica de OO é a abstração, que “foca as características essenciais de algum objeto, de acordo com a perspectiva do observador.” Exemplo : Se pensarmos no conceito de “conta corrente” bancária e abstrairmos este conceito, podemos identificar detalhes comuns, como o número da conta, número da agência e saldo; e operações como débito em conta, depósito e extrato da conta. Basicamente essas são as características de conta corrente para todos os bancos, apesar de um ou outro banco ter uma política de descontos de taxas etc. À medida que refinamos um objeto, mais específico ele se torna e mais dependente do domínio da aplicação. A terceira característica de OO é a classificação. Na Classificação, Objetos com as mesmas características (atributos e comportamento) são agrupados em uma classe, sendo que cada classe define um conjunto possível de objetos. Exemplo : Objetos mesas  abstrair em  Classe Mesa Classe Mesa Atributos: tamanho, forma, número de pés, ___ material Operações : mover, limpar Atributos : idade, altura e peso Métodos : andar, falar e pular Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 22 3.2.Classes A classe descreve as características e comportamento de um conjunto de objetos :  Cada objeto possui uma única classe  O objeto possuirá os atributos e métodos definidos na classe  O objeto é chamado de instância de sua classe  A classe é o bloco básico para a construção de programas OO  Criação de Objetos:  A classe é responsável pela criação de seus objetos  Esta criação é realizada através de um método especial, chamado de construtor  Em Java, usa-se new para se criar um objeto.  Eliminação de Objetos  A classe é responsável pela eliminação de seus objetos, quando eles não podem mais ser utilizados pelo sistema  Esta eliminação é realizada por um método especial, chamado de destrutor Comentários : 1. Em Java não existe destrutor, mas em C++ sim. 2. Uma classe representa um conjunto de objetos que compartilham uma mesma estrutura e um mesmo comportamento. Destacando a terceira característica em OO, isto é, a Classificação, temos a observar que:  Cada objeto é dito ser uma instância de uma classe  Cada instância mantém seus próprios valores de atributo (estado), mas compartilha os nomes dos atributos e comportamento (operações) com outras instâncias da classe. Uma quarta característica do Paradigma OO é o encapsulamento. Relacionando esta característica com os conceitos de classe e objeto pode-se afirmar que : “Uma classe encapsula atributos (nomes, tipos) e comportamentos, ocultando os detalhes de implementação dos objetos.” Com relação ao encapsulamento, os métodos formam uma “cerca” em torno dos atributos, que não podem (ou devem) ser manipulados diretamente. Os atributos somente podem ser alterados ou consultados através dos métodos do objeto. Considerando clientes de um objeto X os outros objetos que utilizam métodos de X, os benefícios do encapsulamento são : Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 23  os clientes de um objeto podem utilizar seus métodos sem conhecer os detalhes de sua implementação  A implementação de um objeto pode ser alterada sem o conhecimento de seus clientes, desde que a interface visível seja mantida Um programa OO é um conjunto de objetos que colaboram entre si para a solução de um problema. A colaboração ocorre através de trocas de mensagens, sendo que a troca de mensagem representa a chamada de um método.  Controle de visibilidade Os atributos e métodos, em termos de visibilidade, podem ser :  public  acessíveis por qualquer classe  private  acessíveis pela própria classe  protected  Acessíveis pela própria classe ou por seus descendentes 3.3.Herança O compartilhamento de atributos e comportamentos entre classes baseiam-se num relacionamento hierárquico. Uma classe pode ser definida genericamente e então refinada (especializada) sucessivamente em sub-classes mais específicas. Herança Simples x Herança Múltipla  Se uma classe herda de apenas uma superclasse (classe mãe ou base), temos uma herança simples  Se uma classe herda de diversas superclasses, temos uma herança múltipla Não existe herança múltipla em Java. Exemplo : A classe Animais pode ser subdividida nas sub-classes anfíbios, mamíferos, aves, peixes e répteis. 3.4. Polimorfismo Uma subclasse pode redefinir um elemento herdado, o que é denominado polimorfismo. O polimorfismo se realiza através da recodificação de um ou mais métodos herdados por uma subclasse. Ou seja, um mesmo comportamento pode se Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 24 apresentar de forma diferente em classes diferentes (poli = vários, morfismo = forma). Uma linguagem de programação orientada a objetos automaticamente escolhe o método correto para implementar uma operação baseado no nome da operação, nos dados que carrega (parâmetros) e na classe implementada do objeto (assinatura do método) . Por isto, novas classes podem ser acrescentadas sem a modificação de todo o código existente Mais adiante, falaremos mais de Polimorfismo. Comentário [AC] : Ao projetar um sistema POO, começamos pela determinação das classes e depois acrescentamos os métodos de cada classe. Uma regra para criar as classes é procurar por substantivos no problema. Os métodos correspondem aos verbos. Exemplo: Num sistema de processamento de pedidos: - Classes (substantivos): item, pedido, endereço para remessa (endereçoRemessa), pagamento, conta, etc. - Métodos (verbos): itens são adicionados aos pedidos, pedidos são enviados ou cancelados, pagamentos são aplicados aos pedidos. Cada verbo sugere um método. - Objetos: com cada verbo, como “adicionar”, “enviar”, “cancelar” e “aplicar”, é necessário identificar o objeto que tem a maior responsabilidade em efetuar esta ação. Exemplo [FC]: Apresenta uma classe Ponto com 2 atributos, e outra classe TestaPonto que cria uma instância de um objeto da classe Ponto. public class Ponto { int x, y; //atributos } public class TestaPonto { public static void main(String[] args) { Ponto p; p = new Ponto(); // Cria um objeto com new p.x = 1; // acessa pelo . – não privado p.y = 2; System.out.println ("Coordenada (x,y) = (" + p.x + "," + p.y +")"); } } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 25 3.5. O Vocabulário da POO – Enfatizando os conceitos [AC] a) CLASSE - O modelo ou a forma a partir do qual um objeto é criado. Em JAVA, toma-se como padrão a primeira letra do nome da classe em maiúscula (como String, System, Math etc.). b) OBJETO - Instância da classe; componente na memória com seus atributos e dados próprios, que utilizam seus métodos para manipular os seus dados internos; se comunicam entre si através de mensagens (chamadas a métodos). - Para criar um objeto e utilizar (chamar) os seus métodos é necessário utilizar o operador new: Casa c1 = new Casa(); c) BIBLIOTECA PADRÃO - Classes e pacotes para diversos propósitos tais como projetos de interface de usuário e programação em rede. d) CLASSE Object - As classes em Java sempre são formadas a partir de outras classes. Uma classe formada a partir de outra "estende" esta outra. Em Java existe uma classe "mãe" a partir da qual todas as outras classes são naturalmente formadas, esta é a classe Object. Todas as classes “herdam” de Object. e) ENCAPSULAMENTO - Em POO devemos combinar dados e comportamento em um pacote fechado e ocultar a implementação dos dados, de forma que o usuário do objeto (em geral outro objeto) não veja como estes dados são manipulados. Dizemos que os dados e métodos são encapsulados em objetos. É outro conceito fundamental em POO. O encapsulamento dá aos objetos a característica de "caixa-preta". Os objetos devem se comunicar apenas através de mensagens, ou seja, seus dados (atributos) devem estar protegidos de outros objetos e só poderão ser acessados através de métodos (funções). f) VARIÁVEIS DE INSTÂNCIA - Dados ou atributos do objeto (só existem após ser criado o objeto). g) ESTADO DO OBJETO - Valores atuais dos dados do objeto. Vejamos um primeiro exemplo: Suponha que você deseja construir um aplicativo que imprima a área das figuras geométricas “quadrado” e “triângulo eqüilátero”. Definiremos para o exemplo o valor dos lados como 10, para vermos a diferença no valor das áreas calculadas. O primeiro passo é criar as classes (cujos nomes serão: Quadrado e Triangulo, a partir das quais serão gerados os objetos q e t no método main: Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 26 public class Quadrado { double lado = 0; public double area() //método cálculo da área { return (lado * lado); } // Retorno com return } Salve como Quadrado.java mas não compile ainda. Agora, a classe Triangulo: public class Triangulo { double lado = 0; public double area() { return (0.433*lado*lado); } } Salve como Triangulo.java mas não compile ainda. Finalmente, a classe Figuras: public class Figuras { public static void main (String[] args) {// declarando e instanciando "q" Quadrado q = new Quadrado(); // declarando e instanciando "t" Triangulo t = new Triangulo(); //valor do atributo lado do obj “q” q.lado = 10; //chamada ao método area do obj “q” double s = q.area(); System.out.println("Área do Quadrado: "+s); //valor do atributo lado do obj “t” t.lado = 10; //chamada ao método area do obj “q” s = t.area(); System.out.println("Área do Triângulo: "+s); } } Salve como Figuras.java e compile esta classe com sua ferramenta ou na linha de comandos com javac Figuras.java. Ao compilar, você notará que todas as classes do exemplo serão compiladas gerando os três arquivos “.class”. Isto acontece porque Java reconhece quais as classes que fazem parte do sistema, pois estão sendo chamadas pela classe principal, e as compila. Execute com java Figuras. 3.6. Observações sobre variáveis, valores, referências e tipos[FS] a) Variáveis, valores e referências  Variáveis são usadas em linguagens em geral para armazenar valores Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 27  Em Java, variáveis podem armazenar endereços de memória ou valores atômicos de tamanho fixo b) Tipos  Tipos representam um valor, uma coleção de valores ou coleção de outros tipos. Podem ser  Tipos básicos, ou primitivos, quando representam unidades indivisíveis de informação de tamanho fixo. Exemplo : um inteiro, um booleano ...  Tipos complexos, quando representam informações que podem ser decompostas em tipos menores. Os tipos menores podem ser primitivos ou outros tipos complexos. Exemplo : Um vetor, uma data ...  Em Java, tipos complexos são armazenados como objetos . 3.7. Coleta de Lixo [FS]  A memória alocada em Java não é liberada pelo programador, ou seja, objetos criados não são destruídos pelo programador  A criação de objetos em Java consiste de  Alocar memória para armazenar os dados do objeto  Inicializar o objeto (via construtor)  Atribuir endereço de memória a uma variável (referência)  Mais de uma referência pode apontar para o mesmo objeto Mensagem m, n, p; m = new Mensagem("A"); n = m; p = new Mensagem("B");  Quando um objeto não tem mais referências apontando para ele, seus dados não mais podem ser usados e a memória deve ser liberada. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 28  O coletor de lixo irá liberar a memória na primeira oportunidade n = null; p = new Mensagem("C"); 3.8. Um pouco de entrada e saída de dados em JAVA [AC] a) Leitura de Dados via Entrada Padrão - A leitura de dados de entrada pelo teclado era difícil em Java antes da versão 1.5. Quando usamos componentes como caixas gráficas de entrada de dados isto se torna menos complexo, mas antes disso é preciso verificar como funciona a entrada via console. - De forma gerla, uma declaração de import serve para importar uma ou todas as classes de um pacote. O caminho indicado no import é justamente um caminho de pastas. Asterisco significa todos os arquivos da pasta (mas não as subpastas). - O exemplo a seguir utiliza a classe Scanner, que possui métodos para leitura de diversos tipos de dados de entrada via console: Exemplo : import java.util.*; public class LeituraComScanner { // Testes de leitura com classe Scanner (Java 5.0) public static void main(String[] args) { //objeto para leitura via console Scanner entrada = new Scanner (System.in); Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 29 System.out.println("Informe nome:"); //lê uma string como o método nextLine() String nome = entrada.nextLine(); System.out.println("Informe idade:"); //lê um inteiro com o método nextInt int idade = entrada.nextInt(); System.out.println("Nome:" + nome + "\nIdade:" + idade); } } Tabela com alguns métodos da classe Scanner [JTAS] Método Descrição String nextLine() Lê toda a linha int nextInt() Lê um inteiro double nextDouble() Lê um double float next Float() Lê um float long nextLong() Lê um long boolean hasNext() Verifica se ainda existem dados a serem lidos b) Leitura via Componentes Gráficos do Pacote Swing - Mais tarde estudaremos componentes gráficos para interfaces de aplicativos, mas já podemos começar a trabalhar com o componente chamado JOptionPane, que representa uma janela ou caixa de diálogo com o usuário. A classe JOptionPane está no pacote javax.swing que devemos importar para utilizar este componente. Exemplo: import javax.swing.JOptionPane; //pacote necessário //ou //import javax.swing.*; //o compilador verifica Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 30 public class Mensagem { public static void main (String[] args) { //comando para a caixa de diálogo JOptionPane.showMessageDialog (null, “Esta é uma mensagem !”); //saída obrigatória do sistema System.exit(0); } } - O componente pode ser usado, pois a classe foi incluída no código com o comando import. É possível também usar o seguinte (selecionar todo o pacote e deixar o trabalho de carregar a classe, feito pelo compilador): import javax.swing.*; - O comando JOptionPane.showMessageDialog é usado para mostrar caixas de mensagem e pode ser usado nesta forma simples, com dois parâmetros: o primeiro, com valor null, representa o componente parent (janela maior que abriria a caixa de mensagem, como não existe, usa-se null), o segundo representa a mensagem a ser exibida. - Por último, é preciso, sempre que se usar componentes de interface com o usuário, incluir o comando de saída do sistema, para encerrar a execução. - Uma versão mais completa do comando de caixa de diálogo contém quatro argumentos, como segue: JOptionPane.showMessageDialog (null, “Texto da Mensagem”, “Titulo da janela”, TIPOICONE); - O campo TitulodaJanela aparece na barra azul da caixa de diálogo. Já o TIPOICONE representa o pequeno desenho que pode aparecer, identificando o tipo de mensagem. Veja o que pode ser colocado neste argumento e o tipo de janela gerado: JOptionPane.ERROR_MESSAGE JOptionPane.INFORMATION_MESSAGE Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 31 JOptionPane.WARNING_MESSAGE JOptionPane.QUESTION_MESSAGE JOptionPane.PLAIN_MESSAGE - Para entrada de dados utilizamos o comando showInputDialog, com uma variável do tipo String aguardando o retorno (as janelas retornam sempre uma string): String numLido = JOptionPane.showInputDialog( "Informe:" ); - Gerando a janela a seguir: - Após a leitura, é necessário obter o número a partir da string lida, o que deve ser feito com um dos comandos a seguir: int numero = Integer.parseInt( numLido ); //obtém inteiro double numero = Double.parseDouble( numLido ); //obtém ponto flutuante Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 32 NOTE : Classe Integer com o método parseInt Classe Double com o método parseDouble Exemplo (DEITEL): import javax.swing.JOptionPane; public class Soma { public static void main( String args[] ) { String numero1, numero2; int n1, n2, resultado; numero1 = JOptionPane.showInputDialog ("Informe um inteiro:"); numero2 = JOptionPane.showInputDialog ("Informe outro inteiro"); // convertendo n1 = Integer.parseInt( numero1 ); n2 = Integer.parseInt( numero2 ); // somando resultado = n1 + n2; JOptionPane.showMessageDialog (null, "A soma é "+resultado, "Resultado:", JOptionPane.PLAIN_MESSAGE); System.exit( 0 ); } } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 33 4. Vetores (Arrays)  São estruturas homogêneas, ou seja, são estruturas utilizadas para armazenar vários elementos de um mesmo tipo. Os elementos de um vetor, em Java, podem ser de tipos primitivos (Ex: int, double, etc) ou objetos (referências).  O primeiro elemento (posição) possui índice 0 (zero).  São tratados em java como objetos, ou seja, para serem utilizados temos que instanciá-los (usando new). 4.1. Criação de Vetores Exemplo 1: Criando um vetor de tipos primitivos (int). int c[]; // declara o array c = new int[10]; // aloca o array c[1] = 20; // atribui o valor 20 ao componente de // índice 1 Obs: A linha int c[]; poderia ser substituída por int [] c; Outro exemplo criando um array com valores iniciais: int n[] = {20,63,40,58}; //Cria, aloca e inicializa o array Exemplo 2: Criando vetores de objetos. class Coisa { } // Uma classe qualquer Coisa[] a; // referência do vetor (Coisa[]) é null Coisa[] b = new Coisa[5]; // referências Coisa null Coisa[] c = new Coisa[4]; for (int i = 0; i < c.length; i++) { c[i] = new Coisa(); // refs. Coisa inicializadas } Coisa[] d = {new Coisa(), new Coisa(), new Coisa()}; 4.2. Comprimento de um vetor Pode ser obtido, usando-se a propriedade length. int x[] = {1,2,3,4,5}; System.out.println(x.length); // Imprimirá 5; 4.3. Vetores Multidimencionais (Matrizes) Possuem mais de uma dimensão int b[][]; //Declaração b = new int[3][3]; //Criação Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 34 b[1][2]=5; //Atribuição ou int b[][] = {{2,3,4},{4,5,6}}; 4.4. Vetores com dimensões diferentes int b[][]; b = new int[2][]; b[0]=new int[3]; b[1]=new int[10]; 5. Getters, Setters e Construtores 5.1. Construção de Classes Veremos agora algumas recomendações para criarmos programas JAVA mais sofisticados, onde a classe escolhida para começar a executar pelo interpretador geralmente tem pouca funcionalidade além de criar os vários objetos que vão realmente fazer o trabalho do programa.  Construtores - Um construtor tem o mesmo nome da classe; - Um construtor pode ter um ou mais parâmetros, ou mesmo nenhum (construtor padrão fornecido pelo compilador); - Um construtor é sempre chamado através da palavra-chave new; - Um construtor não retorna valor (mesmo assim não tem void na assinatura) Exemplo : public class Cliente{ private String nome; //atributos nome e numConta private int numConta; public Cliente(String n, int c)//construtor { nome = n; numConta = c; } }  Construtores Padrões - Se um método construtor não for especificado para uma classe e um objeto for referenciado no sistema, um construtor padrão será providenciado. Estes Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 35 construtores não têm argumentos e inicializam todos os campos de instância com valores padrões.  Sobrecarga de Construtores - Ao implementar uma classe, podemos definir mais de um construtor para a classe, a fim de que possamos criar objetos de várias maneiras. Exemplo: Dia hoje = new Dia (); Dia hoje = new Dia (1999,11,31); - Existem dois construtores para uma certa classe Dia, o primeiro inicializa os campos de instância com a data atual do sistema e o segundo inicializa os campos de instância com os parâmetros passados na inicialização do objeto. - A sobrecarga de métodos acontece quando vários métodos dentro de uma mesma classe têm o mesmo nome, mas argumentos diferentes (o compilador decide que método será usado). - Java permite sobrecarregar qualquer método, de qualquer tipo!  Utilização de Métodos e Campos Privados - Ao implementar uma classe, recomenda-se que os atributos sejam privados (private), mantendo estes atributos ocultos, impedindo que outros objetos os acessem, protegendo os objetos como caixas pretas, com sua comunicação apenas através de mensagens (chamada dos métodos). A classe Cliente no exemplo anterior já possui dados privados. - Os métodos também podem ser private, o que os torna acessíveis apenas por outros métodos da mesma classe. Estes métodos ocorrem normalmente quando se divide um método público em vários módulos de tarefas específicas. - É recomendável encapsular tarefas internas das classes do sistema em métodos privados, para que possam ser modificadas minimizando as mudanças no lado do usuário, sem mexer na interface com o usuário.  Métodos Acessadores (getters) e Modificadores (setters) - Acessadores são métodos que simplesmente retornam o estado atual de um campo private do objeto. Por convenção, os nomes iniciam com o prefixo “get”. Por exemplo, digamos que na nossa classe Empregado, quiséssemos um método para nos retornar o número da conta do cliente: public int getNumConta () { return numConta; //o get retorna } A partir de agora, com este método, tornamos o campo numConta um campo de “somente-leitura” para o mundo exterior à classe, ou seja, só através de operações na classe é possível modificar o seu valor. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 36 Um método modificador para este mesmo campo poderia ser: public void setNumConta (int novoNumero) { numConta = novoNumero; //o set modifica } Em geral, quando o usuário tem interesse em ler e escrever em um campo private, o programador poderá fornecer (se estiver de acordo com o projeto): o Um método público de leitura de campo (acessador  get); o Um método público de alteração de campo (modificador  set).  Inicialização de atributos - Em Java, se o construtor do objeto não indicar o valor para inicialização dos campos de instância, os números são inicializados com 0 (zero), objetos com null e booleanos com false, mas as variáveis locais dos métodos precisam ser inicializadas explicitamente  Referência ao Objeto Através de this - Para acessar o objeto atual em sua totalidade e o não atributo em particular, usamos this: 1. Fazendo referência ao objeto no qual o método opera. System.out.println (this); //mostra apenas o endereço do objeto //usaremos isto no tratamento de eventos //no próximo capítulo 2. Chamada para outro construtor da mesma classe. É um excelente artifício para combinar código dos construtores. Veja um exemplo completo, mostrando vários usos do this: public class Cliente { public Cliente(String n) //sobrecarga { this(n,0 ); } //argumento com mesmos nomes dos atributos public Cliente(String nome, int numConta) { this.nome = nome; //atributo=argumento this.numConta = numConta; } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 37 public int getNumConta () { return numConta; } public void setNumConta (int numConta) { this.numConta = numConta; } private String nome; private int numConta; } Ao fazer new Cliente (“Joe Satriani”), o construtor Cliente(String) chama o outro construtor Cliente(String, int). Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 38 5.2. Os principais modificadores [FS] A) Modificadores de Classes - public o Classes public podem ser instanciadas por qualquer objeto livremente. o Para declarar uma classe como public, inclua a palavra reservada public na definição da classe (esta é a convenção): public class NomeClasse - abstract o Classes abstract são classes que não permitem que sejam instanciadas, ou seja, servem para definir superclasses. o Para declarar uma classe como abstract, inclua a palavra reservada abstract na definição da classe: public abstract class NomeClasse - final o Classes final são classes que não permitem que você crie subclasses delas. Para declarar uma classe como final, inclua a palavra reservada final na definição da classe: public final class NomeClasse B) Modificadores de Métodos e Atributos - public o Faz com que o método ou atributo possa ser utilizado livremente, como em (na definição da classe Empregado): public double calc () - protected o Faz com que o método ou atributo somente possa ser invocado pelas classes do mesmo pacote, ou seja, para classes dentro do mesmo pacote é o mesmo que public (em Java é mais comum proteger/encapsular com private). As subclasses podem acessar os membros protected, mesmo que estejam em outros pacotes. protected double calc () - private o Faz com que o método ou atributo somente possa ser invocado na classe em que é definido. Mas as instâncias da classe podem acessar os atributos em outras instâncias da mesma classe, ou seja, private é concernente à classe e não às instâncias. Uma subclasse não acessa atributos nem métodos private da superclasse. private double calc () Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 39 - static o Métodos e atributos static podem ser considerados como pertencentes à classe e não às instâncias. Um membro static pode ser invocado por todas as instâncias da classe, ou mesmo sem a instanciação de um objeto, como é o caso do método main na criação de um aplicativo: public static void main (String[] args) - final o Métodos final não permitem sobreposição. Atributos final possuem valor constante, ou seja, não podem ser modificados. public static final double LUCRO = 0.2; - abstract o Métodos abstract não possuem corpo, apenas definem a assinatura do método e indicam que devem ser implementados nas subclasses. Métodos static, final e private não podem ser abstratos, não faz sentido reescrevê-los em subclasses, isto é considerado erro de sintaxe. public abstract double calc(); - default o Um membro sem modificador de acesso definido é dito possuir o modificador default. Mas “default” não é uma palavra-chave em Java, é apenas uma denominação. Na prática, o acesso funciona normalmente como o public, mas se estiverem definidos pacotes diferentes para as classes, o modificador default só permite o acesso para classes dentro do mesmo pacote, ou seja, neste caso funciona como protected. O conselho então é definir bem os modificadores de acesso, escreva todos, mesmo que sejam public. Em Java é uma boa prática de programação deixar tudo muito claro e definido.  Hierarquia de Modificadores na Sobreposição de Métodos - A ordem a ser respeitada é: private  default  protected  public ou seja, um método private pode ser reescrito nas subclasses com os modificadores private, default (sem modificador), protected e public, um método default pode ser reescrito nas subclasses com os modificadores default, protected e public, e assim por diante. - Para maiores informações sobre modificadores, leia o capítulo 3 do “Sybex Complete Java Certification Study Guide”. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 40  Sintaxe de declaração de atributos Sintaxe básica: [modificador]* tipo identificador [= valor] ; onde: [modificador]* – zero ou mais modificadores (de acesso, de qualidade), separados por espaços: public, private, static, final, etc. tipo – tipo de dados que a variável (ou constante) pode conter identificador – nome da variável ou constante [= valor] – valor inicial da variável ou constante Exemplo: protected static final double PI = 3.14159 ; int numero;  Sintaxe de definição de métodos Sintaxe básica [mod]* tipo identificador ( [tipo arg]* ) [throws exceção*] { ... } onde: [mod]* – zero ou mais modificadores separados por espaços tipo – tipo de dados retornado pelo método identificador – nome do método [arg]* – zero ou mais argumentos, com tipo declarado, separados por vírgula [throws exceção*] – declaração de exceções. Estudaremos mais adiante. Exemplos public static void main ( String[] args ) { ... } private final int metodo (int i, int j, int k) ; String abreArquivo () throws IOException, Excecao2 { ... } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 41 6. Mais POO em Java – Herança e Polimorfismo 6.1. Herança [AC] Ao estender uma classe, a classe filha passa a possuir todos os atributos e métodos da classe mãe, além dos seus próprios. Pode-se também adicionar ou modificar métodos que se aplicam apenas a esta classe filha. Então, a classe filha "herda" métodos e propriedades da classe mãe. Vejamos um exemplo: Suponha que numa firma hipotética, os empregados sejam identificados por suas matrículas e nomes. Há, porém, dois tipos de empregados: os vendedores e os técnicos. Os vendedores têm uma comissão sobre o salário e os técnicos têm um título (advogado, engenheiro, etc.). Graficamente, pode-se representar este sistema desta forma: - O vendedor tem, além de matrícula, nome, e salário, uma quarta informação, a porcentagem de comissão, ou seja, podemos dizer que um objeto da classe Vendedor herda os atributos da classe Empregado. - Implementando este projeto em Java, da forma mais simples, temos: Classe construtora Empregado: public class Empregado { String matricula; Empregado matricula nome salario Vendedor comissao Tecnico titulo Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 42 String nome; double salario; } Classe construtora Vendedor: public class Vendedor extends Empregado { double comissao; } Classe construtora Tecnico: public class Tecnico extends Empregado { String titulo; } - Podemos observar que os atributos matricula, nome e salario foram definidos na classe Empregado (também chamada superclasse), e as classes Vendedor e Técnico (também chamadas subclasses) utilizam tais atributos, pois os herdam da super classe da qual são derivadas. - No código acima, criamos a classe Vendedor por herança da classe Empregado utilizando o nome desta após a instrução extends: public class Vendedor extends Empregado - Qualquer modificação na classe Empregado refletirá na classe Vendedor (bem como na classe Tecnico). Por exemplo, a alteração do atributo matricula de String para int altera este dado também nas subclasses. Para completar o exemplo, só falta a classe que instanciará os objetos das classes Empregado, Vendedor e Técnico. Para utilizar os atributos e métodos definidos em uma classe, precisamos utilizar um objeto desta classe, o que significa dizer que precisamos instanciar um objeto desta classe. A classe que instanciará os objetos será chamada de Firma, tendo seu código-fonte definido a seguir: public class Firma { public static void main(String[] args) { Empregado e; //declarações Vendedor v; Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 43 Tecnico t; e = new Empregado(); //instanciações v = new Vendedor(); t = new Tecnico(); e.nome = "João"; //inicializações dos atributos e.matricula = "E1"; e.salario = 100.00; v.nome = "Pedro"; v.matricula = "V1"; v.salario = 500.00; v.comissao = 20; t.nome = "José"; t.matricula = "T1"; t.salario = 900.30 ; t.titulo = "Dr. "; System.out.println ("Matrícula: "+ e.matricula + " Nome: “ + e.nome + " Salário: R$" + e.salario); System.out.println ("Matrícula: "+ v.matricula + " Nome: " + v.nome + " Salário: R$" + v.salario + "(já incluída a comissão de: " + v.comissao + "%)"); System.out.println ("Matrícula: "+ t.matricula + " Nome: " + t.titulo + t.nome + " Salário: R$" + t.salario); } } Salve-o como Firma.java, compile-o (as outras classes serão compiladas automaticamente) e execute com sua ferramenta. 6.2. Uso de Classes Existentes Podemos usar classes existentes nos nossos projetos, bastando para isso saber a sintaxe de seus métodos, como no exemplo anterior: - Na maior parte das classes Java, criam-se objetos, especifica-se o estado inicial de cada um e depois se trabalha com estes objetos. E para acessar os objetos, define-se variáveis objeto. Veja: Empregado e; // ‘e’ não é objeto ainda nem se refere a nenhum //objeto Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 44 e.calculaAumentoAnual(); // NÃO AINDA !!!!!! ERRO!!! e = new Empregado(); // agora sim ! Existe o objeto e e.nome = "João"; //OK e.matricula = "E1"; e.salario = 100.00; 6.3. Relações entre Classes - Relações mais comuns: o Uso: quando uma classe usa objetos de outra classe. No exemplo anterior, Firma usa objetos de Empregado.  De um modo geral, uma classe A usa uma classe B se um método de A envia uma mensagem para um objeto da classe B, ou se um método de A cria, recebe ou retorna objetos da classe B.  O uso desta relação deve ser minimizado, visando independência de funcionamento entre as classes, facilitando a manutenção do código. o Inclusão (“tem um”): ocorre quando um atributo de uma classe é um objeto de outra classe. Exemplo : Imagine uma Classe Endereco, que possui os atributos : logradouro, numero, complemento, bairro, cidade, estado, cep. Pode-se ter outra classe Funcionario, que tenha como Endereco como um de seus atributos. o Herança (“é um”): denota especialização ou generalização. É quando uma classe estende outra. Vendedor é um Empregado. 6.4. Polimorfismo Voltando ao assunto Herança, veremos um conceito muito importante, o de Polimorfismo. No nosso exemplo Firma, o vendedor deve ter X% de comissão. Suponha então que seja necessária a construção de um método que calcule o salário de todos os empregados, descontando 15% de imposto. Por exemplo, se o salário de: Empregado = 200; Vendedor = 200; //Salário-base Tecnico = 2.000; Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 45 Supondo uma comissão de 20% , o salário de Vendedor seria: Vendedor = 240; // 200 + 20% = 200 + 40 = 240 Calculando o salário líquido de cada um: Empregado = 170 // 200-15% = 200-30 Vendedor = 204 // 240-15% = 240-36 Tecnico = 1700 // 2.000-15% = 2.000- 300 O método para cálculo do salário para a classe Empregado pode ser: public double calc() { return ( 0.85 * salario ); //desconto de 15% } E esse método será herdado pela classe Tecnico. Porém, a classe Vendedor deverá implementar seu próprio método: public double calc() { double sal = salario * (1 + comissao/100); //aumento de 20% return ( 0.85 * sal); //desconto de 15% } Graficamente, os métodos são representados separadamente dos atributos, na parte inferior. Desta forma, poderíamos reescrever os códigos para um novo exemplo: Empregado matricula nome salario calc() Vendedor comissao calc() Tecnico titulo Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 46 public class Empregado { String matricula; String nome; double salario; public double calc () { return (0.85 * salario); } } public class Vendedor extends Empregado { double comissao; public double calc () { double sal = salario * (1 + comissao/100); return (0.85 * sal); } } public class Firma { public static void main(String args[]) { Empregado e; Vendedor v; Tecnico t; e = new Empregado(); v = new Vendedor(); t = new Tecnico(); e.nome = "João"; e.matricula = "E1"; e.salario = 100.00; v.nome = "Pedro"; v.matricula = "V1"; v.salario = 500.00; v.comissao = 20; t.nome = "José"; t.matricula = "T1"; t.salario = 900.30 ; t.titulo = "Dr. "; System.out.println ("Matrícula: "+ e.matricula + " Nome: “ + e.nome + " Salário: R$" + e.calc() ); Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 47 System.out.println ("Matrícula: "+ v.matricula + " Nome: " + v.nome + " Salário: R$" + v.calc() + "(já incluída a comissão de: " + v.comissao + "%)"); System.out.println ("Matrícula: "+ t.matricula + " Nome: " + t.titulo + t.nome + " Salário: R$" + t. calc()); } } Então, Polimorfismo é a capacidade que os métodos de mesmo nome têm de efetuarem tarefas diferentes. Polimorfismo: um mesmo método com várias formas. O polimorfismo acontece quando os métodos são definidos em classes em herança (sobreposição) No nosso caso, o método calc efetua um cálculo quando utilizado pelos objetos das classes Empregado e Tecnico, e outro cálculo quando o objeto em questão foi instanciado da classe Vendedor. Pode-se observar que tanto Empregado como Tecnico utilizam o método calc para cálculo do trabalho, e que Vendedor, apesar de utilizar o método calc, utiliza o seu próprio método, com corpo diferente daquele definido na classe ancestral Empregado. Resumindo o conceito de Polimorfismo: Reutilização do mesmo nome para um conceito correlato em tipos diferentes. Não confunda ! o Sobreposição (Overriding)  comparação feita em tempo de execução que pergunta “Qual método foi definido para este tipo de objeto? Existe uma redefinição deste método na classe do objeto ou deve ser usado o método definido na superclasse?”. o Sobrecarga (Overloading)  comparação feita em tempo de compilação que pergunta “Qual método possui os tipos de argumentos correspondentes?” e escolhe o método que será usado. Recurso usado no caso de métodos de mesmo nome, definidos em uma mesma classe, com argumentos diferentes. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 48 6.5 . Uso de SUPER O comando super sempre se refere a uma superclasse. Todo método construtor de uma subclasse precisa também chamar um construtor para os campos de dados da superclasse, caso existam campos de instância também na superclasse. Se a superclasse tiver um construtor então as subclasses precisam usar super para passar os parâmetros, a fim de utilizar este construtor da superclasse. super também pode ser usado para passar parâmetros para métodos da superclasse, utilizando o código deste, sem ter que redefinir totalmente o método, por exemplo, na linha super.calc (); do exemplo a seguir. - Exemplo Firma utilizando encapsulamento, polimorfismo, super e this: public class Empregado { private String matricula, nome; private double salario; public Empregado (String m, String n, double s) { matricula = m; nome = n; salario = s; } public Empregado (String m, String n) { this(m, n, 0 ); //sobrecarga salário não definido } public double calc () { return (this.getSalario() * 0.85); } //getters & setters public String getMatricula() { return matricula; } public void setMatricula(String matricula) { this.matricula = matricula; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public double getSalario() { return salario; } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 49 public void setSalario(double salario) { this.salario = salario; } }// fim classe Empregado public class Vendedor extends Empregado { private double comissao; public Vendedor(String m, String n, double s, double c) { super(m, n, s); this.comissao = c; } public double calc () { return super.calc() * (1 + this.comissao / 100); } //getters & setters public double getComissao() { return comissao; } public void setComissao(double comissao) { this.comissao = comissao; } } // fim classe Vendedor public class Tecnico extends Empregado { private String titulo; public Tecnico(String m, String n, double s, String t) { super(m, n, s); this.titulo = t; } //getters & setters public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } } // fim classe Tecnico import java.util.Formatter public class Firma { public static void main(String[] args) { Empregado e = new Empregado("E1","João",100); Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 50 Vendedor v = new Vendedor("V1","Pedro",500,0.2); Tecnico t = new Tecnico("T1","José",930,"Dr. "); System.out.format("\nMatricula: %s \nNome: %s \nSalario:R$ %.2f \n ", e.getMatricula(), e.getNome(), e.calc()); System.out.format("\nMatricula: %s \nNome: %s \nSalario:R$ %.2f \nComissao de %.0f por cento\n", v.getMatricula(), v.getNome(), v.calc(), v.getComissao()*100); System.out.format("\nMatricula: %s \nNome: %s \nSalario:R$ %.2f \n ", t.getMatricula(), t.getNome(), t.calc()); } } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 51 6.6. Relacionamento entre objetos da superclasse e objetos da subclasse [JTAS] O objeto de uma subclasse pode ser tratado como um objeto de sua superclasse. Isso é validado pela própria condição de herança e pode ser interessante, se for desejável, por exemplo, criar um vetor com objetos das subclasses. Não é possível, no entanto, fazer um objeto de uma subclasse receber um objeto da superclasse. Isso configura erro de sintaxe. No exemplo da classe Ponto e sua subclasse Circulo, que veremos a seguir, foi usado o operador cast. Este operador converte a expressão do seu lado direito no tipo da variável ou objeto do lado esquerdo de uma atribuição. (tipo) expressao ou (Classe) expressao Se tivermos, por exemplo, int x = 5; O cálculo x/2 dará o inteiro 2 (quociente da divisão com /). O cálculo de (double)x/2 dará 2.5, pois x foi convertido para double. Exemplo : Vejamos agora as classes Ponto e Circulo Classe Ponto public class Ponto { protected int x, y; // variáveis de instância public Ponto() { setPonto(0,0); } public Ponto(int xc, int yc) { setPonto(xc,yc); } public void setPonto(int xc, int yc) { x = xc; y = yc; } public int getX() { return x; } public int getY() { return y; } public String toString() { return "[ " + x + " , " + y + "]"; } } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 52 Classe Circulo public class Circulo extends Ponto { protected double raio; public Circulo() { setRaio(0); } public Circulo(double r, int x, int y) { super(x,y); setRaio(r); } public void setRaio(double r) { raio = (r >= 0.0 ? r : 0.0); } public double getRaio() { return raio; } public double getArea() { return (Math.PI * Math.pow(raio,2)); } public String toString() { return "Centro = " + "[ " + x + " , " + y + "]" + "; Raio = " + raio; } } Arquivo : TestaHeranca_e_Cast public class TestaHeranca_e_Cast { public static void main(String[] args) { Ponto p1, p2; Circulo c1, c2; p1 = new Ponto(30,50); c1 = new Circulo(2.7, 120, 89); String saida = "Ponto p1 : " + p1.toString() + "\nCirculo c1 : " + c1.toString(); Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 53 // Atribui objeto da subclasse a um objeto da superclasse // Ocorrerá vinculação dinâmica ou vinculação tardia . Ou seja, // Java sabe que o objeto na verdade é um círculo. // Por isso, o método toString() invocado é o da classe Circulo. p2 = c1; saida += "\n\nCirculo c1 (atraves da referencia p2) " + p2.toString(); saida += "\n\nCirculo c1 (atraves da referencia c1) " + c1.toString(); // É um cast, mas especificamente, um downcasting (cast para a // subclasse), ou seja, (Circulo) // NOTE : obj. da subclasse c2 recebe obj. da superclasse p2, pois p2 // havia recebido, primeiramente, um objeto da subclasse, ou seja, // p2 na verdade referencia um circulo e não um ponto. c2 = (Circulo) p2; //Converte p2 para c2 apenas neste momento saida += "\n\nCirculo c1 (via c2) : " + c2.toString(); // ERRO de sintaxe na próxima linha : objeto da subclasse recebe obj. // da superclasse. Nem que haja cast será possível !!! //c2 = (Circulo)p1; // ERRO !!!!! System.out.print(saida + "\n\n"); } // fim main } // fim classe Comentário : Lembre-se de que os construtores nunca são herdados, pois são específicos da classe onde são definidos. 6.7. Classes Abstratas [AC] Ao subir na hierarquia de heranças, as classes tornam-se mais genéricas. A classe ancestral pode tornar-se tão geral que acaba sendo vista mais como um modelo para outras classes, do que como uma classe com instâncias específicas. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 54 Uma classe declarada abstrata não pode ser instanciada, nenhum objeto desta classe pode ser criado. Se a classe abstrata contém um método abstrato, deve-se implementar o método concreto (com todo o código) nas subclasses. Os métodos abstratos servem apenas como declaração dos métodos concretos. Quando uma subclasse de uma classe abstrata não implementa todos os métodos abstratos que herda, ela também é abstrata, não podendo, portanto, ser instanciada. Métodos static, private e final não podem ser abstract. A justificativa é a seguinte : 1. por definição, um método final não pode ser sobrescrito na subclasse; 2. por definição, um método private só pode ser acessado na classe onde foi escrito 3. métodos static não podem ser sobrepostos. Uma classes abstrata pode ter: [item de FS]  métodos concretos (usados através das subclasses)  campos de dados (memória é alocada na criação de objetos pelas suas subclasses)  construtores (chamados via super( ) pelas subclasses) Uma classe abstrata é dita "pura", quando :  não têm procedimentos no construtor (construtor vazio)  não têm campos de dados (a não ser constantes estáticas - static)  todos os métodos são abstratos Classes abstratas "puras" podem ser definidas como "interfaces" , que estudaremos mais adiante. No nosso exemplo Firma, se definíssemos a classe Empregado como abstract, não poderíamos instanciar objetos desta classe, e a mesma serviria apenas como modelo para Vendedor e Tecnico (tente modificar o código, retirando também a instanciação de Empregado). No exemplo a seguir, para termos um vetor de formas (Circle, Retangle, etc), definimos uma classe abstrata Shape, com métodos abstratos apenas. Poderemos então criar um array de objetos Shape. O código de Shape é: public abstract class Shape { public abstract double area (); public abstract double total (); // outros métodos poderiam ser incluídos aqui, // sendo abstract ou não } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 55 Usando estas classes, poderíamos utilizar um código como, por exemplo: Shape[] formas = new Shape[3]; //Cria array formas[0] = new Circle (2.0); //Preenche array formas[1] = new Rectangle (1.0, 3.0); formas[2] = new Rectangle (4.0, 2.0); double totalArea = 0; for (int i = 0; i < formas.length; i++) totalArea += formas[i].area(); Veja o código das outras classes (compile-as junto com a classe Shape anterior): public class Circle extends Shape { private double r; public Circle (double r) //Construtor { this.r = r; } public double getRadius () { return r; } public double area () //Implementa o abstrato { return (Math.PI*r*r);} public double total () //circunferencia { return (2*Math.PI*r); } } public class Rectangle extends Shape { public Rectangle (double w, double h) { this.w = w; this.h = h; } public double getWidth () { return w; } public double getHeight () { return h; } public double area () { return (w*h); } public double total () //Perimetro { return (2*(w+h)); } private double w, h; } - Pode-se invocar os métodos area() e total() de qualquer objeto Shape do array, embora a classe Shape não defina um corpo para estes métodos. Quando se faz isso, o método a ser invocado é encontrado como método dinâmico, a área de um Circle é calculada usando o método definido em Circle e a área de um Rectangle é calculada usando o método definido em Rectangle. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 56 6.8. Interface [AC] Uma classe Java pode herdar de apenas uma classe imediata. Para uma classe herdar de mais de uma superclasse (o que em C++ se chama Herança Múltipla), a solução elegante de Java se chama Interface de Objeto. Ou seja, uma classe pode estender apenas uma superclasse, mas pode implementar várias interfaces (usa-se a palavra-chave implements e o separador “,”). Uma Interface deve ser definida de forma parecida à das classes abstratas, trocando os termos abstract class por interface. Uma interface especifica uma API (Application Programing Interface) para executar determinada funcionalidade. Não é definida nenhuma implementação dentro de uma interface e as seguintes regras devem ser seguidas : o Todos os métodos de uma interface são abstract, mesmo que seja omitido o modificador na assinatura. Não há implementação, os métodos terminam com ponto e vírgula. o Uma interface define uma API pública. Todos os métodos de uma interface são implicitamente public, mesmo quando o modificador é omitido. É um erro definir um método protected ou private em uma interface. o Uma interface não pode definir campos de instância. São permitidos apenas os campos constantes (static e final). o Uma interface não pode ser instanciada. o Quando uma classe implementa mais de uma interface, ela deve implementar cada método de cada interface implementada, ou deve ser obrigatoriamente uma classe abstract. Exemplo [Fonte : Como Programar em Java –Deitel & Deitel] // Projeto : FormasComInterface // Arquivo : FormasComInterface.java import java.util.Formatter; public class FormasComInterface { public static void main(String[] args) { Ponto p = new Ponto(7,11); Circulo c = new Circulo(3.5, 22, 8); Shape f[] = new Shape[2]; // declara e cria um vetor para duas Shapes Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 57 f[0] = p; f[1] = c; String saida = p.getNome() + " : " + p.toString() + "\n" + c.getNome() + " : " + c.toString() + "\n"; for (int i = 0; i < f.length; i++) { System.out.format("\n\n%s : %s \nArea = %.2f\n", f[i].getNome() , f[i].toString() , f[i].area() ); } System.out.println(); } } // Arquivo : Shape.java public interface Shape { //calcula area public abstract double area(); // retorna o nome public abstract String getNome(); } // Arquivo : Ponto.java public class Ponto extends Object implements Shape{ protected int x, y; // variáveis de instância public Ponto() { setPonto(0,0); } public Ponto(int xc, int yc) { setPonto(xc,yc); } public void setPonto(int xc, int yc) { x = xc; y = yc; } public int getX() { return x; } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 58 public int getY() { return y; } public String toString() { return "[ " + x + " , " + y + "]"; } public double area() { return 0.0; } public String getNome() { return ("Ponto"); } } // Arquivo : Circulo.java public class Circulo extends Ponto { protected double raio; public Circulo() { setRaio(0); } public Circulo (double r, int x, int y) //Construtor { super(x,y); // invoca o construtor da superclasse Ponto setRaio(r); } public void setRaio (double r) { raio = r; } public double getRaio () //Acessador { return raio; } public double area () //Implementa o abstrato { return (Math.PI*raio*raio); } public double perimetro () { return (2*Math.PI*raio); } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 59 public String getNome() { return "Circulo"; } // Converte Circulo para uma representação de String, // usando o método toString() da classe Ponto public String toString() { return "Centro = " + super.toString() //invoca o método do pai + "; Raio = " + raio ; } } Comentários : 1. Quando uma classe implementa uma interface, aplica-se o mesmo relacionamento “é um “ fornecido por herança. Por exemplo, como a classe Ponto implementa (implements) Shape, um objeto da classe Ponto é um Shape. Além disso, qualquer objeto de qualquer classe que estende Ponto, também um Shape. 2. O método toString() é definido na classe Object da seguinte forma : String toString()  retorna uma representação de string do objeto Note que ele foi sobreposto nas classes vistas. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 60 7. Exceções [FS , Prof. Letícia Winkler e JTAS] 7.1. Introdução Uma exceção é um evento que foge ao fluxo normal de execução esperado em um programa. É uma situação excepcional e geralmente indesejável que pode ocorrer durante a execução de um programa. Exceções podem ser tratadas incluindo-se código adequado no programa. Portanto, erros fatais não podem ser tratados como exceção. Alguns exemplos de exceções são:  Índice de um vetor fora do intervalo permitido.  Problemas em operações aritméticas, tais como overflow, underflow e divisões por zero.  Parâmetros inválidos na chamada de um método.  Falta de memória.  Arquivo não encontrado O mecanismo de tratamento de exceção deve ser utilizado, por exemplo, para processar apenas situações excepcionais em que um método é incapaz de completar sua tarefa por razões que ele não pode controlar. O modelo de tratamento de exceções do Java permite tratar uma exceção num escopo diferente daquele que gerou a exceção. Isto permite uma melhor organização do código. Em Java, existem várias classes de exceções, todas elas subclasses de java.lang.Exception. Métodos podem capturar exceções (Mecanismo try-catch) ou podem deixar passar exceções que ocorrerem em seu corpo, mas é obrigatório, para a maior parte das exceções, que o método declare quaisquer exceções que ele não capturar (usar throws). 7.2. Tipos de erros em tempo de execução Basicamente, há três tipos de erros em tempo de execução : 1. Erros de lógica de programação : Devem ser corrigidos pelo programador  Ex: limites do vetor ultrapassados, divisão por zero 2. Erros devido a condições do ambiente de execução : Fogem do controle do programador, mas podem ser contornados em tempo de execução  Ex: arquivo não encontrado, rede fora do ar, etc. 3. Erros graves onde não adianta tentar recuperação : Fogem do controle do programador e não podem ser contornados . Ex: falta de memória, erro interno da JVM Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 61 7.3. Exceções e métodos Uma declaração throws (observe o "s") é obrigatória em métodos e construtores que deixam de capturar uma ou mais exceções que ocorrem em seu interior, caso tais exceções precisem ser checadas pelo compilador. Ex: public void m() throws Excecao1, Excecao2 {...} public Circulo() throws ExcecaoDeLimite {...} A palavra reservada throws declara que o método pode provocar exceções do tipo declarado (ou de qualquer subtipo). A declaração abaixo declara que o método pode provocar qualquer exceção. Evite ao máximo de fazer isto ! Ex: public void m( ) throws Exception {...} Métodos sobrepostos não podem provocar mais exceções que os métodos originais. O que acontece quando ocorre uma exceção? Uma exceção lançada interrompe o fluxo normal do programa, o que faz com que o fluxo do programa siga a exceção. Se o método onde ela ocorrer não a capturar, ela será propagada para o método que chamou este método, e assim por diante. Se “ninguém” capturar a exceção, ela irá causar o término da aplicação. No entanto, se em algum lugar ela for capturada, o controle poderá ser recuperado. 7.4. Estrutura do Mecanismo de Tratamento de Exceções try { // Código que pode gerar uma exceção. // Se a exceção ocorrer, daqui até o fim deste bloco nada será executado } catch (XException ex) { /* Bloco de tratamento associado à condição de exceção XException ou a qualquer uma de suas subclasses, identificada aqui pelo objeto com referência ex */ } catch (YException ey) { /* Bloco de tratamento para a situação de exceção YException ou a qualquer uma de suas subclasses, identificada aqui pelo objeto com referência ey */ } … // outros blocos catch finally { /* Bloco de código que sempre será executado após o bloco try, independentemente de sua conclusão ter ocorrido normalmente ou ter sido interrompida. Só é obrigatório se não forem especificados blocos catch */ } Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 62 Observações:  XException e YException devem ser substituídos pelo tipo de exceção.  Os blocos não podem ser separados por outros comandos — um erro de sintaxe seria detectado pelo compilador Java neste caso.  Cada bloco try pode ser seguido por zero ou mais blocos catch;  Cada bloco catch refere-se a uma única exceção e pode tratar de qualquer exceção que seja da mesma classe ou uma subclasse daquela declarada. Pode-se chamar cada bloco de catch de tratador de exceção, já que quando possível o bloco catch tentará recuperar a situação.  É possível fazer um bloco catch para uma exceção específica e outro para todas as outras subclasses de uma determinada Exception. Porém, é necessário que o catch mais específico (subclasse) apareça antes que o catch mais genérico (superclasse). Caso contrário o programa não irá compilar, apresentando uma mensagem de erro dizendo que a exceção já é tratada anteriormente.  O bloco finally, quando presente, é sempre executado independente de ocorrer exceção, ou não. Em geral, ele inclui comandos que liberam recursos que eventualmente possam ter sido alocados durante o processamento do bloco try e que podem ser liberados, independentemente de a execução ter encerrado com sucesso ou ter sido interrompida por uma condição de exceção. A presença desse bloco é opcional.  Tanto a cláusula finally como a catch são opcionais, porém é necessário ter pelo menos uma delas para cada bloco try. Quando ocorre uma exceção, o fluxo de execução de instruções deixa o bloco do try, e os blocos de catch são pesquisados em ordem, quanto ao tratador apropriado. Se o tipo da exceção lançada corresponder ao tipo de parâmetro em um dos blocos catch, o código deste bloco catch é disparado. Se não ocorrer exceção dentro do bloco try, os tratadores de exceção são pulados e o programa continua seu fluxo após os blocos catch, que poderá ser (caso exista) o bloco finally Lembre-se: Se uma classe mais geral (ex: Exception) aparecer antes de uma ou mais classes específicas (subclasses), uma exceção do tipo da específica jamais será capturada . O compilador detecta a situação acima e não compila o código Para pegar qualquer exceção (geralmente isto não é recomendado), faça um catch que pegue Exception. Exemplo : catch (Exception e) { ... } Exemplo em que se captura uma exceção : public class HelloWorld { public static void main (String args[]) { int i; String msgs [] = {"Aula", "de", “POOII" }; Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 63 i = 0; while (i < 4) { try { System.out.println (msgs[i]); i++; } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Indice fora do limite"); break; } finally { System.out.println("Vai imprimir sempre esta frase !!! "); } // fim finally } // fim while } // fim main } // fim class HelloWorld Muitas classes de biblioteca possuem métodos que podem lançar exceções. Estas exceções podem ser capturadas por um código escrito pelo programador. Além disto, métodos escritos pelo programador também podem lançar exceções (throw), tanto de tipos definidos nas bibliotecas como de novos tipos construídos pelo programador. Exemplo em que se lança uma exceção com throw (sem ‘s’ ) : Às vezes, após a captura de uma exceção, é desejável relançá-la para que outros métodos lidem com ela. Isto pode ser feito da seguinte forma: public void metodo() throws ExcecaoSimples { try { // instruções } catch (ExcecaoSimples ex) { // faz alguma coisa para lidar com a exceção throw ex; // lança exceção } // fim catch } // fim metodo Tipo de exceção Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 64 Exemplo : Avisar que as exceções podem ocorrer (throws). Neste caso, a exceção não foi lançada e nem capturada. Portanto, ocorrerá erro na excecução. public class Teste { public static void main(String args[]) throws ArrayIndexOutOfBoundsException { int i = 0; String msgs [] = {"Aula"," de"," POOII" }; while (i < 4) { System.out.println ("i = " + i + msgs[i]); i++; } }// fim main } // fim classe Exemplo : Uma exceção pode ser lançada para outro método a tratar, caso ele seja programado para isso. Lançar uma exceção com throw, passa a responsabilidade para o método que disparou este trecho. public class TesteExcecao { static int i = 0; static String msgs [] = { " Hello world!", " Alo mundo!", " Estacio de Sa"}; public static void escrever() throws ArrayIndexOutOfBoundsException { try { while (i < 4) { System.out.println ("i = " + i + msgs[i]); i++; } } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Lancei a exceção"); throw e; // lança a exceção } } // fim escrever public static void main(String args[]) // Ocorrerá erro na exceução { escrever(); }// fim main } // fim classe Objeto e Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 65 Para que o erro não ocorra, seria necessário, já que a programação foi mal feita, capturar a exceção na main. As exceções podem ser de dois tipos:  Exceções verificadas (checked). Neste caso, a exceção obrigatoriamente terá que ser capturada (try/catch) ou pelo menos, declarada com throws.  Exceções de runtime, ou exceções não-verificadas (uncheked). Neste caso na linguagem Java não é exigido o tratamento da exceção e nem que a mesma seja declarada com throws. Por exemplo, para testar o limite de um vetor, basta programar corretamente, o que é o mais adequado. Mas se desejado, pode-se declarar a exceção com throws ou capturá-la com try/catch. Uma exceção em Java é um objeto. A classe raiz de todas as exceções é java.lang.Throwable. Apenas objetos dessa classe ou de suas classes derivadas podem ser gerados, propagados e capturados através do mecanismo de tratamento de exceções. A classe Throwable tem duas subclasses:  java.lang.Exception É a raiz das classes derivadas de Throwable que indica situações que a aplicação pode querer capturar e realizar um tratamento que permita prosseguir com o processamento. Provê alguns métodos muito úteis para obter informações sobre uma exceção, tais como o printStackTrace().  java.lang.Error É a raiz das classes derivadas de Throwable que indica situações que a aplicação não deve tentar tratar. Usualmente indica situações anormais, que não deveriam ocorrer. Errors e RuntimeExceptions são considerados uncheked (não verificadas), portando o compilador não obriga que exista tratamento para eles. Erros normalmente representam situações críticas, que não deveriam acontecer, como por exemplo, acabar a memória da JVM. Já subclasses de RuntimeException representam erros de lógica de programação que devem ser corrigidos (podem, mas não devem ser capturadas: erros devem ser corrigidos) . Exemplos de exceções já definidas em Java incluem:  java.lang.ArithmeticException Indica situações de erros em processamento aritmético, tal como uma divisão inteira por 0. Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 66  java.lang.NumberFormatException Indica que ocorreu uma tentativa de converter uma string para um formato numérico, mas seu conteúdo não representava adequadamente um número para aquele formato. É uma subclasse de java.lang.IllegalArgumentException.  java.lang.ArrayIndexOutOfBoundsException Indica a tentativa de acesso a um elemento de um vetor fora de seus limites - ou o índice era negativo ou ainda, era maior ou igual ao tamanho do vetor. É uma subclasse de java.lang.IndexOutOfBounds, assim como a classe java.lang.StringIndexOutOfBounds.  java.lang.NullPointerException Indica que a aplicação tentou usar null onde uma referência a um objeto era necessária -- invocando um método ou acessando um atributo, por exemplo.  java.lang.ClassNotFoundException Indica que a aplicação tentou carregar uma classe mas não foi possível encontrá-la.  java.io.IOException Indica a ocorrência de algum tipo de erro em operações de entrada e saída. É a raiz das classes java.io.EOFException (fim de arquivo ou stream), java.io.FileNotFoundException (arquivo especificado não foi encontrado) e java.io.InterruptedIOException (operação de entrada ou saída foi interrompida), entre outras. Entre os erros definidos em Java, as subclasses de java.lang.Error, são java.lang.StackOverflowError e java.lang.OutOfMemoryError. São situações onde não é possível uma correção a partir de um tratamento realizado pelo próprio programa que está executando. Como exceções são objetos, podem incluir atributos. A classe Throwable inclui o registro do estado atual da pilha das chamadas de métodos e uma string associada a uma mensagem de erro, que pode ser obtida para qualquer exceção através do método Throwable.getMessage(). Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 67 Hierarquia Principais Métodos de Exception : 1. String getMessage()  Retorna mensagem passada pelo construtor 2. String toString()  Retorna nome da exceção e mensagem 3. void printStackTrace( )  Imprime detalhes (stack trace) sobre exceção Exemplo : Aqui você vê a criação de uma nova exceção que é lançada. Este exemplo ilustra o uso dos métodos getMessage, toString e printStackTrace. public class TesteExcecao { static int i = 0; static String msgs [] = {" Hello world!", " Alo mundo!"," Estacio de Sa"}; public static void escrever() throws ArrayIndexOutOfBoundsException { try { while (i < 4) { System.out.println ("i = " + i + msgs[i]); i++; }// fim do while } // fim try Prof a . Jane Programação Orientada a Objetos I I (Linguagem Java) 68 catch (ArrayIndexOutOfBoundsException e) //e é obj original { System.out.println("Lancei a excecao"); e.printStackTrace(); System.out.println("Treinando a toString " + e.toString()); // cria uma nova exceção - imprime msg desejada e a msg do obj original throw new ArrayIndexOutOfBoundsException("Voce acessou indice inexistente ! " + e.getMessage()); } // fim catch } // fim escrever public static void main(String args[]) { escrever(); } // fim main } // fim classe Exemplo : Entrada de dado via teclado (System.in), através de nextInt(), e verificação se os dados de entrada são dígitos. import java.util.Scanner; public class Numero2 { public static void main(String args[]) { Scanner teclado; teclado = new Scanner(System.in); try { System.out.print("Digite um numero:"); int num = scanner.nextInt(); System.out.println ("O numero digitado foi: " + num); } catch (InputMismatchException e) { System.out.println ("\nERRO: Digite um numero !\n"); } } // fim main } // fim classe
Copyright © 2024 DOKUMEN.SITE Inc.