Programação Na Web Linguagem Java Parte II Sintaxe António Gonçalves break com o nome do bloco Nome do bloco Termina o bloco JAVA - Aspectos básicos class class Matrix Matrix {{ private private int[][] int[][] mat; mat; ... ... public public boolean boolean search( search( int int val val )) {{ boolean boolean found found == false; false; find: find: for( for( int int y=0 y=0 ;; yy << mat.length mat.length ;; ++y ++y )) for( int x=0 ; x < mat[y].length for( int x=0 ; x < mat[y].length ;; ++x ++x )) if if (( mat[x][y] mat[x][y] == == val val )) {{ found found == true; true; System.out.println("x="+x System.out.println("x="+x +" +" y="+y); y="+y); break break find; find; }} return return found; found; }} }} http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Referências & tempo de vida dos objectos • Button a; é apenas uma referência para objectos da classe Button, ou derivadas de Button, que começa com null; • Um objecto em java é sempre instanciado dinamicamente. a = new Button(“Ok”); • Podem existir várias referências para o mesmo objecto Object o = a; • O objecto é destruído automaticamente pelo Garbage Collector quando já não existirem mais referências para ele. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Criar e destruir objectos public public void void xpto() xpto() {{ Button a, b; Button a, b; aa == new new java.awt.Button(“Yes”); java.awt.Button(“Yes”); aa == new new java.awt.Button(“No”); java.awt.Button(“No”); // // referência referência com com null null // // 1. 1. Botão Botão “Yes” “Yes” criado criado // // 2. 2. “No” “No” criado criado // // mas mas oo “Yes” “Yes” foi foi destruído destruído bb == a; // a; // 3. 3. ‘b’ ‘b’ referencia referencia oo “No” “No” aa == new new java.awt.Button(“Cancel”); java.awt.Button(“Cancel”); // // 4. 4. “Cancel” “Cancel” criado criado }} // // ‘a’ ‘a’ ee ‘b’ ‘b’ terminaram terminaram // // “No” “No” ee “Cancel” “Cancel” destruídos destruídos a 1. a Yes 2. a Yes b b null null No 3. a Yes b No 4. Yes b No Cancel JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Cópia e comparação • Os tipos primitivos são sempre manipulados por valor. • Os objectos são sempre manipulados por referência. • Os tipos primitivos têm cópia e comparação directas através dos operadores ´=´ e ´==´. • Os objectos são copiados e comparados através de métodos específicos. Button a = new Button(“Okay”); Button b = a; // Copia a referência. b.setLabel(“Ok”); // Altera a label dos dois. if ( a == b ) // comparação de referências. System.out.println( “Iguais” ); b = a.clone(); // copia o objecto. b.setLabel(“Cancel”); // Altera apenas o copiado. if ( a.equals(b) ) // comparação de objectos. System.out.println( “Iguais” ); JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Declaração de classes • A forma geral da declaração de classe é: <classe> → [<modificador>] class <name>[extends <superName>] [implements <interfaceName> {, <interfaceName>} { { <atributo> | <método> }* } • O modificadores podem ser: – public Visível fora do package – abstract Não pode haver objectos desta classe. – final Não permite ser estendida JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Declaração de atributos • A forma mais simples de declarar um atributo é indicando o seu tipo e nome, mas a forma geral é: <atributo> → [<visibilidade>] [static] [final] [transient] [volatile] <tipo> <nome> [ = <expressão> ] ; – – – – – – <visibilidade> = <expressão> static final transient volatile indica o controlo de acesso a este atributo expressão de inicialização é partilhado por todos os objectos da classe atributo constante não faz parte do seu estado pode ser alterado assincronamente JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Declaração de métodos • A forma mais simples de declarar um método é indicando o retorno, nome, parâmetros e código, mas o caso geral é: <método> → [<visibilidade>] [static] [abstract] [final] [native] [synchronized] <tipo-retorno> <nome> ( [parametros] ) [throws <excepções>] { ; | { <código> } } – – – – – static abstract final native synchronized JAVA - Aspectos básicos só pode aceder a atributos estáticos não tem código associado (classe abstracta) não pode ser redefinido nas sub-classes o código está em C, C++, etc. com exclusão mútua ao objecto ou classe http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Visibilidade dos membros • Apesar de já estar definida a visibilidade da classe, os seus membros (atributos e métodos) definem também a sua visibilidade. • Obviamente que, os métodos da própria classe têm sempre acesso aos seus membros. Visibilidade private Própria Classe Classe do mesmo Package Classe derivada √ √ √ protected √ √ √ public √ √ √ JAVA - Aspectos básicos Qualquer classe √ http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Interfaces public interface Runnable { // abstract implícito void run(); // public e abstract implícito } public interface Colors { int RED=1, GREEN=2, BLUE=3; // public static final } • Uma interface é uma classe apenas com atributos constantes e métodos abstractos (sem código). • Uma classe pode implementar zero ou muitas interfaces, mas deve implementar todos os métodos das interfaces que implementa, ou então deve ser abstracta. • Apesar do JAVA não ter herança múltipla como o C++, este mecanismo permite polimorfismo múltiplo. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Construtores • Os construtores são invocados na instanciação dos objectos. • Sintacticamente podem ser encarados como métodos sem retorno com o nome da própria classe. class X { X(…){…} … } • Podem existir vários construtores numa classe, desde que tenham número e/ou tipo de parâmetros diferentes. • No corpo do construtor (como primeira instrução) podemos chamar um dos construtores da super-classe super(...). Se tal não acontecer o construtor sem parâmetros é chamado implicitamente. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm finalize() e inicializadores estáticos • O método finalize é invocado automaticamente quando o objecto for destruído pelo colector de lixo. protected void finalize() throws Throwable {…} • Podem existir blocos de código que são executados quando a classe for carregada no sistema. Normalmente estes blocos inicializam atributos estáticos complexos. class StaticExample { static int i; static int j = 4; static { i = j + 2; } ... } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Tempo de vida dos objectos • Uma variável de uma determinada Classe apenas é uma referência, inicialmente com null, para objectos dessa Classe. • Um objecto é criado (instanciado) quando for evocado o operador new e chamado o seu construtor – O resultado do new tem que ser armazenado numa referência, ou o objecto nunca poderá ser utilizado • Um objecto pode ser destruído quando não existir mais nenhuma referência a ele. – O Garbage collection só destruirá o objecto quando for necessária a memória ocupada por ele. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Métodos especiais • O método finalize é invocado automaticamente quando o objecto for destruído pelo colector de lixo. protected void finalize() throws Throwable {…} • Podem existir blocos de código que são executados quando a classe for carregada no sistema. Normalmente estes blocos inicializam atributos estáticos complexos. class StaticExample { static int i; static int j = 4; static { i = j + 2; } ... } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Arrays • O Array não é um tipo fundamental da linguagem. int[] a; ou int a[]; é uma referência para um array de inteiros. • Um array é instanciado: a = new int[50]; mas ‘a’ refere um array com qualquer dimensão. • Depois de instanciado podemos saber a sua dimensão consultando o atributo length. • Ao indexar aos elementos com a[i], caso se exceda a dimensão é gerada uma excepção. • Um array pode ser instanciado atribuindo valores para cada um dos elementos: int[] a = { 10, 20, 30 }; • que é equivalente a: int[] a = new int[3]; a[0] = 10; a[1] = 20; a[2] = 30; JAVA - Aspectos básicos int[] a = new int[10]; a[0] = 1; for( int i=1 ; i < a.length ; ++ i ) a[i] = a[i-1] + i; . . . a = new int[50]; . . . http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Strings • Uma String não é um array de caracteres. É uma classe vulgar que internamente usa uma array de caracteres. • Esta classe tem muitos métodos. Os mais usados são: int length() - o número de caracteres. char charAt(int) - o carácter na posição indicada. int compareTo(String) - comparação lexicográfica. int [last]indexOf(char) - o índice da 1a [última] ocorrência. int [last]indexOf(char,int)- o índice da próxima [anterior]. String valueOf(tipoPrimitivo)- tipo Primitivo para String. • O conteúdo de um objecto String não pode ser alterado, para tal existe a classe StringBuffer. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Mais sobre Strings • A linguagem JAVA tem algumas características especificas para facilitar o uso de objectos desta classe: String s = “CCISEL”; é equivalente a: char[] ccisel = {‘C’,‘C’,‘I’,‘S’,‘E’,‘L’}; String s = new String(ccisel); • Existe conversão implícita de qualquer classe ou tipo primitivo para String, para tal é evocado toString() da classe ou valueOf() para o tipo primitivo. • O operador ‘+’ entre duas Strings faz a concatenação. “PentiumII ”+333 é convertido em “PentiumII ” + “333” que dará “PentiumII 333”. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Método main() • Um programa pode conter várias classes – Cada classe pública dá origem a um ficheiro *.class – Uma delas terá que ter o método main() • Tem que ser estático (método da classe) e público • Retorna void e tem um array de Strings como parâmetro public class Echo { public static void main( String[] argv ) { for( int i=0 ; i < argv.length ; ++i ) System.out.print( argv[i] + ' ' ); System.out.println(); System.exit(0); } } JAVA - Aspectos básicos C:>java Echo a xpto 2 a xpto 2 C:>_ http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm classe System • A classe System faz interface com o sistema onde o programa está a ser executado. • Todos os atributos e métodos são estáticos. • Não se pode instanciar objectos desta classe. in out gc() runFinalization() getProperty(String) exit(int) - standard input stream (bytes) - standard output stream (bytes) - invocar explicitamente o colector de lixo - invocar finalize dos objectos por destruir - consultar uma “variável de ambiente” - termina a execução do programa JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Console Input & Output import java.io.*; public class DemoIo { public static void main( String[] args ) throws Exception { BufferedReader in = new BufferedReader( new InputStreamReader( System.in )); String[] lines = new String[ Integer.parseInt(args[0])+1 ]; int i; for( i= 0 ; i < lines.length ; ++i ) { lines[i] = in.readLine(); if ( lines[i] != null && lines[i].length() == 0 ) break; } for( --i ; i >= 0 ; --i ) System.out.println(lines[i]); } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Classe Object • Todas as classes derivam directa ou indirectamente da classe Object, que define a funcionalidade que qualquer objecto deve ter: Object clone() - Cria um novo objecto exactamente igual. void finalize() - Invocado na destruição do objecto. int hashCode() - Índice deste objecto na tabela de hash. String toString() - Transforma o objecto numa String. Class getClass() - Devolve a classe do objecto. boolean equals(Object)- Testa se dois objectos são iguais. • Esta classe é a raiz da árvore hierarquia de todas as classes, desta forma podemos escrever código em JAVA que use qualquer objecto usando referencias para esta classe. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Excepções • Em Java, a ocorrência de erros(excepções) durante a execução de um programa não necessariamente significa que o programa termina. • A linguagem possui um mecanismo para indicar trechos críticos num programa e recuperar eventuais exceções ocorridas nestes trechos, sem parar a execução do programa. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Sintaxe para tratamento de excepções try{ ... // Trecho crítico do programa } catch(Excepção e){ ... // Tratamento da excepção } finally{ // Eliminação de precedência ... } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Exemplo de trecho crítico class conta{ public static void main(String args[]){ int den=0; int num=30; int res=num/den; // Trecho crítico } } A execução do .class correspondente a esta classe provocaria a seguinte mensagem de erro: ...> java.lang.ArithmeticException: / by zero at ... conta ... JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Tratamento do trecho crítico class conta{ public static void main(String args[]){ int den=0; int num=30; try{ // Indicador do trecho crítico int res=num/den; } catch(ArithmeticException e) { // Recuperação da excepção System.out.println(“Dividiu por zero!”); den=1; } ... // Continuação do programa } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Trechos críticos com vários tratamentos de excepções class conta{ public static void main(String args[]){ int den,num; int c[]={1}; ... try{ // Indicador do trecho crítico int res=num/den; c[999]=res; } catch(ArithmeticException e) { // Recuperação da excepção aritmética System.out.println(“Dividiu por zero!”); den=1; } catch(ArrayIndexOutOfBoundsException e){ // Recuperação da excepção System.out.println(“Estourou o índice”); // de índice do vector } ... // Continuação do programa } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Tratamento com finally • Todo comando try exige, pelo menos, uma cláusula catch ou finally. • Finally é executado antes que o método retorne do erro, garantindo o tratamento antes de qualquer catch. • Assim, finally tem precedência máxima sobre todos os outros tratamentos. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Exemplo com finally class conta{ public static void main(String args[]){ int den,num; int c[]={1}; ... try{ // Indicador do trecho crítico int res=num/den; c[999]=res; } catch(ArithmeticException e) { // Recuperação da excepção aritmética System.out.println(“Dividiu por zero!”); } catch(ArrayIndexOutOfBoundsException e){ // Recuperação da excepção System.out.println(“Estourou o índice”); // de índice do vector } finally{ den=1; } } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Lançamento de excepções Independente de outras excepções que possam ocorrer na execução, uma classe pode forçar o lançamento de excepções ou relançar uma determinada excepção, para que possa ser tratada em diferentes níveis. Isto é feito através da palavra throw. throw new <construtor da classe de exceção >(parâmetros ); throw <exceção>; JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Exemplo com throw class exemplo{ static void proced_exemplo(){ try{ // Tenta lançar instância de uma excepção aritmética throw new ArithmeticException(“Divide por zero”); } catch(ArithmeticException e){ System.out.println(“Erro no método “+e); throw e; // Relança a excepção para ser tratada em outro escopo } } public static void main(String args[]){ try{ exemplo.proc_exemplo(); } catch(ArithmeticException e){ System.out.println(“Retratamento da excepção”); } } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Métodos que podem devolver excepções Pode-se indicar os tipos de excepção que um método pode devolver utilizando-se a palavra reservada throws. método(parâmetros) throws Excepção1,...,ExcepçãoN{ ... } Isto força os trechos de programa, que utilizarem este método, a tratarem as excepções com catch ou finally. JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Exemplo com throws class erros{ static void contas() throws ArithmeticException,ArrayIndexOutOfBoundsException{ ... if (den==0){ throw new ArithmeticException(“Denominador inválido”); } res=num/den; if (indice>0){ throw new ArrayIndexOutOfBoundsException(“Indice >0”); } c[indice]=res; } public static void main(String args[]){ try{ erros.contas(); } catch(ArithmeticException e){...} catch(ArrayIndexOutOfBoundsException e){...} } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Criação de classes de excepções Novas classes de exceções podem ser construídas extendo-se a classe Exception. Para isto, basta fazer: class <NovaClasse> extends Exception{ atributos ... construtores ... public String toString(){ // O que imprimir quando a classe precisar ser impressa ... } Outros métodos... } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Exemplo de criação de nova classe de excepção classProprioErro extends Exception{ private int aux; ProprioErro(int a){ //Construtor aux=a; } public String toString(){ // Retorna nome da classe e estado interno return(“ProprioErro[“+aux+”]”); } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm Utilização da nova classe class calculo{ static void calcula(int a) throws Proprioerro{ if(a>10) throw new ProprioErro(a); // Lança instância da nova classe ... } public static void main(String args[]){ try{ calculo.calcula(1); // Não gera excepção calculo.calcula(300); // Gera excepção } catch(ProprioErro e){ // Tratamento da nova excepção System.out.println(“Capturada “+e); } } } JAVA - Aspectos básicos http://ltodi.est.ips.pt/leonardo/ci/MaterialApoio.htm