Este documento fornece uma introdução básica à linguagem de programação Java, incluindo seus paradigmas, características, conceitos de programação orientada a objetos, e o ambiente de desenvolvimento Java. Resume os principais paradigmas de programação, conceitos errôneos sobre Java, e descreve a plataforma Java, incluindo a máquina virtual Java e bibliotecas.
Este documento fornece uma introdução básica à linguagem de programação Java, incluindo seus paradigmas, características, conceitos de programação orientada a objetos, e o ambiente de desenvolvimento Java. Resume os principais paradigmas de programação, conceitos errôneos sobre Java, e descreve a plataforma Java, incluindo a máquina virtual Java e bibliotecas.
Este documento fornece uma introdução básica à linguagem de programação Java, incluindo seus paradigmas, características, conceitos de programação orientada a objetos, e o ambiente de desenvolvimento Java. Resume os principais paradigmas de programação, conceitos errôneos sobre Java, e descreve a plataforma Java, incluindo a máquina virtual Java e bibliotecas.
A 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 . Letcia Winkler [LK].
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
1
Bibliografia
Bibliografia bsica:
1. DEITEL, H. M.; DEITEL, P. J. Java: Como Programar. 6 Edio. So Paulo: Pearson Prentice Hall, 2005. 2. HORSTMANN, Cay; CORNELL, Gary. Core Java 2 Volume I: Fundamentos. So Paulo: Pearson Makron Books, 2001.
Bibliografia complementar:
1. CAMARO, Carlos; Figueiredo, Luclia. Programao de computadores em Java. Rio de Janeiro: LTC, 2003 2. HORSTMANN, Cay S. Big Java. Porto Alegre ; Bookman, 2004.
AVISO: Este material no pretende substituir nenhuma outra apostila, e muito menos qualquer livro.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
2
1. Introduo
1.1. Paradigmas das linguagens de programao [FS]
A maioria das linguagens de programao so extensas e complexas e normalmente integram vrias idias. No entanto, cada linguagem baseia-se, normalmente, numa idia central, ou paradigma. Existem 4 paradigmas (principais) de programao: 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 funes. Ex.: Lisp, ML, Scheme, Haskell. o Paradigma Lgico: Baseado na lgica de predicados (fatos e regras) Ex.: Prolog. Obs: Linguagens de Marcao (HTML) Linguagens de Programao. Linguagens de Marcao no especificam computaes, elas apenas descrevem a aparncia geral de documentos.
1.2. Fundamentos bsicos de programao em Java [FS]
Programao Estruturada x Programao Orientada a Objetos - POO
A principal diferena entre o enfoque tradicional da anlise estruturada e o enfoque da O.O. est na forma pela qual dados e procedimentos se comunicam.
Anlise Estruturada
nfase nos procedimentos Comunicao atravs de passagem de dados (parmetros) Programa = execuo de procedimentos cuja tarefa a manipulao de dados
Anlise Orientada a Objetos (AOO)
Dados e procedimentos fazem parte de um s elemento bsico (objeto ou classe) Dados e procedimentos encapsulados em um s elemento. Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
3
NOTE :
Programao Estruturada
DADOS + FUNES
Programao Orientada a Objetos (POO)
Atributos (dados) + Mtodos (funes)
1.3.Vantagens e caractersticas da linguagem Java [JTAS]
Java como uma linguagem de programao:
Desenvolvida na dcada de 90 por James Gosling da Sun Microsystems Orientada a Objetos Independente de plataforma (portvel) : No h aspectos dependentes da implementao. Por exemplo: Os tipos primitivos tm tamanhos determinados . Uso de recursos de rede Segurana : Para ser usada em ambientes de rede/distribudos. Mecanismos para sistemas livres de vrus e adulteraes, pacotes para criptografia 128 bits, etc. (No se pode provar que 100% segura, mas certamente a linguagem mais segura at hoje por causa destes mecanismos)
Simples (sintaxe similar a C/C++) Internacionalizao (UNICODE) Distribuda e multitarefa : Os programas podem utilizar recursos na Internet com a mesma facilidade que acessam arquivos locais. Lidam com TCP/IP, HTTP, FTP.
Carga dinmica de cdigo : Java foi projetada para se adaptar a um ambiente em evoluo. As bibliotecas podem adicionar livremente novos mtodos e variveis a qualquer instante (mesmo em execuo).
Desalocao automtica de memria (garbage collection)
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
4
Java possui 3 tipos de programas, levando em conta como e quando eles so executados: Applications: programas stand-alone que englobam todos os recursos de acesso ao Sistema Operacional. Semelhantes aos programas convencionais. Applets: programas que so carregados atravs de uma rede TCP/IP de um servidor remoto e so executados localmente pela JVM no escopo de um browser. A JVM impe uma srie de restries aos applets por questes de segurana. Servlets: programas que so executados remotamente em um servidor Web atravs de um servlet container. So usados para gerar contedo dinamicamente.
1.4. Conceitos Bsicos em O.O.
Objeto possui identidade, caractersticas e comportamentos Classe objetos com caractersticas semelhantes so agrupados em uma classe. Dados e procedimentos associados a uma classe so chamados de membros da classe.
Ex. Sistema para informatizao de uma loja comercial. Classe: Funcionrio Objeto: Jos da Silva atributos: nome, endereo,data de admisso, salrio base, etc. mtodos (procedimentos): calcular salrio liquido, mostrar dados, etc.
1.5. Alguns conceitos ERRADOS Sobre JAVA [AC] - Java uma extenso do HTML. - Java fcil de aprender: 1.500 classes e interfaces, sendo necessrio conhecer muitas delas para se construir programas profissionais. - Java um ambiente fcil de programao: existem ambientes grficos de programao, mas o melhor caminho para se aprender um editor simples como o bloco de notas. - Java interpretada, ou seja, lenta para aplicaes srias: isto pode ser resolvido com o uso de compiladores JIT (Just In Time) que compilam na primeira vez que a aplicao usada. No importa que C++ seja mais rpida, Java mais fcil de programar e portvel. - Todos os programas Java executam dentro de uma pgina Web. - Os applets Java so um grande risco segurana: nenhuma linguagem 100% segura, mas as falhas esto sendo corrigidas e o risco muito menor que o encontrado em controles ActiveX. - Javascript a verso 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 Programao Orientada a Objetos I I (Linguagem Java)
5
1.6. A Plataforma Java Caractersticas : [JTAS]
O termo plataforma normalmente usada para designar um conjunto Hardware + Sistema Operacional. A plataforma Java definida apenas em software e possui dois componentes: Mquina Virtual Java (JVM) Conjunto de bibliotecas que disponibilizam funes comuns (API Java)
Diferentemente das linguagens convencionais, que so compiladas para cdigo nativo, a linguagem Java compilada para bytecode" (gerando o .class) que executado por uma mquina virtual (JVM Java Virtual Machine).
Bytecodes interpretados
Cdigo fonte
O modelo inicial (vide figura), que favorece a portabilidade do cdigo, atravs da interpretao dos bytecodes, foi praticamente substitudo por outro em que a interpretao dos bytecodes substituda por outra compilao (a compilao dos bytecodes), que ocorre quando o programa executado (compilador JIT , isto , just-in-time). Essa mudana foi fundamental para tornar Java uma linguagem de alto desempenho.
Obs.: compilar just-in-time : o cdigo compilado quando est em vias de ser executado.
A linguagem Java representa um esforo na direo do conceito write once, run everywhere (escreva uma vez, execute em todo lugar) Uma mquina virtual (Virtual Machine VM) pode ser definida como uma duplicata eficiente e isolada de uma mquina real. A JVM , ento, uma mquina imaginria que implementada atravs da emulao por software usando uma mquina real. Com a JVM existe uma camada extra entre o sistema operacional e a aplicao, responsvel por traduzir (no apenas isso) o que sua Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
6
aplicao deseja fazer para as respectivas chamadas do sistema operacional no qual ela est rodando no momento. Veja a figura :
A especificao da Mquina Virtual Java fornece as especificaes da plataforma de hardware para a qual todo o cdigo Java est compilado. Essa especificao 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 execuo e as bibliotecas comuns. J2EE ou Java EE (Java Enterprise Edition): verso voltada para o desenvolvimento de aplicaes corporativas. Ex: Servlets J2ME ou Java ME (Java Micro Edition): verso voltada para o desenvolvimento de aplicaes mveis ou embarcadas. Ex: celular
1.7. O Ambiente de Desenvolvimento [JTAS]
Java 2 System Development Kit (J2SDK) Coleo de ferramentas de linha de comando para, entre outras tarefas, compilar, executar e depurar aplicaes Java
Ex: JRE, javac, javadoc, etc.
Java Runtime Environment (JRE) Tudo o que necessrio para executar aplicaes Java Parte do J2SDK e das principais distribuies 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 no o JRE (java runtime environment, isto , ambiente de execuo java). O JDK j vem com um JRE, porm o contrrio no verdade. O Prof a . Jane Programao 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 Aplicao
Estrutura de uma aplicao Java: [JTAS] Uma aplicao Java composta de um ou mais arquivos com extenso .java Cada arquivo .java deve conter uma e somente uma classe pblica. O nome do arquivo .java tem que ser igual ao nome da classe pblica que ele contm. 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 extenso .class. Esse o arquivo que contm o bytecode que ser executado pela JVM. Os arquivos .java no precisam estar em um mesmo diretrio. Eles podem ser organizados em uma hierarquia de diretrios de acordo com a finalidade de cada um. Esses diretrios so vistos pela JVM como os diversos pacotes que compem a aplicao. Podemos dizer, ento, que uma aplicao Java mnima 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! So diferentes!
- Esta mini-aplicao em Java imprime um texto na tela quando executada via linha de comando - Aps compilar e executar este programa, ns 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 cdigo; 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 Programao Orientada a Objetos I I (Linguagem Java)
8
dados e mtodos (funes) que sero parte do aplicativo; um aplicativo pode ser composto por uma ou mais classes; o Os nomes das classes (neste exemplo a palavra Primeiro) precisam comear com uma letra e depois desta quaisquer combinaes de letras e dgitos; como padro, os nomes so substantivos que iniciam com uma maiscula; o Para comear a execuo do programa compilado, o interpretador vai iniciar sempre pelo mtodo main da classe indicada; absolutamente necessria a presena do main (por se tratar de um aplicativo); o As chaves, { e }, delimitam os blocos de comandos em JAVA; o Os cabealhos do mtodo main so sempre idnticos ao exemplo acima; o A palavra reservada static significa que o mtodo esttico. Uma classe que contm apenas mtodos estticos pode ser executada sem a necessidade de instanciar a classe; o A palavra reservada void quer dizer que o mtodo no retorna valor, no tem resposta para o mtodo que o chamou; o Neste exemplo o mtodo main contm apenas uma instruo (ou comando ou sentena da linguagem): a instruo utiliza o mtodo println do objeto System.out, para exibir uma string na console padro; cada chamada de println escreve uma nova linha; o Java usa a sintaxe geral: objeto.mtodo(parmetros); o Os mtodos em JAVA podem ter zero, um ou mais argumentos, at mesmo o main, mas mesmo que o mtodo no tenha argumentos, ele ter que possuir parnteses vazios na sua assinatura; o Existe tambm o mtodo print em System.out, que imprime sem quebra de linha no final. o Comentrios sobre pacote (package) : Fica fcil notar que a palavra chave package indica qual o pacote que contm a classe Primeiro. Um pacote pode conter nenhum, um ou mais subpacotes e uma ou mais classes dentro dele. Quando no se pe a linha do pacote, temos um pacote annimo. Os nomes dos pacotes devem ser formados apenas de letras minsculas, no importa quantas letras estejam contidas nele.
Unidades de Compilao - Trs elementos top-level conhecidos como compilation units, no obrigatrios, aparecem em um arquivo Java na seguinte ordem: o Declarao de pacote: package Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
9
o Declaraes de importao: import o Definies de class, interface ou enum - Uma declarao de pacote serve para indicar um caminho de pastas onde devero estar os arquivos (.class) do pacote. Por exemplo: package pasta1.pasta2; indica que os arquivos do pacote esto em pasta2 que est dentro de pasta1. Falaremos de pacote mais adiante. - Uma declarao 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 no das subpastas). - preciso tomar cuidado com ambigidade nos comandos import. Por exemplo, ao utilizar a classe Date, se importou java.util.* e java.sql.* (ambos contm 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 endereo web invertido import java.util.SimpleDateFormat; //importa classe import java.util.*; //o compilador importa classes utilizadas no cdigo
public class Exemplo { //codigo }
Pesquisando na Referncia da Linguagem Java - Verifique a referncia para cada nova classe que for estudada. Acesse: http://java.sun.com/
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
10
2. Estruturas Bsicas de Programao[AC]
2.1. Comentrios em JAVA - Os comentrios no aparecem no executvel do programa; em JAVA temos comentrios de uma linha, sinalizados com //, e temos os comentrios de mais de uma linha, entre /* e */:
// Este um comentrio de uma linha /* Agora podemos escrever o comentrio em vrias linhas. */ - Os comentrios no podem ser aninhados em JAVA, ao contrrio de outras linguagens.
2.2. Tipos de Dados
- JAVA fortemente tipada, ou seja, as variveis 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 variveis lgicas.
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 prtico e o mais usado; - O mais importante que os intervalos possveis no dependem da mquina;
b) Ponto Flutuante [J TAS]
Tipo Tamanho (bytes) Faixa de valores float 4 3.40292347E+38 (6-7 dgitos decimais significantes) double 8 1.79769313486231570E+308 (15 dgitos decimais significantes)
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
11
- O tipo double tem duas vezes a preciso do float. - O double usado na maioria dos casos. - Os valores mnimos e mximos seguem os correspondentes na tabela dos inteiros.
c) O Tipo Caracter (char) - Apstrofos 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
Seqncia de Controle Significado \b backspace (volta um caracter) \t tab (tabulao) \n linefeed (quebra de linha) \r carriage return (incio da linha) \ aspas duplas \ Apstrofos \\ barra invertida
d) O Tipo Lgico (Boolean) - O tipo boolean tem dois valores possveis, false ou true. e so armazenados em 1 byte.
2.3. Declarao de Variveis em Java - Declaram-se as variveis Java colocando o tipo primeiro e depois o nome da varivel, finalizando com ponto e vrgula. - Exemplos:
byte b;
int numerointeiro1, numerointeiro2;
long inteirolongo; //para o valor da nossa dvida externa em centavos
char letra;
- Um identificador precisa iniciar com uma letra e ser uma seqncia de letras ou dgitos; - Podem ser usados smbolos como _, ou qualquer outro do Unicode (conjunto de caracteres utilizado por Java), mas no aconselhvel usar Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
12
principalmente caracteres com acento, por causa da diferena de conjuntos de caracteres nos vrios sistemas operacionais (questo de visualizao correta do smbolo). - Comumente no so usados smbolos para nomenclatura em Java, mais simples usar letras e nmeros, alm de seguir as convenes para cada tipo de identificador (classes iniciam com maisculas, mtodos com minsculas, variveis com minsculas, constantes so escritas com maisculas, etc). - No podem ser usados espaos em nomes de variveis ou de identificadores quaisquer;
2.4. Atribuies e Inicializaes - Deve-se inicializar uma varivel antes de utiliz-la, em geral aps a sua declarao ou na mesma instruo, exemplos: int numero; //esta uma declarao numero = 5; //esta uma atribuio char letra = A; //esta uma inicializao
- As declaraes podem aparecer em qualquer lugar do cdigo, mas uma varivel s pode ser declarada uma vez em um bloco.
2.5. Constantes - A palavra final denota uma constante (utilize maisculas nos nomes das constantes): final double CMPORPOL = 2.54;
Exemplo :
public class Constantes { final double G = 9.81; //gravitao em metros por segundo ao quadrado
public static void main (String[] args) { System.out.println(G + metros por segundo ao quadrado a acelerao da gravidade.); System.out.println(A constante de classe G= + G + pode ser acessada em qualquer mtodo da classe.); } }
2.6. Operadores Aritmticos - Operadores aritmticos: + para adio, - para subtrao, * para multiplicao e / para diviso; Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
13
- ATENO: o operador / denota diviso inteira se os dois argumentos forem inteiros e diviso de ponto flutuante se pelo menos um dos operandos for um nmero real. - O resto inteiro denotado por %. Exemplos: (15 / 4) 3, (15 % 2) 1. - Pode-se utilizar inicializaes 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. Exponenciao - No h operador para exponenciao, deve-se usar o mtodo pow da classe Math, ou seja, Math.pow(operando, expoente). - Para x a , temos: double y = Math.pow (x, a);
Outros mtodos da classe Math - Math faz parte do pacote java.lang. No necessrio importar este pacote, nunca. Podemos us-la diretamente, com ateno para os argumentos de cada funo. Verifique na referncia de Java toda a lista de mtodos de Math.
Mtodo Descrio Exemplo abs (x) Valor absoluto de x Se x = -3, ento abs(x) 3. ceil (x) Arredonda para o prximo inteiro maior que x Se x = 6.7, ceil(x) 7. Se x = -6.8, ceil(x) 6. floor (x) Arredonda para o prximo 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 Programao Orientada a Objetos I I (Linguagem Java)
14
int y = 5 + ++x; //incrementa x antes, y=16, x=11 //ou, se a posio do operador estivesse trocada: int y = 5 + x++; //incrementa x depois, y=15, x=11
2.9. Converses entre Tipos Numricos - Algumas converses so permitidas diretamente: o byte short int long float double o char int long float double
- Em operaes binrias, sero 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 expresso, inclusive String (que veremos mais a frente). - Converses explcitas de tipo ou casts so converses onde so permitidas perdas de informao: double x = 9.997; int nx = (int) x;
- Nesta converso, a varivel nx ter o valor final 9, pois a parte fracionria ser descartada.
- Se for necessrio arredondar um nmero de ponto flutuante para o inteiro mais prximo, um dos mtodos que pode-se usar o mtodo Math.round (Math uma classe de java.lang, pacote padro da linguagem):
double x = 9.997; int nx = (int) Math.round (x);
- Nesta converso, a varivel nx ter o valor final 10. Mas fique atento, round retorna um long, ento ainda necessrio usar o cast se for preciso armazenar em uma varivel de outro tipo. aconselhvel sempre testar os valores obtidos com converses explcitas, a fim de garantir o resultado desejado. - O pacote java.lang usado naturalmente na compilao, nunca preciso incluir (importar) este pacote.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
15
2.10. Operadores Relacionais e Lgicos - Igualdade: (3 == 7) , tem resultado false; - Desigualdade: (3 != 7) , tem resultado true; - Os outros operadores mais comuns >, <, >=, <=, so usados nestas formas mesmo. - Para o and lgico, usa-se &&, para o ou lgico, usa-se ||. O operador de negao o !.
2.11. Hierarquia de Operadores e Parnteses - Como em todas as linguagens, melhor usar parnteses para indicar a ordem das operaes. A tabela de hierarquia de operaes em Java :
Operadores Associatividade [], . (ponto), () (chamada de mtodo) ESQ para DIR !, ~, ++, --, + (unrio), - (unrio) , () (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 so seqncias de caracteres como tudo bem ?. No h um tipo String em Java, e sim uma classe predefinida chamada String, que faz parte do pacote padro de Java. Cada conjunto de caracteres entre aspas uma instncia da classe String: String e = ; //uma string vazia String saudacoes = Ol;
a) Concatenao String uniao = use o sinal de + para + concatenar Strings;
b) Substrings - Java possui um mtodo para se obter um subconjunto de uma string, que o mtodo nomestring.substring(posicaoinicial, posicaolimite) onde: o posicaoinicial a primeira posio a ser inclusa na substring Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
16
o posicaolimite a posio imediatamente posterior ltima a ser inclusa.
- Lembre-se que em JAVA conta-se a partir do 0 (zero), ou seja, a primeira posio de uma string a posio 0. String saudacao = Bem vindo; //0=B,1=e,2=m String s = saudacao.substring(0, 3); //s = Bem //o espao na posio 3 no includo
c) Edio de Strings - Para descobrir o tamanho de uma string, usa-se o mtodo nomestring.length(): String saudacao = Bem vindo; int tamanho = saudacao.length(); //tamanho = 9
- Para descobrir o caracter na posio n de uma string, usa-se o mtodo 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 so 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 so iguais ignorando maisculas e minsculas, usa- se nomestring1.equalsIgnoreCase(nomestring2).
Uma classe pr-definida - Mtodos da Classe java.lang.String - A classe java.lang.String possui muitos mtodos (verifique na referncia da linguagem outros mtodos tambm teis). A referncia da linguagem est acessvel a partir de http://java.sun.com/ ou no javadoc que foi instalado junto com seu JDK. Seguem alguns mtodos interessantes, dos quais uns j foram especificados acima: o charAt(int indice) //retorna o caractere na posio especificada o int compareTo(String outraString) //retorna um valor negativo se a string vier antes de outraString na //ordem do dicionrio, um valor positivo se outraString vier antes e //0 (zero) caso forem iguais Prof a . Jane Programao 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 maisculas e //minsculas o String toLowerCase() //retorna uma nova string convertendo maisculas para minsculas o String toUpperCase() //retorna uma nova string convertendo minsculas para maisculas o String trim() //elimina espaos iniciais e finais
2.13. Comandos de Deciso
a) Comando if
- Forma mais simples: if (condicao) instrucao;
- Com bloco de instrues: if (condicao) { instrucao1; instrucao2; ... }
- Forma mais simples com else: if ( condicao ) instrucao1 else instrucao2;
- Forma com else e bloco de instrues: if ( condicao ) { instrucao1; instrucao2; ... } else { instrucao1; instrucao2; ... }
Prof a . Jane Programao 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) Selees Mltiplas A Instruo switch - A instruo if...else pode ser incmoda quando temos vrias selees com mltiplas alternativas. Com a instruo switch pode-se testar o tipo char e todos os inteiros menos long e no se pode usar conjuntos de valores, a no ser que a verso do JDK instalado seja a partir da 1.5 que aceita objetos Enumeration. (veja a referncia da linguagem) - Exemplo (trecho de cdigo): int opcao = 2; switch ( opcao ) { case 1: System.out.println(A opo 1.); break; // fim do bloco para opcao = 1 case 2: System.out.println(A opo 2.); break; case 3: System.out.println(A opo 3.); break; default: System.out.println(Opo invlida.); break; // a clusula default opcional }
- possvel ainda retirar o comando break de uma clusula fazendo com que a execuo prossiga para os comandos da clusula seguinte, mas isso tem que ser feito com bastante cuidado. Nestes casos aconselhvel acrescentar um comentrio no cdigo.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
19
2.14. Comandos de Repetio
a) Comando for (para-faa) - Se soubermos quantas vezes o conjunto de instrues 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(Lanamento!); } }
- possvel tambm criar laos for com variveis e incrementos em ponto flutuante, com cuidado em relao aos erros de arredondamento dos valores (a expresso limite deve ser bem definida). Tambm permitido utilizar laos com duas variveis de controle.
b) Comandos while (enquanto faa) e do-while (faa enquanto) - Usados quando no sabemos quantas vezes o conjunto de instrues deve ser processado. O while executa o corpo do lao apenas enquanto a condio for true (verdadeira): while ( condicao ) { bloco }
- O while executa o teste da condio antes do incio do bloco. Se for preciso executar pelo menos uma vez o bloco de comandos do lao, deve-se usar a verso do de um lao while: do { bloco } while ( condicao );
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
20
3. Orientao a Objetos [JTAS]
Como j foi estudado, as principais caractersticas do Paradigma OO so : identidade abstrao classificao encapsulamento herana polimorfismo
Conceitos de OO
3.1. Objeto
Um objeto a representao 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 jurdica). Cada objeto possui estados e comportamentos.
Um objeto possui identidade, caractersticas 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 referncia aos objetos b) Caractersticas : Uma caracterstica descreve uma propriedade de um objeto, ou seja, algum elemento que descreva o objeto. Cada caracterstica chamada de atributo do objeto
Exemplo : Objeto moto tem as seguintes caractersticas ou atributos : cor, marca, ano de fabricao, tipo de combustvel
c) Comportamento :
Definio:
o Um comportamento representa uma ao ou resposta de um objeto a uma ao do mundo real (AO ou REAO) o Cada comportamento chamado de mtodo do objeto
Obs. : Em C++, os mtodos podem ser tambm chamados de funes membro.
Prof a . Jane Programao 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 inmeros objetos ativos. Cada objeto ativo no sistema em particular tambm chamado de instncia. As diferentes instncias possuem seu prprio estado.
Exemplo :
Objeto : Maria
Estado : Idade : 20 anos Altura : 1,60 m Peso : 58 Kg Comportamento : andar, falar e pular
Uma segunda caracterstica de OO a abstrao, que foca as caractersticas essenciais de algum objeto, de acordo com a perspectiva do observador.
Exemplo :
Se pensarmos no conceito de conta corrente bancria e abstrairmos este conceito, podemos identificar detalhes comuns, como o nmero da conta, nmero da agncia e saldo; e operaes como dbito em conta, depsito e extrato da conta.
Basicamente essas so as caractersticas de conta corrente para todos os bancos, apesar de um ou outro banco ter uma poltica de descontos de taxas etc.
medida que refinamos um objeto, mais especfico ele se torna e mais dependente do domnio da aplicao.
A terceira caracterstica de OO a classificao. Na Classificao, Objetos com as mesmas caractersticas (atributos e comportamento) so agrupados em uma classe, sendo que cada classe define um conjunto possvel de objetos.
Exemplo : Objetos mesas abstrair em Classe Mesa Classe Mesa Atributos: tamanho, forma, nmero de ps, ___ material Operaes : mover, limpar
Atributos : idade, altura e peso
Mtodos : andar, falar e pular Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
22
3.2.Classes
A classe descreve as caractersticas e comportamento de um conjunto de objetos :
Cada objeto possui uma nica classe O objeto possuir os atributos e mtodos definidos na classe O objeto chamado de instncia de sua classe A classe o bloco bsico para a construo de programas OO
Criao de Objetos:
A classe responsvel pela criao de seus objetos Esta criao realizada atravs de um mtodo especial, chamado de construtor Em Java, usa-se new para se criar um objeto.
Eliminao de Objetos A classe responsvel pela eliminao de seus objetos, quando eles no podem mais ser utilizados pelo sistema Esta eliminao realizada por um mtodo especial, chamado de destrutor
Comentrios :
1. Em Java no 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 caracterstica em OO, isto , a Classificao, temos a observar que:
Cada objeto dito ser uma instncia de uma classe Cada instncia mantm seus prprios valores de atributo (estado), mas compartilha os nomes dos atributos e comportamento (operaes) com outras instncias da classe.
Uma quarta caracterstica do Paradigma OO o encapsulamento. Relacionando esta caracterstica com os conceitos de classe e objeto pode-se afirmar que :
Uma classe encapsula atributos (nomes, tipos) e comportamentos, ocultando os detalhes de implementao dos objetos.
Com relao ao encapsulamento, os mtodos formam uma cerca em torno dos atributos, que no podem (ou devem) ser manipulados diretamente. Os atributos somente podem ser alterados ou consultados atravs dos mtodos do objeto. Considerando clientes de um objeto X os outros objetos que utilizam mtodos de X, os benefcios do encapsulamento so : Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
23
os clientes de um objeto podem utilizar seus mtodos sem conhecer os detalhes de sua implementao A implementao de um objeto pode ser alterada sem o conhecimento de seus clientes, desde que a interface visvel seja mantida
Um programa OO um conjunto de objetos que colaboram entre si para a soluo de um problema. A colaborao ocorre atravs de trocas de mensagens, sendo que a troca de mensagem representa a chamada de um mtodo.
Controle de visibilidade
Os atributos e mtodos, em termos de visibilidade, podem ser :
public acessveis por qualquer classe private acessveis pela prpria classe protected Acessveis pela prpria classe ou por seus descendentes
3.3.Herana
O compartilhamento de atributos e comportamentos entre classes baseiam-se num relacionamento hierrquico. Uma classe pode ser definida genericamente e ento refinada (especializada) sucessivamente em sub-classes mais especficas.
Herana Simples x Herana Mltipla
Se uma classe herda de apenas uma superclasse (classe me ou base), temos uma herana simples Se uma classe herda de diversas superclasses, temos uma herana mltipla
No existe herana mltipla em Java.
Exemplo : A classe Animais pode ser subdividida nas sub-classes anfbios, mamferos, aves, peixes e rpteis.
3.4. Polimorfismo
Uma subclasse pode redefinir um elemento herdado, o que denominado polimorfismo. O polimorfismo se realiza atravs da recodificao de um ou mais mtodos herdados por uma subclasse. Ou seja, um mesmo comportamento pode se Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
24
apresentar de forma diferente em classes diferentes (poli = vrios, morfismo = forma). Uma linguagem de programao orientada a objetos automaticamente escolhe o mtodo correto para implementar uma operao baseado no nome da operao, nos dados que carrega (parmetros) e na classe implementada do objeto (assinatura do mtodo) . Por isto, novas classes podem ser acrescentadas sem a modificao de todo o cdigo existente Mais adiante, falaremos mais de Polimorfismo.
Comentrio [AC] : Ao projetar um sistema POO, comeamos pela determinao das classes e depois acrescentamos os mtodos de cada classe. Uma regra para criar as classes procurar por substantivos no problema. Os mtodos correspondem aos verbos. Exemplo: Num sistema de processamento de pedidos: - Classes (substantivos): item, pedido, endereo para remessa (endereoRemessa), pagamento, conta, etc. - Mtodos (verbos): itens so adicionados aos pedidos, pedidos so enviados ou cancelados, pagamentos so aplicados aos pedidos. Cada verbo sugere um mtodo. - Objetos: com cada verbo, como adicionar, enviar, cancelar e aplicar, necessrio identificar o objeto que tem a maior responsabilidade em efetuar esta ao.
Exemplo [FC]: Apresenta uma classe Ponto com 2 atributos, e outra classe TestaPonto que cria uma instncia 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 . no privado p.y = 2;
System.out.println ("Coordenada (x,y) = (" + p.x + "," + p.y +")"); } } Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
25
3.5. O Vocabulrio 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 padro a primeira letra do nome da classe em maiscula (como String, System, Math etc.). b) OBJETO - Instncia da classe; componente na memria com seus atributos e dados prprios, que utilizam seus mtodos para manipular os seus dados internos; se comunicam entre si atravs de mensagens (chamadas a mtodos). - Para criar um objeto e utilizar (chamar) os seus mtodos necessrio utilizar o operador new: Casa c1 = new Casa(); c) BIBLIOTECA PADRO - Classes e pacotes para diversos propsitos tais como projetos de interface de usurio e programao em rede. d) CLASSE Object - As classes em Java sempre so formadas a partir de outras classes. Uma classe formada a partir de outra "estende" esta outra. Em Java existe uma classe "me" a partir da qual todas as outras classes so 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 implementao dos dados, de forma que o usurio do objeto (em geral outro objeto) no veja como estes dados so manipulados. Dizemos que os dados e mtodos so encapsulados em objetos. outro conceito fundamental em POO. O encapsulamento d aos objetos a caracterstica de "caixa-preta". Os objetos devem se comunicar apenas atravs de mensagens, ou seja, seus dados (atributos) devem estar protegidos de outros objetos e s podero ser acessados atravs de mtodos (funes). f) VARIVEIS DE INSTNCIA - Dados ou atributos do objeto (s existem aps 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 geomtricas quadrado e tringulo eqiltero. Definiremos para o exemplo o valor dos lados como 10, para vermos a diferena no valor das reas calculadas. O primeiro passo criar as classes (cujos nomes sero: Quadrado e Triangulo, a partir das quais sero gerados os objetos q e t no mtodo main:
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
26
public class Quadrado { double lado = 0;
public double area() //mtodo clculo da rea { return (lado * lado); } // Retorno com return } Salve como Quadrado.java mas no 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 no 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 mtodo 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 mtodo area do obj q s = t.area(); System.out.println("rea do Tringulo: "+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 sero compiladas gerando os trs arquivos .class. Isto acontece porque Java reconhece quais as classes que fazem parte do sistema, pois esto sendo chamadas pela classe principal, e as compila. Execute com java Figuras.
3.6. Observaes sobre variveis, valores, referncias e tipos[FS]
a) Variveis, valores e referncias Variveis so usadas em linguagens em geral para armazenar valores Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
27
Em Java, variveis podem armazenar endereos de memria ou valores atmicos de tamanho fixo
b) Tipos Tipos representam um valor, uma coleo de valores ou coleo de outros tipos. Podem ser Tipos bsicos, ou primitivos, quando representam unidades indivisveis de informao de tamanho fixo. Exemplo : um inteiro, um booleano ... Tipos complexos, quando representam informaes 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 so armazenados como objetos .
3.7. Coleta de Lixo [FS]
A memria alocada em Java no liberada pelo programador, ou seja, objetos criados no so destrudos pelo programador
A criao de objetos em Java consiste de
Alocar memria para armazenar os dados do objeto Inicializar o objeto (via construtor) Atribuir endereo de memria a uma varivel (referncia)
Mais de uma referncia pode apontar para o mesmo objeto
Mensagem m, n, p; m = new Mensagem("A"); n = m; p = new Mensagem("B");
Quando um objeto no tem mais referncias apontando para ele, seus dados no mais podem ser usados e a memria deve ser liberada.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
28
O coletor de lixo ir liberar a memria na primeira oportunidade
n = null; p = new Mensagem("C");
3.8. Um pouco de entrada e sada de dados em JAVA [AC]
a) Leitura de Dados via Entrada Padro
- A leitura de dados de entrada pelo teclado era difcil em Java antes da verso 1.5. Quando usamos componentes como caixas grficas de entrada de dados isto se torna menos complexo, mas antes disso preciso verificar como funciona a entrada via console.
- De forma gerla, uma declarao 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 no as subpastas).
- O exemplo a seguir utiliza a classe Scanner, que possui mtodos 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 Programao Orientada a Objetos I I (Linguagem Java)
29
System.out.println("Informe nome:"); //l uma string como o mtodo nextLine() String nome = entrada.nextLine();
System.out.println("Informe idade:"); //l um inteiro com o mtodo nextInt int idade = entrada.nextInt(); System.out.println("Nome:" + nome + "\nIdade:" + idade); } } Tabela com alguns mtodos da classe Scanner [JTAS]
Mtodo Descrio 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 Grficos do Pacote Swing - Mais tarde estudaremos componentes grficos para interfaces de aplicativos, mas j podemos comear a trabalhar com o componente chamado JOptionPane, que representa uma janela ou caixa de dilogo com o usurio. A classe JOptionPane est no pacote javax.swing que devemos importar para utilizar este componente.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
30
public class Mensagem { public static void main (String[] args) { //comando para a caixa de dilogo JOptionPane.showMessageDialog (null, Esta uma mensagem !);
//sada obrigatria do sistema System.exit(0); } }
- O componente pode ser usado, pois a classe foi includa no cdigo com o comando import. possvel tambm 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 parmetros: o primeiro, com valor null, representa o componente parent (janela maior que abriria a caixa de mensagem, como no existe, usa-se null), o segundo representa a mensagem a ser exibida. - Por ltimo, preciso, sempre que se usar componentes de interface com o usurio, incluir o comando de sada do sistema, para encerrar a execuo. - Uma verso mais completa do comando de caixa de dilogo contm quatro argumentos, como segue: JOptionPane.showMessageDialog (null, Texto da Mensagem, Titulo da janela, TIPOICONE); - O campo TitulodaJanela aparece na barra azul da caixa de dilogo. 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 Programao 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 varivel do tipo String aguardando o retorno (as janelas retornam sempre uma string):
String numLido = JOptionPane.showInputDialog( "Informe:" ); - Gerando a janela a seguir:
- Aps a leitura, necessrio obter o nmero a partir da string lida, o que deve ser feito com um dos comandos a seguir: int numero = Integer.parseInt( numLido ); //obtm inteiro
double numero = Double.parseDouble( numLido ); //obtm ponto flutuante Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
32
NOTE : Classe Integer com o mtodo parseInt Classe Double com o mtodo 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");
JOptionPane.showMessageDialog (null, "A soma "+resultado, "Resultado:", JOptionPane.PLAIN_MESSAGE);
System.exit( 0 ); } }
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
33
4. Vetores (Arrays)
So estruturas homogneas, ou seja, so estruturas utilizadas para armazenar vrios elementos de um mesmo tipo. Os elementos de um vetor, em Java, podem ser de tipos primitivos (Ex: int, double, etc) ou objetos (referncias). O primeiro elemento (posio) possui ndice 0 (zero). So tratados em java como objetos, ou seja, para serem utilizados temos que instanci-los (usando new).
4.1. Criao 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 substituda 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; // referncia do vetor (Coisa[]) null Coisa[] b = new Coisa[5]; // referncias 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 dimenso
int b[][]; //Declarao b = new int[3][3]; //Criao Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
34
b[1][2]=5; //Atribuio ou int b[][] = {{2,3,4},{4,5,6}};
4.4. Vetores com dimenses diferentes
int b[][]; b = new int[2][]; b[0]=new int[3]; b[1]=new int[10];
5. Getters, Setters e Construtores
5.1. Construo de Classes Veremos agora algumas recomendaes para criarmos programas JAVA mais sofisticados, onde a classe escolhida para comear a executar pelo interpretador geralmente tem pouca funcionalidade alm de criar os vrios objetos que vo realmente fazer o trabalho do programa.
Construtores - Um construtor tem o mesmo nome da classe; - Um construtor pode ter um ou mais parmetros, ou mesmo nenhum (construtor padro fornecido pelo compilador); - Um construtor sempre chamado atravs da palavra-chave new; - Um construtor no retorna valor (mesmo assim no 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 Padres - Se um mtodo construtor no for especificado para uma classe e um objeto for referenciado no sistema, um construtor padro ser providenciado. Estes Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
35
construtores no tm argumentos e inicializam todos os campos de instncia com valores padres.
Sobrecarga de Construtores - Ao implementar uma classe, podemos definir mais de um construtor para a classe, a fim de que possamos criar objetos de vrias 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 instncia com a data atual do sistema e o segundo inicializa os campos de instncia com os parmetros passados na inicializao do objeto. - A sobrecarga de mtodos acontece quando vrios mtodos dentro de uma mesma classe tm o mesmo nome, mas argumentos diferentes (o compilador decide que mtodo ser usado). - Java permite sobrecarregar qualquer mtodo, de qualquer tipo!
Utilizao de Mtodos 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 comunicao apenas atravs de mensagens (chamada dos mtodos). A classe Cliente no exemplo anterior j possui dados privados. - Os mtodos tambm podem ser private, o que os torna acessveis apenas por outros mtodos da mesma classe. Estes mtodos ocorrem normalmente quando se divide um mtodo pblico em vrios mdulos de tarefas especficas. - recomendvel encapsular tarefas internas das classes do sistema em mtodos privados, para que possam ser modificadas minimizando as mudanas no lado do usurio, sem mexer na interface com o usurio.
Mtodos Acessadores (getters) e Modificadores (setters)
- Acessadores so mtodos que simplesmente retornam o estado atual de um campo private do objeto. Por conveno, os nomes iniciam com o prefixo get. Por exemplo, digamos que na nossa classe Empregado, quisssemos um mtodo para nos retornar o nmero da conta do cliente: public int getNumConta () { return numConta; //o get retorna } A partir de agora, com este mtodo, tornamos o campo numConta um campo de somente-leitura para o mundo exterior classe, ou seja, s atravs de operaes na classe possvel modificar o seu valor. Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
36
Um mtodo modificador para este mesmo campo poderia ser: public void setNumConta (int novoNumero) { numConta = novoNumero; //o set modifica } Em geral, quando o usurio tem interesse em ler e escrever em um campo private, o programador poder fornecer (se estiver de acordo com o projeto): o Um mtodo pblico de leitura de campo (acessador get); o Um mtodo pblico de alterao de campo (modificador set).
Inicializao de atributos - Em Java, se o construtor do objeto no indicar o valor para inicializao dos campos de instncia, os nmeros so inicializados com 0 (zero), objetos com null e booleanos com false, mas as variveis locais dos mtodos precisam ser inicializadas explicitamente
Referncia ao Objeto Atravs de this - Para acessar o objeto atual em sua totalidade e o no atributo em particular, usamos this: 1. Fazendo referncia ao objeto no qual o mtodo opera. System.out.println (this); //mostra apenas o endereo do objeto //usaremos isto no tratamento de eventos //no prximo captulo
2. Chamada para outro construtor da mesma classe. um excelente artifcio para combinar cdigo dos construtores.
Veja um exemplo completo, mostrando vrios 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 Programao 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 Programao 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 definio da classe (esta a conveno): public class NomeClasse
- abstract o Classes abstract so classes que no permitem que sejam instanciadas, ou seja, servem para definir superclasses. o Para declarar uma classe como abstract, inclua a palavra reservada abstract na definio da classe: public abstract class NomeClasse
- final o Classes final so classes que no permitem que voc crie subclasses delas. Para declarar uma classe como final, inclua a palavra reservada final na definio da classe: public final class NomeClasse
B) Modificadores de Mtodos e Atributos
- public o Faz com que o mtodo ou atributo possa ser utilizado livremente, como em (na definio da classe Empregado): public double calc ()
- protected o Faz com que o mtodo 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 mtodo ou atributo somente possa ser invocado na classe em que definido. Mas as instncias da classe podem acessar os atributos em outras instncias da mesma classe, ou seja, private concernente classe e no s instncias. Uma subclasse no acessa atributos nem mtodos private da superclasse. private double calc () Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
39
- static o Mtodos e atributos static podem ser considerados como pertencentes classe e no s instncias. Um membro static pode ser invocado por todas as instncias da classe, ou mesmo sem a instanciao de um objeto, como o caso do mtodo main na criao de um aplicativo: public static void main (String[] args)
- final o Mtodos final no permitem sobreposio. Atributos final possuem valor constante, ou seja, no podem ser modificados. public static final double LUCRO = 0.2;
- abstract o Mtodos abstract no possuem corpo, apenas definem a assinatura do mtodo e indicam que devem ser implementados nas subclasses. Mtodos static, final e private no podem ser abstratos, no 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 no uma palavra-chave em Java, apenas uma denominao. Na prtica, 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 ento definir bem os modificadores de acesso, escreva todos, mesmo que sejam public. Em Java uma boa prtica de programao deixar tudo muito claro e definido.
Hierarquia de Modificadores na Sobreposio de Mtodos - A ordem a ser respeitada : private default protected public ou seja, um mtodo private pode ser reescrito nas subclasses com os modificadores private, default (sem modificador), protected e public, um mtodo default pode ser reescrito nas subclasses com os modificadores default, protected e public, e assim por diante.
- Para maiores informaes sobre modificadores, leia o captulo 3 do Sybex Complete Java Certification Study Guide. Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
40
Sintaxe de declarao de atributos
Sintaxe bsica:
[modificador]* tipo identificador [= valor] ;
onde:
[modificador]* zero ou mais modificadores (de acesso, de qualidade), separados por espaos: public, private, static, final, etc. tipo tipo de dados que a varivel (ou constante) pode conter identificador nome da varivel ou constante [= valor] valor inicial da varivel ou constante
Exemplo:
protected static final double PI = 3.14159 ; int numero;
[mod]* zero ou mais modificadores separados por espaos tipo tipo de dados retornado pelo mtodo identificador nome do mtodo [arg]* zero ou mais argumentos, com tipo declarado,
separados por vrgula
[throws exceo*] declarao de excees. 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 Programao Orientada a Objetos I I (Linguagem Java)
41
6. Mais POO em Java Herana e Polimorfismo
6.1. Herana [AC] Ao estender uma classe, a classe filha passa a possuir todos os atributos e mtodos da classe me, alm dos seus prprios. Pode-se tambm adicionar ou modificar mtodos que se aplicam apenas a esta classe filha. Ento, a classe filha "herda" mtodos e propriedades da classe me.
Vejamos um exemplo: Suponha que numa firma hipottica, os empregados sejam identificados por suas matrculas e nomes. H, porm, dois tipos de empregados: os vendedores e os tcnicos. Os vendedores tm uma comisso sobre o salrio e os tcnicos tm um ttulo (advogado, engenheiro, etc.). Graficamente, pode-se representar este sistema desta forma:
- O vendedor tem, alm de matrcula, nome, e salrio, uma quarta informao, a porcentagem de comisso, 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 Programao 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 (tambm chamada superclasse), e as classes Vendedor e Tcnico (tambm chamadas subclasses) utilizam tais atributos, pois os herdam da super classe da qual so derivadas.
- No cdigo acima, criamos a classe Vendedor por herana da classe Empregado utilizando o nome desta aps a instruo extends:
public class Vendedor extends Empregado
- Qualquer modificao na classe Empregado refletir na classe Vendedor (bem como na classe Tecnico). Por exemplo, a alterao do atributo matricula de String para int altera este dado tambm nas subclasses.
Para completar o exemplo, s falta a classe que instanciar os objetos das classes Empregado, Vendedor e Tcnico. Para utilizar os atributos e mtodos 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 cdigo-fonte definido a seguir:
public class Firma { public static void main(String[] args) { Empregado e; //declaraes Vendedor v; Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
43
Tecnico t;
e = new Empregado(); //instanciaes v = new Vendedor(); t = new Tecnico();
Salve-o como Firma.java, compile-o (as outras classes sero 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 mtodos, 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 variveis objeto. Veja:
Empregado e; // e no objeto ainda nem se refere a nenhum //objeto
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
44
e.calculaAumentoAnual(); // NO AINDA !!!!!! ERRO!!!
e = new Empregado(); // agora sim ! Existe o objeto e
6.3. Relaes entre Classes - Relaes 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 mtodo de A envia uma mensagem para um objeto da classe B, ou se um mtodo de A cria, recebe ou retorna objetos da classe B. O uso desta relao deve ser minimizado, visando independncia de funcionamento entre as classes, facilitando a manuteno do cdigo.
o Incluso (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 Herana ( um): denota especializao ou generalizao. quando uma classe estende outra. Vendedor um Empregado.
6.4. Polimorfismo
Voltando ao assunto Herana, veremos um conceito muito importante, o de Polimorfismo. No nosso exemplo Firma, o vendedor deve ter X% de comisso. Suponha ento que seja necessria a construo de um mtodo que calcule o salrio de todos os empregados, descontando 15% de imposto. Por exemplo, se o salrio de:
O mtodo para clculo do salrio para a classe Empregado pode ser:
public double calc() { return ( 0.85 * salario ); //desconto de 15% }
E esse mtodo ser herdado pela classe Tecnico. Porm, a classe Vendedor dever implementar seu prprio mtodo:
public double calc() { double sal = salario * (1 + comissao/100); //aumento de 20%
return ( 0.85 * sal); //desconto de 15% }
Graficamente, os mtodos so representados separadamente dos atributos, na parte inferior. Desta forma, poderamos reescrever os cdigos para um novo exemplo:
Empregado
matricula nome salario
calc() Vendedor
comissao
calc() Tecnico
titulo Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
46
public class Empregado { String matricula; String nome; double salario;
Ento, Polimorfismo a capacidade que os mtodos de mesmo nome tm de efetuarem tarefas diferentes. Polimorfismo: um mesmo mtodo com vrias formas. O polimorfismo acontece quando os mtodos so definidos em classes em herana (sobreposio) No nosso caso, o mtodo calc efetua um clculo quando utilizado pelos objetos das classes Empregado e Tecnico, e outro clculo quando o objeto em questo foi instanciado da classe Vendedor. Pode-se observar que tanto Empregado como Tecnico utilizam o mtodo calc para clculo do trabalho, e que Vendedor, apesar de utilizar o mtodo calc, utiliza o seu prprio mtodo, com corpo diferente daquele definido na classe ancestral Empregado. Resumindo o conceito de Polimorfismo: Reutilizao do mesmo nome para um conceito correlato em tipos diferentes.
No confunda ! o Sobreposio (Overriding) comparao feita em tempo de execuo que pergunta Qual mtodo foi definido para este tipo de objeto? Existe uma redefinio deste mtodo na classe do objeto ou deve ser usado o mtodo definido na superclasse?. o Sobrecarga (Overloading) comparao feita em tempo de compilao que pergunta Qual mtodo possui os tipos de argumentos correspondentes? e escolhe o mtodo que ser usado. Recurso usado no caso de mtodos de mesmo nome, definidos em uma mesma classe, com argumentos diferentes.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
48
6.5 . Uso de SUPER O comando super sempre se refere a uma superclasse. Todo mtodo construtor de uma subclasse precisa tambm chamar um construtor para os campos de dados da superclasse, caso existam campos de instncia tambm na superclasse. Se a superclasse tiver um construtor ento as subclasses precisam usar super para passar os parmetros, a fim de utilizar este construtor da superclasse.
super tambm pode ser usado para passar parmetros para mtodos da superclasse, utilizando o cdigo deste, sem ter que redefinir totalmente o mtodo, 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 salrio no 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 Programao 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; }
//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","Joo",100); Prof a . Jane Programao 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. ");
Prof a . Jane Programao 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 prpria condio de herana e pode ser interessante, se for desejvel, por exemplo, criar um vetor com objetos das subclasses. No possvel, 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 expresso do seu lado direito no tipo da varivel ou objeto do lado esquerdo de uma atribuio. (tipo) expressao ou (Classe) expressao Se tivermos, por exemplo, int x = 5; O clculo x/2 dar o inteiro 2 (quociente da diviso com /). O clculo 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; // variveis de instncia
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 Programao 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 Programao Orientada a Objetos I I (Linguagem Java)
53
// Atribui objeto da subclasse a um objeto da superclasse // Ocorrer vinculao dinmica ou vinculao tardia . Ou seja, // Java sabe que o objeto na verdade um crculo. // Por isso, o mtodo 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 no um ponto.
c2 = (Circulo) p2; //Converte p2 para c2 apenas neste momento saida += "\n\nCirculo c1 (via c2) : " + c2.toString();
// ERRO de sintaxe na prxima linha : objeto da subclasse recebe obj. // da superclasse. Nem que haja cast ser possvel !!!
//c2 = (Circulo)p1; // ERRO !!!!!
System.out.print(saida + "\n\n"); } // fim main } // fim classe
Comentrio : Lembre-se de que os construtores nunca so herdados, pois so especficos da classe onde so definidos.
6.7. Classes Abstratas [AC] Ao subir na hierarquia de heranas, as classes tornam-se mais genricas. A classe ancestral pode tornar-se to geral que acaba sendo vista mais como um modelo para outras classes, do que como uma classe com instncias especficas. Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
54
Uma classe declarada abstrata no pode ser instanciada, nenhum objeto desta classe pode ser criado. Se a classe abstrata contm um mtodo abstrato, deve-se implementar o mtodo concreto (com todo o cdigo) nas subclasses. Os mtodos abstratos servem apenas como declarao dos mtodos concretos. Quando uma subclasse de uma classe abstrata no implementa todos os mtodos abstratos que herda, ela tambm abstrata, no podendo, portanto, ser instanciada. Mtodos static, private e final no podem ser abstract. A justificativa a seguinte : 1. por definio, um mtodo final no pode ser sobrescrito na subclasse; 2. por definio, um mtodo private s pode ser acessado na classe onde foi escrito 3. mtodos static no podem ser sobrepostos.
Uma classes abstrata pode ter: [item de FS] mtodos concretos (usados atravs das subclasses) campos de dados (memria alocada na criao de objetos pelas suas subclasses) construtores (chamados via super( ) pelas subclasses) Uma classe abstrata dita "pura", quando : no tm procedimentos no construtor (construtor vazio) no tm campos de dados (a no ser constantes estticas - static) todos os mtodos so abstratos
Classes abstratas "puras" podem ser definidas como "interfaces" , que estudaremos mais adiante. No nosso exemplo Firma, se definssemos a classe Empregado como abstract, no poderamos instanciar objetos desta classe, e a mesma serviria apenas como modelo para Vendedor e Tecnico (tente modificar o cdigo, retirando tambm a instanciao de Empregado). No exemplo a seguir, para termos um vetor de formas (Circle, Retangle, etc), definimos uma classe abstrata Shape, com mtodos abstratos apenas. Poderemos ento criar um array de objetos Shape. O cdigo de Shape :
public abstract class Shape { public abstract double area (); public abstract double total (); // outros mtodos poderiam ser includos aqui, // sendo abstract ou no }
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
55
Usando estas classes, poderamos utilizar um cdigo 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 cdigo 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 mtodos area() e total() de qualquer objeto Shape do array, embora a classe Shape no defina um corpo para estes mtodos. Quando se faz isso, o mtodo a ser invocado encontrado como mtodo dinmico, a rea de um Circle calculada usando o mtodo definido em Circle e a rea de um Rectangle calculada usando o mtodo definido em Rectangle. Prof a . Jane Programao 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 Herana Mltipla), a soluo elegante de Java se chama Interface de Objeto. Ou seja, uma classe pode estender apenas uma superclasse, mas pode implementar vrias 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. No definida nenhuma implementao dentro de uma interface e as seguintes regras devem ser seguidas : o Todos os mtodos de uma interface so abstract, mesmo que seja omitido o modificador na assinatura. No h implementao, os mtodos terminam com ponto e vrgula. o Uma interface define uma API pblica. Todos os mtodos de uma interface so implicitamente public, mesmo quando o modificador omitido. um erro definir um mtodo protected ou private em uma interface. o Uma interface no pode definir campos de instncia. So permitidos apenas os campos constantes (static e final). o Uma interface no pode ser instanciada. o Quando uma classe implementa mais de uma interface, ela deve implementar cada mtodo 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 Programao Orientada a Objetos I I (Linguagem Java)
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; // variveis de instncia
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 Programao 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 Programao Orientada a Objetos I I (Linguagem Java)
59
public String getNome() { return "Circulo"; }
// Converte Circulo para uma representao de String, // usando o mtodo toString() da classe Ponto
public String toString() { return "Centro = " + super.toString() //invoca o mtodo do pai + "; Raio = " + raio ; }
}
Comentrios :
1. Quando uma classe implementa uma interface, aplica-se o mesmo relacionamento um fornecido por herana. Por exemplo, como a classe Ponto implementa (implements) Shape, um objeto da classe Ponto um Shape. Alm disso, qualquer objeto de qualquer classe que estende Ponto, tambm um Shape. 2. O mtodo toString() definido na classe Object da seguinte forma :
String toString() retorna uma representao de string do objeto
Note que ele foi sobreposto nas classes vistas.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
60
7. Excees [FS , Prof. Letcia Winkler e JTAS]
7.1. Introduo
Uma exceo um evento que foge ao fluxo normal de execuo esperado em um programa. uma situao excepcional e geralmente indesejvel que pode ocorrer durante a execuo de um programa. Excees podem ser tratadas incluindo-se cdigo adequado no programa. Portanto, erros fatais no podem ser tratados como exceo. Alguns exemplos de excees so:
ndice de um vetor fora do intervalo permitido. Problemas em operaes aritmticas, tais como overflow, underflow e divises por zero. Parmetros invlidos na chamada de um mtodo. Falta de memria. Arquivo no encontrado O mecanismo de tratamento de exceo deve ser utilizado, por exemplo, para processar apenas situaes excepcionais em que um mtodo incapaz de completar sua tarefa por razes que ele no pode controlar.
O modelo de tratamento de excees do Java permite tratar uma exceo num escopo diferente daquele que gerou a exceo. Isto permite uma melhor organizao do cdigo. Em Java, existem vrias classes de excees, todas elas subclasses de java.lang.Exception.
Mtodos podem capturar excees (Mecanismo try-catch) ou podem deixar passar excees que ocorrerem em seu corpo, mas obrigatrio, para a maior parte das excees, que o mtodo declare quaisquer excees que ele no capturar (usar throws).
7.2. Tipos de erros em tempo de execuo
Basicamente, h trs tipos de erros em tempo de execuo :
1. Erros de lgica de programao : Devem ser corrigidos pelo programador
Ex: limites do vetor ultrapassados, diviso por zero
2. Erros devido a condies do ambiente de execuo : Fogem do controle do programador, mas podem ser contornados em tempo de execuo Ex: arquivo no encontrado, rede fora do ar, etc.
3. Erros graves onde no adianta tentar recuperao : Fogem do controle do programador e no podem ser contornados .
Ex: falta de memria, erro interno da JVM Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
61
7.3. Excees e mtodos
Uma declarao throws (observe o "s") obrigatria em mtodos e construtores que deixam de capturar uma ou mais excees que ocorrem em seu interior, caso tais excees precisem ser checadas pelo compilador.
Ex: public void m() throws Excecao1, Excecao2 {...} public Circulo() throws ExcecaoDeLimite {...}
A palavra reservada throws declara que o mtodo pode provocar excees do tipo declarado (ou de qualquer subtipo). A declarao abaixo declara que o mtodo pode provocar qualquer exceo. Evite ao mximo de fazer isto !
Ex: public void m( ) throws Exception {...}
Mtodos sobrepostos no podem provocar mais excees que os mtodos originais.
O que acontece quando ocorre uma exceo?
Uma exceo lanada interrompe o fluxo normal do programa, o que faz com que o fluxo do programa siga a exceo. Se o mtodo onde ela ocorrer no a capturar, ela ser propagada para o mtodo que chamou este mtodo, e assim por diante. Se ningum capturar a exceo, ela ir causar o trmino da aplicao. No entanto, se em algum lugar ela for capturada, o controle poder ser recuperado.
7.4. Estrutura do Mecanismo de Tratamento de Excees
try { // Cdigo que pode gerar uma exceo. // Se a exceo ocorrer, daqui at o fim deste bloco nada ser executado } catch (XException ex) { /* Bloco de tratamento associado condio de exceo XException ou a qualquer uma de suas subclasses, identificada aqui pelo objeto com referncia ex */ } catch (YException ey) { /* Bloco de tratamento para a situao de exceo YException ou a qualquer uma de suas subclasses, identificada aqui pelo objeto com referncia ey */ } // outros blocos catch finally { /* Bloco de cdigo que sempre ser executado aps o bloco try, independentemente de
sua concluso ter ocorrido normalmente ou ter sido interrompida. S obrigatrio se no forem especificados blocos catch */ } Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
62
Observaes: XException e YException devem ser substitudos pelo tipo de exceo. Os blocos no 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 exceo e pode tratar de qualquer exceo que seja da mesma classe ou uma subclasse daquela declarada. Pode-se chamar cada bloco de catch de tratador de exceo, j que quando possvel o bloco catch tentar recuperar a situao. possvel fazer um bloco catch para uma exceo especfica e outro para todas as outras subclasses de uma determinada Exception. Porm, necessrio que o catch mais especfico (subclasse) aparea antes que o catch mais genrico (superclasse). Caso contrrio o programa no ir compilar, apresentando uma mensagem de erro dizendo que a exceo j tratada anteriormente. O bloco finally, quando presente, sempre executado independente de ocorrer exceo, ou no. 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 execuo ter encerrado com sucesso ou ter sido interrompida por uma condio de exceo. A presena desse bloco opcional. Tanto a clusula finally como a catch so opcionais, porm necessrio ter pelo menos uma delas para cada bloco try.
Quando ocorre uma exceo, o fluxo de execuo de instrues deixa o bloco do try, e os blocos de catch so pesquisados em ordem, quanto ao tratador apropriado. Se o tipo da exceo lanada corresponder ao tipo de parmetro em um dos blocos catch, o cdigo deste bloco catch disparado. Se no ocorrer exceo dentro do bloco try, os tratadores de exceo so pulados e o programa continua seu fluxo aps 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 especficas (subclasses), uma exceo do tipo da especfica jamais ser capturada . O compilador detecta a situao acima e no compila o cdigo
Para pegar qualquer exceo (geralmente isto no recomendado), faa um catch que pegue Exception. Exemplo : catch (Exception e) { ... }
Exemplo em que se captura uma exceo :
public class HelloWorld { public static void main (String args[]) { int i; String msgs [] = {"Aula", "de", POOII" }; Prof a . Jane Programao 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 mtodos que podem lanar excees. Estas excees podem ser capturadas por um cdigo escrito pelo programador. Alm disto, mtodos escritos pelo programador tambm podem lanar excees (throw), tanto de tipos definidos nas bibliotecas como de novos tipos construdos pelo programador.
Exemplo em que se lana uma exceo com throw (sem s ) :
s vezes, aps a captura de uma exceo, desejvel relan-la para que outros mtodos lidem com ela. Isto pode ser feito da seguinte forma:
public void metodo() throws ExcecaoSimples { try { // instrues } catch (ExcecaoSimples ex) { // faz alguma coisa para lidar com a exceo throw ex; // lana exceo } // fim catch } // fim metodo
Tipo de exceo Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
64
Exemplo : Avisar que as excees podem ocorrer (throws). Neste caso, a exceo no foi lanada e nem capturada. Portanto, ocorrer erro na excecuo.
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 exceo pode ser lanada para outro mtodo a tratar, caso ele seja programado para isso. Lanar uma exceo com throw, passa a responsabilidade para o mtodo 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 exceo"); throw e; // lana a exceo } } // fim escrever
public static void main(String args[]) // Ocorrer erro na exceuo { escrever();
}// fim main
} // fim classe Objeto e Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
65
Para que o erro no ocorra, seria necessrio, j que a programao foi mal feita, capturar a exceo na main.
As excees podem ser de dois tipos: Excees verificadas (checked). Neste caso, a exceo obrigatoriamente ter que ser capturada (try/catch) ou pelo menos, declarada com throws. Excees de runtime, ou excees no-verificadas (uncheked). Neste caso na linguagem Java no exigido o tratamento da exceo 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 exceo com throws ou captur-la com try/catch.
Uma exceo em Java um objeto. A classe raiz de todas as excees java.lang.Throwable. Apenas objetos dessa classe ou de suas classes derivadas podem ser gerados, propagados e capturados atravs do mecanismo de tratamento de excees. A classe Throwable tem duas subclasses: java.lang.Exception
a raiz das classes derivadas de Throwable que indica situaes que a aplicao pode querer capturar e realizar um tratamento que permita prosseguir com o processamento. Prov alguns mtodos muito teis para obter informaes sobre uma exceo, tais como o printStackTrace().
java.lang.Error
a raiz das classes derivadas de Throwable que indica situaes que a aplicao no deve tentar tratar. Usualmente indica situaes anormais, que no deveriam ocorrer.
Errors e RuntimeExceptions so considerados uncheked (no verificadas), portando o compilador no obriga que exista tratamento para eles. Erros normalmente representam situaes crticas, que no deveriam acontecer, como por exemplo, acabar a memria da JVM. J subclasses de RuntimeException representam erros de lgica de programao que devem ser corrigidos (podem, mas no devem ser capturadas: erros devem ser corrigidos) .
Exemplos de excees j definidas em Java incluem:
java.lang.ArithmeticException
Indica situaes de erros em processamento aritmtico, tal como uma diviso inteira por 0.
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
66
java.lang.NumberFormatException
Indica que ocorreu uma tentativa de converter uma string para um formato numrico, mas seu contedo no representava adequadamente um nmero 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 aplicao tentou usar null onde uma referncia a um objeto era necessria -- invocando um mtodo ou acessando um atributo, por exemplo.
java.lang.ClassNotFoundException
Indica que a aplicao tentou carregar uma classe mas no foi possvel encontr-la.
java.io.IOException
Indica a ocorrncia de algum tipo de erro em operaes de entrada e sada. a raiz das classes java.io.EOFException (fim de arquivo ou stream), java.io.FileNotFoundException (arquivo especificado no foi encontrado) e java.io.InterruptedIOException (operao de entrada ou sada foi interrompida), entre outras.
Entre os erros definidos em Java, as subclasses de java.lang.Error, so java.lang.StackOverflowError e java.lang.OutOfMemoryError. So situaes onde no possvel uma correo a partir de um tratamento realizado pelo prprio programa que est executando.
Como excees so objetos, podem incluir atributos. A classe Throwable inclui o registro do estado atual da pilha das chamadas de mtodos e uma string associada a uma mensagem de erro, que pode ser obtida para qualquer exceo atravs do mtodo Throwable.getMessage().
Prof a . Jane Programao Orientada a Objetos I I (Linguagem Java)
67
Hierarquia
Principais Mtodos de Exception :
1. String getMessage() Retorna mensagem passada pelo construtor 2. String toString() Retorna nome da exceo e mensagem 3. void printStackTrace( ) Imprime detalhes (stack trace) sobre exceo
Exemplo : Aqui voc v a criao de uma nova exceo que lanada. Este exemplo ilustra o uso dos mtodos 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 Programao 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 exceo - 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), atravs de nextInt(), e verificao se os dados de entrada so dgitos.
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