A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Linguagem Java Renata Araujo

Apresentações semelhantes


Apresentação em tema: "Linguagem Java Renata Araujo"— Transcrição da apresentação:

1 Linguagem Java Renata Araujo
Projeto e Construção de Sistemas com Ambientes de Programação UNIRIO 2002.1 Linguagem Java Renata Araujo

2 Palavras reservadas abstract boolean break byte case catch char
class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new null package private protected public return short static super switch synchronized this throw throws transient try void volatile while

3 Tipos básicos byte ( 8 bits ) short ( 16 bits ) int ( 32 bits )
Variação: short ( 16 bits ) Variação: int ( 32 bits ) Variação: long ( 64 bits ) Variação: float( 32 bits - Precisão simples) Variação:-3,4E ,4E+38 double ( 64 bits - Precisão dupla) Variação:-1,7E ,7E+308 char( 16 bits sem sinal) Variação: Inclui UNICODE ( alfabetos latino, grego, cirílico, ideogramas japoneses, etc ) boolean ( 1 bit - tipo lógico ) Variação: true ou false

4 Comentários /* */ //

5 Organização de um programa Java
class <nome da classe 1>{ ... } class <nome da classe n>{ public static void main(String args[]){

6 Estrutura básica de uma classe
Classe em um programa Java é considerada um tipo de dados. class < nome da classe >{ //atributos < tipo1 > atributo1; < tipo2 > atributo 2; .... //métodos void método1( ); void método2(<parâmetros>); < tipo > método3( ); < tipo > método4(<parâmetros>); }

7 Exemplos de declaração de classes
class MinhaClasse { } public class Cachorro { String nome, corOlhos; int idade; boolean temRabo; public class Cachorro { String nome, corOlhos; int idade; boolean temRabo; public void fala() { JOptionPane.showMessageDialog(null, “Au!Au!"); }

8 Exemplos de declaração de classes
class numero_racional{ //atributos int numerador; // Numerador do número int denominador; // Denominador do número //métodos float racional_para_float(); // Converte números racionais para ponto flutuante }

9 Construtores public class Cachorro { //atributos
Toda classe em Java deve ter um método especial chamado “construtor” O objetivo deste método é o de criar objetos de uma classe. O construtor possui o mesmo nome da classe. Construtores também podem inicializar os valores dos atributos do objeto sendo criado. public class Cachorro { //atributos String nome, corOlhos; int idade; boolean temRabo; //métodos public Cachorro( ) { nome = "Snoopy"; corOlhos = "Brown"; idade = 2; temRabo = true; }

10 Construtores Sempre que um construtor é chamado em um programa, um objeto da classe correspondente é criado e armazenado em uma variável. A chamada a um construtor em Java é feita utilizando-se o comando new. ... Cachorro novoCachorro; novoCachorro = new Cachorro( );

11 Destrutores Todo objeto criado é armazenado em memória.
Na maioria das linguagens de programação, é necessário invocar procedimentos para liberar espaço de memória que não esteja mais em uso. No caso de programação orientada a objetos, quando um objeto não é mais necessário, ele precisa ser destruído. Para ser destruído, um método precisa ser criado para cada classe, denominado destrutor, responsável por destruir quaisquer instâncias de seus objetos. Em Java, não há a necessidade de destrutores, uma vez que a linguagem se encarrega de eliminar os objetos que não estejam mais em uso. Este mecanismo é denominado de coleta automática de lixo.

12 Acesso a atributos O acesso aos atributos de um objeto em java é realizado através do operador “.” public class Cachorro { //atributos String nome, corOlhos; int idade; boolean temRabo; //métodos public Cachorro( ) { nome = "Snoopy"; corOlhos = "Brown"; idade = 2; temRabo = true; } public AbanarRabo(){ public chorar() { ... meuCachorro = new Cachorro(); meuCachorro.idade = 5; if meuCachorro.temRabo meuCachorro.abanarRabo(); else meuCachorro.chorar();

13 Chamada de Métodos - Mensagens
Para ativar um método de um objeto, ou seja, para enviar-lhe uma mensagem, o operador “.” também deve ser utilizado. public class Cachorro { //atributos String nome, corOlhos; int idade; boolean temRabo; //métodos public Cachorro( ) { nome = "Snoopy"; corOlhos = "Brown"; idade = 2; temRabo = true; } public AbanarRabo(){ public chorar() { ... meuCachorro = new Cachorro(); meuCachorro.idade = 5; if meuCachorro.temRabo meuCachorro.abanarRabo(); else meuCachorro.chorar();

14 Operadores Em Java, trabalha-se com quatro conjuntos de operadores:
básicos aritméticos relacionais lógicos e binários

15 . referência a método, função ou atributo
Operadores básicos . referência a método, função ou atributo de um objeto , separador de identificadores ; separador de declarações e comandos [ ] declarador de matrizes e delimitador de índices { } separador de blocos e escopos locais ( ) precedência de operadores, listas de parâmetros

16 Operadores aritméticos (I)
+ adição x=x + 3 - subtração x=x - 3 / divisão x=y / 4 % resto da divisão x=y % 5 ++ incremento de 1 x++ ++x -- decremento de 1 x-- --x

17 Operadores aritméticos (II)
+= atribuição aditiva x+=3 Tem o mesmo efeito de x=x+3 -= atribuição subtrativa x-=3 *= atribuição multiplicativa x*=3 /= atribuição divisiva x/=3 %= atribuição de resto x%=3

18 Operadores relacionais
= = igual x = = y != diferente x!=y > maior x>y < menor x<y >= maior ou igual x>=y <= menor ou igual x<=y

19 Operadores lógicos e binários (I)
~ negação bit a bit ~x >> shift right x>>3 >>> shift right sem sinal x>>>3 << shift left x<<3 >>= atribuição c/ shift right x>>=3 <<= atribuição c/ shift left x<<=3 >>>= atribuição c/ shift right x>>>=3 sem sinal

20 Operadores lógicos e binários (II)
& and lógico bit a bit x&y | or lógico bit a bit x|y ^ xor lógico bit a bit x^y &= atribuição com & x&=y |= atribuição com | x|=y ^= atribuição com ^ x^=y

21 Operadores lógicos e binários (III)
? : if-then-else lógico x =((y>3)?5:6) || or dinâmico (x>y) || (z>=6) && and dinâmico (x>y) && (z<4) ! not dinâmico !(x>y)

22 Precedência de operadores
( ) [] . ; , ++ -- ! * / % + - >> << >>> > < >= <= == != & ^ | && || ?: = Aumenta prioridade de resolução Diminui prioridade de resolução

23 Comandos de controle (I)
Condicional if ( expressão booleana ) bloco 1; else bloco2;

24 Comandos de controle (II)
Exemplo de condicional if ((x>5) && (y!=70)){ x=x+5; y=z+48; } else if (x<=5) x=48; else x=20;

25 Comandos de controle (III)
Seleção switch (expressão){ case valor1: bloco1; break; ... case valorN: blocoN; default: bloco N+1; }

26 Comandos de controle (IV)
Exemplo de seleção clicado%=4; switch(clicado){ case 0: saida=3; break; case 1: saida=2; default: saida=0; } System.out.println(saida);

27 Comandos de controle (V)
Repetição com while while( expressão booleana ){ bloco; }

28 Comandos de controle (VI)
Exemplo de repetição com while while(x>6){ while(y>9){ while((z>=6) && (m!=10)){ z++; m%=10; } y=z+m; x+=y;

29 Comandos de controle (VII)
Repetição com do-while do{ Bloco; } while(expressão booleana);

30 Comandos de controle (VIII)
Exemplo de repetição com do-while do{ z++; m%=10; } while((z>=6) && (m!=10)); y=z+m; } while(y>9); x+=y; } while(x>6);

31 Comandos de controle (IX)
Repetição com for for(inicialização;condição-limite;iteração){ Bloco; }

32 Comandos de controle (X)
Exemplo de repetição com for for(x=0,y=0;((x<100) && (y<=20));x++,y++){ for (int z=-5;z<10;z+=3) System.out.println(z); System.out.println(y); }

33 Herança Similaridades entre classes justificam o uso da herança
public class Homem { String nome, corOlhos; int idade; boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public class Cachorro { String nome, corOlhos; int idade; boolean temRabo; public Cachorro( ) { nome = “Snoopy”; corOlhos = “marrom”; idade = 4; temRabo = true; }

34 Herança public class Mamifero { String nome, corOlhos; int idade;
public class Homem extends Mamifero{ boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; }

35 Herança - Construtores
public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } O primeiro comando dos construtores das subclasses é sempre a chamada ao construtor de sua superclasse. public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { //chamada automática e implícita ao construtor da classe //Mamífero. Repare que eu não preciso inicializar a cor dos //olhos do cahorro pois a mesma já foi feita na chamada do //construtor de sua superclasse. nome = “Snoopy”; idade = 4; temRabo = true; }

36 Herança - Métodos public class Cachorro extends Mamifero {
boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; } public int InformarIdade( ) { return idade; public class Homem extends Mamifero { boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public int InformarIdade( ) { return idade;

37 Herança public class Mamifero { String nome, corOlhos; int idade;
public class Homem extends Mamifero{ boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } public int InformaIdade() { return idade; public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; }

38 Herança - Métodos ... Cachorro filhote; Homem dono; Int idade;
filhote = new Cachorro(); dono = new Homem(); Idade = filhote.InformarIdade(); Idade = dono.InformarIdade(); //Métodos da superclasse

39 Herança - Métodos public class Mamifero { String nome, corOlhos;
public class Homem extends Mamifero{ boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Olá!”); public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } public int InformaIdade() { return idade; public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Au-Au!”);

40 Polimorfismo ... Cachorro filhote; Homem dono;
filhote = new Cachorro(); dono = new Homem(); filhote.fala(); dono.fala(); //Método da classe Cachorro //Método da classe Homem

41 Herança – Métodos e Polimorfismo
public class Homem extends Mamifero{ boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Olá!”); public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } public int InformaIdade() { return idade; public fala() { JoptionPane.showMessageDialog(null, “...!”); public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Au-Au!”);

42 Polimorfismo ... Cachorro filhote; Homem dono;
Mamífero mamiferoDesconhecido; filhote = new Cachorro(); dono = new Homem(); mamiferoDesconhecido = new Mamifero; filhote.fala(); dono.fala(); mamiferoDesconhecido.fala() //Método da classe Cachorro. Retorno? //Método da classe Homem. Retorno? //Método da classe Mamífero. Retorno?

43 Herança Classes abstratas
public class Homem extends Mamifero{ boolean casado; public Homem( ) { nome = “José”; corOlhos = “azul”; idade = 35; casado = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Olá!”); abstract public class Mamifero { String nome, corOlhos; int idade; public Mamífero( ) { nome = “nome”; corOlhos = “marrom”; idade = 0; } abstract public fala(){ public class Cachorro extends Mamifero{ boolean temRabo; public Cachorro( ) { nome = “Snoopy”; idade = 4; temRabo = true; } public fala( ) { JoptionPane.showMessageDialog(null, “Au-Au!”);

44 Polimorfismo ... Cachorro filhote; Homem dono;
Mamífero mamiferoDesconhecido; filhote = new Cachorro(); dono = new Homem(); mamiferoDesconhecido = new Mamifero; //ERRO (classes abstratas não podem ser instanciadas!!!) filhote.fala(); dono.fala(); //Método da classe Cachorro //Método da classe Homem

45 “super” Java possui uma palavra reservada utilizada para referenciar membros de superclasses a partir de objetos de sua subclasse class Filho extends Pai { int valor; //este valor é membro desta classe int umMetodo( ){ //este método sobreescreve o método do pai valor = super.valor + 1; //acesso a valores e métodos do pai return super.umMetodo( ) + valor; } class Pai { int valor = 1; int umMetodo( ){ return valor; }

46 Qual o valor de valorPai e valorFilho ?
“super” class Pai { int valor = 1; int umMetodo( ){ return valor; } class Filho extends Pai{ int valor; //este valor é membro desta classe int umMetodo( ){ //este método sobreescreve o método do pai valor = super.valor + 1; //acesso a valores e métodos do pai return super.umMetodo( ) + valor; } ... int valorFilho, valorPai; Pai meuPai = new Pai( ); valorPai = meuPai.umMetodo( ); Filho meuFilho = new Filho ( ); valorFilho = meuFilho.umMetodo( ); Qual o valor de valorPai e valorFilho ?

47 Herança Múltipla e Interfaces
Java não oferece suporte à Herança Múltipla. No entanto, oferece um recurso – Interface – que permite simulá-la.

48 Coleções Considere o seguinte exemplo: Departamento Empregado
Alessandro Cerqueira Coleções Considere o seguinte exemplo: Ao codificarmos estas classes, precisamos decidir como iremos implementar os relacionamentos em Java. Para isto, será necessário colocar novos atributos nas classes. Estes novos atributos são chamados de Atributos Implícitos. A grande questão é como são implementados os relacionamentos n-ários. Uma primeira idéia é utilizarmos arrays para isto. Departamento aloca  * Empregado Sigla Nome 0..1 é gerenciado por  1 CPF Nome

49 Coleções class Departamento { private: char Sigla[]; String Nome;
Empregado EmpregadosAlocados[]; Empregado EmpregadoGerente; public: Departamento(char[] _sigla, String _nome) Sigla = _sigla; Nome = _nome; EmpregadosAlocados = new Empregado[100]; } ... class Empregado { private: char CPF[]; String Nome; Departamento AlocadoNoDepatamento; public: Empregado(char[] _cpf, String _nome, Departamento _depto) CPF = _cpf; Nome = _nome; AlocadoNoDepartamento = _depto } ...

50 Coleções A implementação de atributos n-ários com arrays não é adequada. Uma idéia melhor é utilizar a classe Vector. Arrays Tamanho fixo e definido na criação do array. Procura pelo índice. Elementos do mesmo tipo. Arrays de tipos nativos e de instâncias de uma classe específica. Vectors O tamanho inicial é definido quando o vector é criado. Este pode ser modificado manualmente ou automaticamente. Procura pelo índice ou conteúdo. Elementos de qualquer classe. Vectors de instâncias de qualquer classe.

51 Coleções class Empregado { private: char CPF[]; String Nome;
Departamento AlocadoNoDepatamento; public: Empregado(char[] _cpf, String _nome, Depatamento _depto) CPF = _cpf; Nome = _nome; AlocadoNoDepartamento = _depto } ... class Departamento { private: char Sigla[]; String Nome; Vector EmpregadosAlocados; Empregado EmpregadoGerente; public: Departamento(char[] _sigla, String _nome) Sigla = _sigla; Nome = _nome; EmpregadosAlocados = new Vector(1,1); } ...

52 Coleções Alguns construtores e métodos importantes e úteis da classe Vector são: Vector():Cria uma nova instância sem elementos e com capacidade inicial para 10 elementos. Vector(int capacidade): Cria uma nova instância sem elementos e com capacidade inicial especificada pelo parâmetro. addElement(Object elem): adiciona um objeto no final do Vector. insertElementAt(Object elem,int índice): adiciona um objeto na posição especificada que deve estar entre 0 e o tamanho do Vector. setElementAt(Object elem,int índice): coloca o objeto em determinada posição, removendo o objeto que estiver lá anteriormente. removeElement(Object elem): remove a primeira ocorência do objeto no Vector. Retorna true caso tenha sido possível a remoção. removeElementAt(int índice): remove o objeto na posição especificada. size(): retorna o número de objetos presentes no Vector.

53 Coleções elementAt(int índice): Retorna o objeto presente na posição especificada. firstElement(): Retorna o objeto presente na primeira posição. lastElement(): Retorna o objeto presente na última posição. indexOf(Object elem): retorna o índice da primeira ocorrência do objeto no Vector ou -1 se o objeto não estiver presente. indexOf(Object elem,int índice): retorna o índice da primeira ocorrência do objeto no Vector a partir da posição especificada. Retorna - 1 se o objeto estiver presente. lastIndexOf(Object elem): retorna o índice da última ocorrência do objeto no Vector ou -1 se o objeto não estiver presente. lastIndexOf(Object elem,int índice): retorna o índice da última ocorrência do objeto no Vector a partir da posição especificada. Retorna -1 se o objeto estiver presente. contains(Object elem): Informa se o objeto está presente no Vector.

54 Visibilidade Para cada propriedade da classe (atributo ou método) é associado um tipo de visibilidade. Os modificadores de visibilidade indicam o nível de acesso ao método ou atributo. Private: a propriedade só pode ser utilizada dentro da classe. Sem modificador: a propriedade só pode ser utilizada nas classes do mesmo pacote. Protected: a propriedade só pode ser utilizada nas classes do mesmo pacote e em suas subclasses Public: a propriedade pode ser utilizada em qualquer classe. Para que possamos implementar o encapsulamento conforme é proposto pelo modelo OO, os atributos devem ser declarados como private ou protected e seus métodos devem ser declarados como public.

55 Visibilidade Como os atributos devem ser privados, é necessária a implementação de métodos que permitam o acesso de leitura e escrita a estes métodos. Estes métodos são exemplos de Métodos Implícitos, uma vez que não devem aparecer na especificação de requisitos da classe. Os construtores também são exemplos de métodos implícitos.

56 Implementação de Pacotes
Em Java, cada arquivo pode conter várias classes, sendo que somente uma poderá ser public (e esta terá que ter o mesmo nome do arquivo). Cada arquivo pode pertencer somente a um pacote, mas um pacote pode conter vários arquivos. Para declarar o nome do pacote, deve-se utilizar a seguinte sintaxe na primeira linha de código do arquivo: package MeuPacote; Pacotes podem ser vistos como bibliotecas de classes. Para incluir classes de um pacotes em um arquivo, deve ser utilizada a seguinte sintaxe: import MeuPacote.*; Pacotes são vistos pelo sistema operacional como diretórios.

57 Java.lang Pacote default de Java (Não precisa de import)
Além dos tipos básicos (não OO, ex. char, int, long, float, double, etc.), Java implementa classes para tratamento OO de valores numéricos, lógicos e caracteres São definidas as seguintes classes no pacote java.lang: Object, Math, Integer, Float, Character, Boolean, Long, Double, String, StringBuffer

58 Java.lang Math public final class Math extends Object
Implementa uma biblioteca matemática public final class Math extends Object Não pode ser derivada (final) Não pode ser instanciada (construtor private) Dados (constantes): public final static double E = ; public final static double PI = ;

59 Java.lang Métodos: public static int abs (int) // long,float,double public static double sqrt(double) ** public static double pow(double,double) ** public static double random() public static long round (double) ** throws ArithmeticException

60 Java.lang Character Implementa métodos de teste e conversão public final class Character extends Object Pode ser instanciada. Métodos: public Character (char) public static boolean isLowerCase(char) public static boolean isUpperCase(char) public static boolean isDigit(char) public static boolean isWhiteSpace(char) public static char toLowerCase(char) ... public static String toString(char)

61 Java.lang Integer Implementa métodos de conversão public final class Integer extends Number Pode ser instanciada. Dados (constantes): MIN_VALUE, MAX_VALUE Métodos: public Integer (int) / (String) public static String toString(int) public static int parseInt(String) public static Integer valueOf(String) public int intValue() // long,float,double public String toString() public static String toBinaryString (int)

62 Java.lang Float Implementa métodos de teste e conversão
public final class Float extends Number Pode ser instanciada. Dados: MIN_VALUE, MAX_VALUE, NEGATIVE_INFINITY, POSITIVE_INFINITY, NaN. Métodos: public Float(float) // (double),(String) public boolean isNaN() public boolean isInfinite() public static Float valueOf(String) public float floatValue() //int,long,double

63 Boolean public final class Boolean extends Object
Java.lang Long e Double Similares a Integer e Float Boolean public final class Boolean extends Object Pode ser instanciada. Dados: public final static Boolean FALSE, TRUE; Métodos: public Boolean(boolean) // (String) public boolean booleanValue()

64 Java.lang String e StringBuffer String
Implementam manipulação de cadeias de caracteres String é constante, StringBuffer variável String Métodos: public String(String) / (char[]) public int length() public char charAt(int) public int compareTo(String) public boolean equalsIgnoreCase(String) public boolean equals(Object) public String subString (int)

65 Java.lang Diferença entre == e equals ... String x = “abc”; String y = new String(“abc”); String z = “abc”; if (x == y) System.out.println(“x==y”); else if (x.equals(y)) System.out.println(“x equals y”); if (x == z) System.out.println(“x==z”); ... Imprimirá: x equals y x==z

66 Java.lang StringBuffer
Métodos: public StringBuffer() public StringBuffer(int) public StringBuffer(String) public void setLength(int) public int capacity() public void setCharAt(int,char) public StringBuffer append(String) public StringBuffer append(char[]) public StringBuffer insert(int,String) Operador +: String s = “AB”+“CD”; // equivale a: String s = new StringBuffer(“AB”).append(“CD”).toString();

67 Exceções Um grande número de possíveis condições de erro podem ser tratadas nos programas em Java como exceções. Exceções comuns: Divisão por zero (ArithmeticException) Acesso a objeto não instanciado (NullPointerException) Acesso a um índice inválido de array (ArrayIndexOutOfBoundsException) Erro de acesso a dispositivo de E/S (IOException) Exceções são classes derivadas da classe Exception

68 Exceções class Teste { public static void main (String args[]) { int i=0; String frases[] = { “um”, “dois”, “tres” }; while (i<4) { // o indice vai de 0 a 2 ! System.out.println(frases[i]); i++; } } } Provoca o erro: java.lang.ArrayIndexOutOfBoundsException: 3 at Teste.main(Teste.java:6)

69 Exceções Para tratar exceções usam-se as instruções try, catch e finally: try { // codigo que possa gerar exececao } catch (Exception e) { // codigo para tratar ocorrencia da excecao } finally { // codigo executado caso a excecao ocorra ou não } A cláusula finally é opcional, mas assegura a execução do código correspondente Podem existir diversas cláusulas catch

70 Exceções Exemplo; class Teste{ public static void main (String args[]) { int i=0; String frases[] = { “um”, “dois”, “tres” }; while (i<4) { // o indice vai de 0 a 2 ! try { System.out.println(frases[i]); } catch (ArrayIndexOutOfBoundsException e){ i = -1; } i++; } } }

71 Exceções Podem ser tratadas novas exceções derivando-se a classe Exception public class MinhaExcecao extends Exception { } Para provocar a nova exceção usa-se: throw new MinhaExcecao();


Carregar ppt "Linguagem Java Renata Araujo"

Apresentações semelhantes


Anúncios Google