Introdução à Linguagem de Programação JAVA Aula 03 Conceitos Básicos da Linguagem Java Tópicos da Aula • • • • • • • • • Comentários Variáveis e Tipos de Dados Operadores Expressões, Statements e Blocos Controle de Fluxo Objetos Caracteres e Strings Números Arrays Comentários • Três tipos de comentários: – Comentários de uma linha, o compilador ignora o que estiver a direita de // até o fim da linha // text – Comentários entre /* e */, seu conteúdo é ignorado pelo compilador /* text */ – Comentários de documentação entre /** e */, ignorado pelo compilador mas relevante para o javadoc /** text */ Variáveis e Tipos de Dados Variável • Def.: Uma variável é um dado identificado por um nome. – Cada variável possui um nome e um tipo – Uma variável possui um escopo – O nome da variável é utilizado para referir ao dado que a variável contém Nome de Variáveis • O nome da variável deve respeitar as seguintes regras: – Ser uma série de caracteres Unicode iniciando por letra – Não pode ser uma palavra reservada – Deve ser única no escopo Convenção: nome começa com letra minúscula. Se for composto por múltiplas palavras: concatenadas com iniciais subseqüentes em maiúscula. Ex.: isVisible Palavras Reservadas (1) abstract byte class do final goto* boolean case const* double finally if break catch continue else float implements char default extends for import instanceof int interface long Palavras Reservadas (2) native private return switch throws volatile new null protected public short static synchronized this transient try while package super throw void Tipo de Dados • Cada variável possui um tipo de dado, que determina: – tipo de valor que a variável pode conter – conjunto de operações que podem ser efetuadas com o conteúdo da variável Tipos Primitivos: Inteiros • São tipos primitivos inteiros: – byte (8 bits) • Variação: -128...+127 – short (16 bits) • Variação: -32.768...+32.767 – int (32 bits) • Variação: -2.147.483.648...+2.147.483.647 – long (64 bits) • Variação: -9.223.372.036.854.775.808... +9.223.372.036.854.775.807 Tipos Primitivos: Ponto Flutuante • São tipos primitivos de ponto flutuante: – float (32 bits - Precisão simples) • Variação:-3,4E-38... +3,4E+38 – double (64 bits - Precisão dupla) • Variação:-1,7E-308... +1,7E+308 Observação: Ao contrário de outras linguagens, em Java os tamanhos e tipos de dados não variam entre plataformas. Tipos Primitivos: Outros • Outros tipos primitivos: – char (16 bits sem sinal) • Variação: 0... 65.535 • Inclui UNICODE (alfabetos latino, grego, cirílico, ideogramas japoneses, etc) – boolean (1 bit - tipo lógico) • Variação: true ou false Escopo (1) • Região do programa em que a variável pode ser referenciada. Uma variável pode ser: – Variável membro – Variável local – Parâmetro de método – Parâmetro de tratamento de exceção Escopo (2) Acesso a Variáveis • Para variáveis membro, além do escopo é possível determinar sua visibilidade: – public – protected – private Acesso Público • A variável é acessível/visível por/em qualquer parte do programa. public int visivelEmTodoLugar; Acesso Protegido • A variável é acessível/visível somente na classe em que foi definida, nas subclasses ou no pacote ao qual pertence. protected int souProtegida; Acesso Privado • A variável é acessível/visível somente na classe em que foi definida. private int souInvisívelFora; Variável de Classe • A variável é compartilhada entre todos objetos da classe. public static int valorCompartilhado; Observação: Nesse caso, se um objeto mudar o valor da variável, os outros objetos verão o valor atualizado. Variáveis Transientes • Quando uma variável é declarada como transiente, o valor contido nela não tem significado persistente. Isto significa que o processo de serialização não considera seu estado. public transiente int souTemporária; Variáveis Voláteis • Uma variável é volátil, quando ela não deve ser otimizada pelo compilador. Isto é útil quando se deseja suprimir a otimização do compilador, por exemplo em interfaces diretas com o dispositivo de memória. volatile double bitsDeFlagDoSistema; Variáveis Finais • Quando uma variável for definida como final, seu conteúdo não pode ser alterado após a inicialização (constante): protected static final int MAX_FILES = 20; Operadores Operadores Em Java, trabalha-se com quatro conjuntos de operadores: – – – – – – aritméticos relacionais condicionais lógicos e binários atribuição outros Operadores Aritméticos + / % ++ adição subtração divisão resto da divisão incremento de 1 -- decremento de 1 op1 + op2 op1 – op2 op1 / op2 op1 % op2 op1++ ++op1 op1---op1 Operadores Relacionais == != > < >= <= igual diferente maior menor maior ou igual menor ou igual op1 op1 op1 op1 op1 op1 == op2 != op2 > op2 < op2 >= op2 <= op2 Operadores Condicionais && || ! & | ^ “E” curto-circuitado “OU” curto-circuitado “NÃO” lógico “E” avalia ambos “OU” avalia ambos “OU” exclusivo avalia ambos op1 && op2 op1 || op2 ! op op1 & op2 op1 | op2 op1 ^ op2 Operadores Lógicos e de Deslocamento de bits & | ^ ~ >> << >>> “E” bit-a-bit “OU” bit-a-bit “OU” exclusivo bit-a-bit complemento bit-a-bit desloca para direita desloca para a esquerda desloca para direita sem sinal op1 & op2 op1 | op2 op1 ^ op2 ~ op op1 >> op2 op1 << op2 op1 >>> op2 Operadores de Atribuição Aritméticos += -= *= /= %= atribuição aditiva equivale a atribuição subtrativa equivale a atribuição multiplicativa equivale a atribuição divisiva equivale a atribuição de resto equivale a op1 op1 op1 op1 op1 op1 op1 op1 op1 op1 += op2 = op1 + op2 -= op2 = op1 – op2 *= op2 = op1 * op2 /= op2 = op1 / op2 %= op2 = op1 % op2 Operadores de Atribuição &= |= ^= <<= >>= >>>= op1 op1 op1 op1 op1 op1 &= op2 |= op2 ^= op2 <<= op2 >>= op2 >>>= op2 op1 op1 op1 op1 op1 op1 = = = = = = op1 op1 op1 op1 op1 op1 & op2 | op2 ^ op2 << op2 >> op2 >>> op2 Outros Operadores ?: [] if-then-else lógico op1 ? op2 : op3 declaração de arrays tipo[] criação de arrays tipo[op1] acesso a posições de arrays op1[op2] . nomes qualificados op1.op2 () delimitador de parâmetros op1(params) conversor de tipos de dados (tipo) op1 new criação de objeto ou array new op1 Instanceof verificação se o primeiro operador é uma instância do segundo op1 instanceof op2 Expressões, Statements e Blocos Expressões • Série de variáveis, operadores e chamadas a métodos, construídas de acordo com a sintaxe, que resulta em um valor simples. Ex: x * (y + z) / 100 s = “Meu nome é “ + nome Ordem de Precedência (1) operadores pós fixados operadores unitários criação ou conversão multiplicação adição deslocamento relacional igualdade [] . (params) expr++ expr-++expr --expr +expr -expr ~ ! new (type)expr * / % +>> << >>> < > <= >= instanceof == != Ordem de Precedência (2) E bit-a-bit OU exclusivo bit-a-bit OU inclusivo bit-a-bit E lógico OU lógico Condicional Atribuição & ^ | && || :? = += -= *= /= %= &= ^= |= <<= >>= >>>= Statements • Statement corresponde a uma unidade de execução: – – – – Expressões de atribuição Qualquer uso de ++ e – Chamada a métodos Expressões de criação de objetos • Statements sempre terminam com ; Ex: value = 1234; System.out.println(value); Integer value2 = new Integer(4); Blocos • Blocos são grupos de nenhum, um ou mais statements delimitados por chaves {} Ex: { int i = 0; while (i<1000) { System.out.println(i); i++; } } Controle de fluxo Laço: while • Repete processamento do bloco, enquanto a expressão for verdadeira. A expressão é avaliada antes do processamento do bloco: while (expressão booleana) { bloco(s) } Laço: do-while • Repete processamento do bloco enquanto a expressão for verdadeira. A expressão é avaliada após o processamento do bloco: do { bloco(s) } while (expressão booleana); Laço: for • Laço de interação que inclui expressão de inicialização, condição de término e expressão de incremento: for (inicialização; término; incremento) { bloco(s) } Decisão: if-then • Executa o bloco caso a expressão seja verdadeira: if (expressão booleana) { bloco(s) } Decisão: if-then-else • Executa o primeiro bloco caso a expressão seja verdadeira, do contrário executa o segundo bloco: if (expressão booleana) { bloco(s) } else { bloco(s) } Decisão: Aninhamento if (expressão booleana) { bloco(s) } else if (expressão booleana) { bloco(s) } else if (expressão booleana) { bloco(s) } else { bloco(s) } Decisão: Múltipla Escolha (1) • Avalia uma expressão inteira e, de acordo com o valor, processa o bloco correspondente. Caso o valor não coincida com nenhum dos valores previstos, executa o bloco default: Decisão: Múltipla Escolha (2) switch (expressão inteira) { case expressão inteira: bloco(s) break; ... default: bloco(s) break; } Tratamento de Exceção • Utilizado no tratamento de exceções: try { bloco(s) } catch (exceção nome) { bloco(s) } finally { bloco(s) } Desvios (1) • Para nomear um bloco: label: bloco • Forma anônima de interromper um fluxo switch, for, while ou do-while: break; • Forma nominal de interromper um fluxo switch, for, while ou do-while: break label; Desvios (2) • Forma anônima de interromper uma iteração de um laço e avaliar a expressão novamente: continue; • Forma nominal de interromper uma iteração de um laço e avaliar a expressão do dado nome: continue label; Desvios (3) • Terminar a execução de um método: return • Terminar a execução de um método retornando um valor: return value; Objetos Criação de Objetos • O operador new é utilizado para criar novas instâncias de objetos. Ex.: Point origin = new Point(23, 94); Rectangle rectOne = new Rectangle(origin, 100, 200); Rectangle rectTwo = new Rectangle(50, 100); Utilizando um Objeto • Há duas formas de se utilizar um objeto: 1. Manipulando ou consultando suas variáveis 2. Chamando seus métodos Acessando uma Variável de Objeto • O acesso a uma variável de objeto se dá através de seu nome qualificado na forma: referenciaDoObjeto.NomeDaVariável Ex.: rectOne.width rectOne.height Chamando um Método de Objeto • De maneira análoga, a chamada a um métodos de objeto se dá através da forma qualificada: referenciaDoObjeto.nomeDoMétodo(ListaDeArqumentos) ou referenciaDoObjeto.nomeDoMétodo() Ex.: rectOne.move(40,200); rectOne.draw(); Eliminando Objetos não Utilizados • Objetos são elegíveis ao garbage collector (gc) quando não possuírem mais referências para eles. – Uma referência deixa de ser válida automaticamente quando seu escopo termina. – Atribuindo null à referência é uma forma explícita de liberar um objeto. – Caso o objeto possua múltiplas referências, todas devem ser anuladas antes que o objeto seja elegível ao gc. Finalização de Objetos • Imediatamente antes de um objeto ser coletado pelo gc, o método finalize do objeto é executado. – Útil para liberação de recursos que necessitem de liberação explícita Atenção: Como este método está presente na classe Object, deve ser sobrescrito, e deve sempre chamar o método finalize da super classe através da chamada: super.finalize(); Caracteres e Strings Classes de Manipulação de Caracteres • Existem três classes de manipulação de caracteres: – Character – representa um caracter simples – String – representa uma seqüência imutável de caracteres – StringBuffer – representa uma seqüência mutável de caracteres Classe Character • Construtores e métodos principais da classe Character: – Character(char) – construtor da classe. Uma vez criado, um objeto não pode ter seu valor alterado. – compareTo(Character): int – retorna se o valor do objeto passado é maior, igual ou menor que o do objeto. – equals(Object): boolean – retorna se o valor do objeto passado é igual ou não. – toString(): String – converte para String. – charValue(): char – converte para tipo primitivo char. – isUpperCase(char): boolean – retorna se é maiúscula ou minúscula. Classe String • Um objeto String pode ser criado de um literal String: String msg = “Hello World!”; • O objeto String possui um tamanho, que representa a quantidade de caracteres que compõem a string, e cada caracter possui um índice que varia entre 0 e o tamanho – 1. Operador + • O operador + pode ser utilizado para concatenar dois objetos ou literais String. String world = “world”; String msg = “Hello “ + world +”!”; Classe String • Principais métodos da classe: – – – – – – – – length(): int – retorna o tamanho da String. charAt(int): char – retorna o caracter da posição. substring(int): String – retorna a sub string da posição até o final. substring(int,int): String – retorna a sub string da prineira posição até a segunda. indexOf(char): int – retorna a posição do caracter na string ou –1 caso não seja encontrado. lastIndexOf(char): int – retorna a última posição do caracter na string ou –1 caso não seja encontrado. startsWith(String): boolean – retorna true caso a String comece com a string passada. endsWith(String): boolean – retorna true caso a String termine com a string passada. Classe String • Outros métodos da classe: – concat(String): void – concatena a string à passada. – equals(String): boolean – retorna true caso a string seja igual a passada, é sensível a maiúscula/minúscula. – equalsIgnoreCase(String): boolean – retorna true caso a string seja igual a passada, independente de maiúscula/minúscula. – compareTo(String): int – retorna 0 caso as strings sejam iguais, <0 caso seja menor e >0 caso seja maior. Classe StringBuffer • Armazena séries de caracteres, é possível alocar uma área maior que a utilizada pela String. StringBuffer msg = new StringBuffer(20); • Melhor aproveitamento e performance para manipulação de cadeias de caracteres variáveis. – Após completar a área estipulada, aloca outra área de mesmo tamanho e assim por diante. Classe StringBuffer • Principais métodos da classe: – append(String): void – concatena a string passada à string. – toString(): String – converte para um objeto String. Números Números • Os números podem ser representados através de classes. – constantes – métodos – serialização Hierarquia de Classes Formatação de Números • A classe NumberFormat pode ser utilizada para formatar números representados através de tipos primitivos como Objetos: Formatação Numérica Double amount = new Double(345987.246); NumberFormat numberFormatter = NumberFormat.getNumberInstance(currentLocale); String amountOut = numberFormatter.format(amount); System.out.println(amountOut + " " + currentLocale.toString()); 345 987,246 fr_FR 345.987,246 de_DE 345,987.246 en_US Formatação Monetária Double currency = new Double(345987.246); NumberFormat currencyFormatter = NumberFormat. getCurrencyInstance (currentLocale); String currencyOut = currencyFormatter .format(currency); System.out.println(currencyOut + " " + currentLocale.toString()); 9 876 543,21 F fr_FR 9.876.543,21 DM de_DE $9,876,543.21 en_US Formatação Percentual Double percent = new Double(0.75); NumberFormat percentFormatter = NumberFormat.getPercentInstance(currentLocale); String percentOut = percentFormatter.format(percent); System.out.println(percentOut + “ ” + currentLocale.toString()); 75% fr_FR 75% de_DE 75% en_US Formatação Própria • Também é possível definir uma formatação própria para os valores numéricos segundo um padrão: DecimalFormat myFormatter = new DecimalFormat(pattern); String output = myFormatter.format(value); System.out.println(pattern + " " + value + " " + output); ###,###.### ###.## 000000.000 $###,###.### \u00A5###,###.### 123456.789 123456.789 123.78 12345.67 12345.67 123,456.789 123456.79 000123.780 $12,345.67 ¥12,345.67 Arrays Arrays • Def.: São estruturas que armazenam múltiplos valores do mesmo tipo. – O tamanho é estabelecido no momento de criação – Após a criação o tamanho do array é fixo Estrutura de um Array Utilizando Arrays (1) • Declaração de um array: type[] name Ex: int[] anArray; // Uma array de inteiros • Criação de um array: new type[tamanho] Ex: int[] anArray = new int[20]; Utilizando Arrays (2) • Obtendo o tamanho de um array: name.length • Acessando um elemento: name[posição] Ex: for (int i=0; i<anArray.length; i++) { System.out.println(anArray[i]); } Utilizando Arrays (3) • Inicializando um array: type[] name = { elemento1, elemento2, ..., elementoN}; Ex: int[] anArray = { 2, 4, 8, 16, 32, 64 }; Array de Objetos • É possível criar arrays tanto para tipos primitivos como para objetos: String[] anArray = {“Domingo”,”Segunda”, ...,”Sábado”}; Object[] anotherArray = { new Integer(10), “Dez”, new Integer(20), “Vinte”}; Array de Arrays • Também é possível definir array de arrays, que recebem o nome de matrizes: double[] aMatrix = { { 1, 2, 3}, { 4, 5, 6}, { 7, 8, 9}};