Java – Parte I Linguagens de Programacão I [email protected] 1 Introdução LP OO desenvolvida pela Sun no início da década de 90 com sintaxe semelhente a C\ C\C++. Todos os programas Java são compilados e interpretados. O compilador transforma o programa em um forma intermediária independente da plataforma (bytecodes). O interpretador (JVM) testa e executa os bytecodes. Linguagens de Programacão I [email protected] 2 1 Introdução Para cada plataforma é necessário uma JVM específica. Entretanto, um mesmo programa pode ser executado em qualquer plataforma. Linguagens de Programacão I [email protected] 3 Classes em Java Em Java, a declaração de novas classes é feita através da construção class. class Circulo { int x,y; float raio; ... } Linguagens de Programacão I [email protected] 4 2 Instanciação Uma vez definida uma classe, uma nova instância (objeto) pode ser criada através do comando new. new. Circulo c = new Circulo(); Os atributos desta classe podem ser manipulados diretamente: c.x = 5; c.y = 5; c.raio = 3.5; Linguagens de Programacão I [email protected] 5 Métodos Além de atributos, uma classe deve declarar os métodos que irá disponibilizar. class Circulo { int x,y; float raio; ... void setRaio(float r){ raio = r; } float getArea(){ return 3,14*raio*raio; } void move (int dx, int dy){ x = x+dx; y = y+dy; } } Linguagens de Programacão I [email protected] 6 3 Declaração de Variáveis e Escopo Java permite que uma variável seja declarada em qualquer lugar dentro de um método. O escopo da variável se estende do momento da sua declaração até o fim do bloco no qual foi definido. int fatorial (int n){ if n <= 1 then return 1 else { int f = n*fatorial(nn*fatorial(n-1) return f } } escopo de f Linguagens de Programacão I [email protected] 7 Envio de Mensagens O envio de uma mensagem para um objeto é feito através da invocação de métodos deste objeto com a eventual passagem de parâmetros. Circulo c = new Circulo(); c.setRaio(3); float a = c.getArea(); Linguagens de Programacão I [email protected] 8 4 Referências Java adota um modelo de valor por referência. Com exceção de tipos primitivos, a atribuição entre duas variáveis cria uma nova referência Circulo c1 = new Circulo(); Circulo c2 = c1; Î c1 e c2 conté contém referências para o mesmo objeto Circulo Linguagens de Programacão I [email protected] 9 this Dentro de um método, o objeto pode precisar de sua própria referência. A palavra reservada this denota uma referência ao próprio objeto. class Circulo { int x,y; void setXY (int x, int y){ this.x = x; this.y = x; } } Linguagens de Programacão I [email protected] 10 5 Inicialização de Objetos Em várias circunstâncias é interessante inicializar um objeto com valores. Por exemplo, poderíamos querer que todo Círculo recém criado estivesse em (0,0). Esse tipo de inicialização pode ser feito especificandoespecificando-se valores iniciais para os atributos: class Circulo { int x = 0; int y = 0; ... } Linguagens de Programacão I [email protected] 11 Construtores Ao invés de criar pontos sempre em (0,0), poderíamos querer especificar a posição do ponto no momento de sua criação. O uso de construtores permite isso. Construtores são mais genéricos do que simples atribuições de valores iniciais aos campos: podem receber parâmetros e fazer um processamento qualquer. Linguagens de Programacão I [email protected] 12 6 Exemplo Î class Circulo { int x,y; float raio; Circulo (int x, int y, float Raio){...} } Î Circulo c1 = new Circulo(3,3,5.5); Circulo c2 = new Circulo(0,0,4); Neste exemplo para criar um Circulo é sempre necessário especificar sua posição e o seu raio. Linguagens de Programacão I [email protected] 13 Construtor Padrão Quando não especificamos nenhum construtor a linguagem Java declara implicitamente um construtor padrão vazio, que não recebe parâmetros. Se declararmos algum construtor, esse construtor padrão não será mais declarado. declarado. No exemplo anterior: Circulo c3 = new Circulo(); Î erro!! Linguagens de Programacão I [email protected] 14 7 Sobrecarga Java permite a sobrecarga de métodos, inclusive de construtores. class Point { int x, y; Point() { this(0,0); } Point(int x, int y) { this.x = x; this.y = y; } ... } Linguagens de Programacão I [email protected] 15 Gerência de Memória Java possui uma gerência automática de memória com coleta de lixo. Quando um objeto não é mais referenciado pelo programa ele é automaticamente coletado (destruído) e a memória correspondente é desalocada. Qualquer objeto Java é criado sempre na heap. Apenas tipos primitivos são alocados na pilha ou, eventualmente, na memória estática. Linguagens de Programacão I [email protected] 16 8 Destrutores Quando um objeto Java vai ser coletado, ele tem seu método finalize chamado. Esse método deve efetuar qualquer procedimento de finalização que seja necessário antes da coleta do objeto. objeto. Como Java possui gerenciamento automático de memória, a utilização de destrutores não é muito comum . Linguagens de Programacão I [email protected] 17 Encapsulamento A definição da interface de objetos é feita através dos modificadores public e private. private. Métodos e atributos declarados como public são visíveis para outros objetos Java. Métodos e atributos declarados como private só podem ser acessados dentro do próprio objeto. Linguagens de Programacão I [email protected] 18 9 Exemplo interface class Circulo { private int x,y; não são acessíveis por private float raio; outros objetos ... public void setRaio(float r){ raio = r; } public float getArea(){ return 3,14*raio*raio; } public void move (int dx, int dy){ x = x+dx; y = y+dy; } } Linguagens de Programacão I [email protected] 19 Atributos de Classes e Métodos Estáticos Classes podem declarar membros (atributos e métodos) que sejam comuns a todas as instâncias, ou seja, membros compartilhados por todos os objetos da classe. Este mecanismo equivale a definição de variáveis e funções globais comuns em LPs não OO. Java suporta a definição de membros de classe através do qualificador static. static. Linguagens de Programacão I [email protected] 20 10 Exemplo public class Math{ static double pi = 3.14; static double cos(){ ... } ... } public class Produto{ static int produzidos = 0; static float getProducao(){ return produzidos; } public Produto(){ ++produzidos; } ... } Linguagens de Programacão I [email protected] 21 Acesso a Membros de Classe Não é necessário que uma instância da classe exista pra que membros (atributos e métodos) da classe possam ser acessados. O acesso a membros de classe em Java é feito diretamente através do nome da classe. float perimetro = 2*Math.pi*r; float x = Math.cos(2.3); int n = Produto.getProducao(); Linguagens de Programacão I [email protected] 22 11 Tipos Básicos de Java boolean true ou false char caracter UNICODE (16 bits) byte número inteiro com sinal (8 bits) short número inteiro com sinal (16 bits) int número inteiro com sinal (32 bits) long número inteiro com sinal (64 bits) float número em pontoponto-flutuante (32 bits) double número em pontoponto-flutuante (64 bits) Linguagens de Programacão I [email protected] 23 Strings e Arrays Em Java strings e arrays são definidos através de classes específicas. Exemplos: String texto = “Exemplo”; int[] int[] lista = {1, 2, 3, 4, 5}; String[] nomes = {“João”, “Maria”}; System.out. println(nomes[0]); (nomes[0]); // Imprime “João”. System.out.println Linguagens de Programacão I [email protected] 24 12 Operadores Operadores Aritméticos Descrição Operador Adição + Subtração - Multiplicação * Divisão / Resto divisão inteiro % Menos unário - Linguagens de Programacão I [email protected] 25 Operadores Operadores Relacionais Descrição Operador Igual == Diferente != Menor < Menor ou igual <= Maior > Maior ou Igual >= Operadores lógicos Î and (&& ), or (|| (&&), (||)) e not (! (!) Linguagens de Programacão I [email protected] 26 13 Controle de Fluxo ifif-else switchswitch-casecase-default while dodo-while for break return Linguagens de Programacão I [email protected] 27 if-else float m; if (a>0 && b>0) m = a*b; else { System.out.println(“Erro”); m = 0; } Linguagens de Programacão I [email protected] 28 14 switch-case-default int i = f(); switch (i){ (i){ case -1: ... break; break; case 0: ... break; break; default: default: ... } Linguagens de Programacão I [email protected] 29 while int i = 0; while (i<10){ (i<10){ i++; System.out. println(i); (i); System.out.println } Linguagens de Programacão I [email protected] 30 15 do-while int i = 0; do{ i++; System.out. println(i); (i); System.out.println }while (i<10); Linguagens de Programacão I [email protected] 31 for for (int (int i=1; i<=10; i++) System.out. println(i); (i); System.out.println Linguagens de Programacão I [email protected] 32 16 break int i = 0; while (true){ if (i==10) break; break; i++; System.out. println(i); (i); System.out.println } Linguagens de Programacão I [email protected] 33 label início: for (int (int i=0; i<10; i++) for (int (int j=0; j<10; j++) { if (v[i][j] < 0) break início; ... } ... Linguagens de Programacão I [email protected] 34 17 Herança em Java Java suporta o conceito de herança simples, mas não o de herança múltipla na forma tradicional. PodePode-se declarar uma subclasse através da palavra reservada extends: extends: public class Pixel extends Point { int color; public Pixel(int x, int y, int c) { super(x, y); color = c; } } Linguagens de Programacão I [email protected] 35 super Uma subclasse pode acessar o construtor da superclasse através da chamada super(). super(). Caso a subclasse não invoque explicitamente o construtor da superclasse, Java fará isso automaticamente. Entretanto caso a superclasse não possua um construtor padrão, a subclasse necessariamente deverá fazer uma invocação explícita de um construtor qualquer da superclasse. Linguagens de Programacão I [email protected] 36 18 Polimorfismo Em Java o comportamento padrão dos objetos é polimórfico, e a ligação de métodos ocorre de forma dinâmica (late binding). Conforme veremos adiante, é possível modificar este comportamento quando necessário. Linguagens de Programacão I [email protected] 37 Î public class Point { ... public void print() { System.out.println(“Point (”+x+“,”+y+“)”); } } Î public class Pixel extends Point { ... public void print() { System.out.println(“Pixel (”+x+“,”+y+“,”+color+“)”); } } Î Point pt = new Point(); // ponto em (0,0) Point px = new Pixel(0,0,0); // pixel em (0,0) pt.print(); // Imprime: “Point (0,0)” px.print(); // Imprime: “Pixel (0,0,0)” Linguagens de Programacão I [email protected] 38 19 Valores Constantes Constantes em Java são declaradas através da palavra reservada final. final força uma ligação estática entre um valor e uma variável. class Math { final float pi = 3.14; ... } Linguagens de Programacão I [email protected] 39 final e Polimorfismo Por razões de eficiência, Java permite a especificação de métodos cuja ligação deve ser sempre estática. Esta especificação é feita através da declaração de um método como final. final. public class A { public final int f() { ... } } Linguagens de Programacão I [email protected] 40 20 Type Casting O mecanismo de typecasting é importante em LPs OO para acessar os métodos específicos de objetos polimórficos: Point pt = new Pixel(0,0,1); Pixel px = (Pixel)pt; pt = new Point(); px = (Pixel)pt; Î ERRO! pt agora contém um ponto. pt = new Pixel(0,0,0); px = pt; Î ERRO! pt não é sempre um pixel. Linguagens de Programacão I [email protected] 41 instanceof Permite verificar em tempo de execução a classe real de um objeto. Exemplo: if (pt instanceof Pixel) { Pixel px = (Pixel)pt; … } Linguagens de Programacão I [email protected] 42 21 Classes Abstratas Java suporta o conceito de métodos e classes abstratas através da palavra reservada abstract. abstract. Uma classe pode ser declarada abstrata sem conter nenhum método abstrato. Uma classe que contenha ao menos um método abstrato deve sempre ser declarada abstrata. Linguagens de Programacão I [email protected] 43 Exemplo de Classe Abstrata public abstract class Instrumento { public String nome; ... public abstract void tocar(); public abstract void afinar(int ajuste); public void getNome() { System.out.println(nome); } } Linguagens de Programacão I [email protected] 44 22 Interfaces Java não suporta o mecanismo de herança múltipla. Î Uma subclasse pode estender apenas uma única superclasse. Entretanto Java permite que uma subclasse implemente várias interfaces. Interfaces Java podem ser entendidas como classes abstratas puras, ou seja, classes que contém apenas métodos abstratos. Para herdar de uma interface uma subclasse deve ser declarada com a paravra reservada implements. implements. Linguagens de Programacão I [email protected] 45 Membros de Interfaces Uma vez que uma interface não possui implementação, devemos notar que: seus campos devem ser públicos, estáticos e constantes; seus métodos devem ser públicos e abstratos. Como esses qualificadores são fixos, não precisamos declarádeclará-los. Linguagens de Programacão I [email protected] 46 23 Exemplo interface Instrumento { String marca = ‘Yamaha’; Î static void tocar(); Î abstract e public void afinar(int ajuste); } e final class Tambor implements Instrumento{ void tocar(){ ... } void afinar(int ajuste){ ... } } Linguagens de Programacão I [email protected] 47 Interfaces Apesar de uma interface não ser uma classe, podemos declarar variáveis como sendo de um tipo de interface específico. Instrumento i = new Tambor(); A partir daí aplicamaplicam-se todas as regras de polimorfismo e o mecanismo de typecast padrão. Linguagens de Programacão I [email protected] 48 24 Interfaces Uma classe pode concomitantemente estender uma subclasse e implementar diversas interfaces, de forma análoga ao mecanismo de herança múltipla. Exemplo: public class SuperHomen extends SuperHeroi implements Voador, VisaoRaioX, SuperForca { ... } Linguagens de Programacão I [email protected] 49 Programas Java A estrutura de um programa Java consiste exclusivamente na especificação de classes. A execução de um programa em Java consiste na execução de uma classe. Executar uma classe significa executar seu método estático main. main. O método main deve portanto especificar o programa a ser executado. Linguagens de Programacão I [email protected] 50 25 Olá Mundo! class Mundo { public static void main(String[] main(String[] args) args) { System.out. println(“Olá (“Olá Mundo!”); System.out.println } } Linguagens de Programacão I [email protected] 51 Programas Java Um programa em Java usualmente é composto por várias classes. A unidade de compilação em Java é a classe. Cada classe deve ser declarada em um arquivo separado tendo como nome o nome da classe declarada mais a extensão .java. .java. Por exemplo, o arquivo Tambor.java deve conter a definição da classe Tambor. Linguagens de Programacão I [email protected] 52 26 Pacotes Para organizar as classes e facilitar a modularidade de código, Java suporta o uso de pacotes. Um pacote é um conjunto de classes e outros pacotes. Pacotes permitem a criação de espaços de nomes, além de mecanismos de controle de acesso. Linguagens de Programacão I [email protected] 53 Pacotes O nome do pacote qualifica os nomes de todas as classes e outros pacotes que o compõem, criando portanto um espaço de nomes independente. Se todos as classes declarando instrumentos fossem agrupados no pacote instrumentos, poderíamos acessar a classe Tambor através de uma declaração como: instrumentos.Tambor t = new instrumentos.Tambor(); Linguagens de Programacão I [email protected] 54 27 Pacotes Pacotes são tipicamente implementados como diretórios e os arquivos das classes pertencentes ao pacote devem ficar em seu diretório. Hierarquias de pacotes são construídas através de hierarquias de diretórios. Por exemplo o pacote java.tools.instrumentos deve estar localizado numa hierarquia de diretórios com a forma \java\ java\tools\ tools\instrumentos. instrumentos. Linguagens de Programacão I [email protected] 55 Pacotes Para declararmos uma classe como pertencente a um pacote devemos: DeclaráDeclará-la em um arquivo dentro do diretório que representa o pacote; Declarar, na primeira linha do arquivo, que a classe pertence ao pacote, utilizando para isso a palavra reservada package. package. Linguagens de Programacão I [email protected] 56 28 Exemplo package instrumentos; class Tambor implements Instrumento{ void tocar(){ ... } void afinar(int ajuste){ ... } } Linguagens de Programacão I [email protected] 57 Encapsulamento Revisitado Quando não declaramos explicitamente a visibilidade dos membros de uma classe, Java assume que a visibilidade é do tipo “friendly”. Membros “friendly” funcionam como public para classes dentro de um pacote e como private para classes fora do pacote. Java disponibiliza ainda o modificador protected, protected, que permite a visibilidade de membros de uma classe apenas em subclasses desta classe. Linguagens de Programacão I [email protected] 58 29 Visibilidade de Classes Todas as classes de um pacote “enxergam” as demais classes do mesmo pacote. Classes de outros pacotes só são visíveis em uma classe se forem explicitamente importadas através da declaração import. Linguagens de Programacão I [email protected] 59 Exemplo package instrumentos; import Java.util.ArrayList; import meuPacote.*; importa a classe ArrayList do pacote java.util importa todas as classes do pacote meuPacote class Tambor implements Instrumento{ void tocar(){ ... } void afinar(int ajuste){ ... } } Linguagens de Programacão I [email protected] 60 30 Visibilidade É possível declarar uma classe como privada, usando o modificador private. private. Neste caso a classe deve ser declarada no mesmo arquivo da classe principal que irá utilizar esta classe. O nome do arquivo é o mesmo da classe principal. Quando uma classe for declarada sem um modificador ela será considerada “friendly”. Linguagens de Programacão I [email protected] 61 Exceções Java possui dois tipos de exceções: Checked Exceptions - são exceções que devem ser usadas para modelar falhas contornáveis. Devem sempre ser declaradas pelos métodos que as lançam e precisam ser tratadas (a menos que explicitamente passadas adiante). Unchecked Exceptions - são exceções que devem ser usadas para modelar falhas incontornáveis. Não precisam ser declaradas e nem tratadas. Linguagens de Programacão I [email protected] 62 31 Exceções O tratamento de exceções é feito através de estruturas de controle delimitadas pelas palavras reservadas trytry-catchcatch-finally. Todo trecho de código no qual podem ser lançadas exceções do tipo checked deve ser declarado dentro de um bloco try. try. As rotinas responsáveis pelo tratamento de exceções são declaradas em um bloco catch. catch. Linguagens de Programacão I [email protected] 63 Exemplo FileReader f = null; try { f = new FileReader(args[0]); ... f.close(); abre um arquivo - pode } lançar uma exceção do catch (IOException e){ tipo IO System.out.println(e); if (f != null) f.close(); captura a exceção } ... Linguagens de Programacão I [email protected] 64 32 Exceções Um bloco try pode conter vários tratadores de exceção. O bloco finally permite especificar um trecho de código que sempre deve ser executado independentemente da ocorrência de exceções. Se uma exceção não for tratada pelo bloco que a lançou, ela irá se propagar seguindo a pilha de chamadas (cadeia dinâmica). Linguagens de Programacão I [email protected] 65 Exemplo FileReader f = null; try { f = new FileReader(args[0]); ... } catch (IOException e){ System.out.println(e); } catch (OutraException e){ ... System.out.println(e); } finally{ if (f != null) sempre executa f.close(); } ... Linguagens de Programacão I [email protected] 66 33 Exemplo FileReader f = null; try { f = new FileReader(args[0]); ... } catch (IOException e){ System.out.println(e); } catch (OutraException e){ ... System.out.println(e); } finally{ if (f != null) sempre executa f.close(); } ... Linguagens de Programacão I [email protected] 67 Exceções Pode-se ainda definir novas exceções através da especialização da classe Exception ou de qualquer uma de suas subclasses. Métodos que não tratam uma exceção do tipo checked devem declarar isso explicitamente em sua assinatura através do modificador throws. Linguagens de Programacão I [email protected] 68 34 Exemplo public void metodoX() throws IOException{ FileReader f = null; try { f = new FileReader(args[0]); ... indica o possível lançamento f.close(); desta exceção } catch (Exception e){ System.out.println(e); if (f != null) f.close(); captura qualquer exceção trow e; } ... relança a exceção } Linguagens de Programacão I [email protected] 69 35