Módulo 04 Expressões, Estruturas de Seleção e Controle de Fluxo Última atualização: 09/06/2010
Objetivos Distinguir entre variáveis de instância e locais; Descrever como iniciar variáveis de instância; Visão geral sobre Heap e Stack Identificar e corrigir o erro de compilação referência antes de atribuição ; Reconhecer, descrever, e utilizar operadores em Java; Distinguir entre atribuições legais e ilegais de tipos primitivos
Objetivos (Cont) Identificar expressões lógicas e seus requisitos no controle de expressões; Reconhecer compatibilidade de atribuições e conversões necessárias em tipos fundamentais; Utilizar construções if, switch, for, while, do e os labels break e continue como estruturas de controle e seleção em um programa.
Heap e Stack Visão Geral Na maioria do tempo, as várias partes (métodos, variáveis, objetos) de programas Java residem em um de dois lugares na memória: Heap ou Stack Neste módulo nos preocuparemos com variáveis de instância, variáveis locais e objetos e suas localizações em memória Variáveis de instância e objetos residem na heap Variáveis locais e métodos residem na stack Obs: Os slides sobre heap e stack foram construídos a partir do livro SCJP for Java 5.0 de Kathy Sierra e Bert Bates
Heap e Stack Visão Geral Usaremos o exemplo abaixo para exibir como suas várias partes são criadas na stack e na heap class Coleira { class Cachorro { Coleira c; // variável de instância String nome; // variável de instância public static void main (String[] args) { Cachorro d ; // variável local d d = new Cachorro(); d.avancar(d); void avancar(cachorro cachorro) { // variável local cachorro c = new Coleira(); cachorro.setnome( Aiko ); public void setnome(string nome) { // variável local: nome this.nome = nome; // faça algo mais
Heap e Stack Visão Geral A figura abaixo mostra o estado da Stack e da Heap no momento que o programa atingir o comentário faca algo mais
Variáveis locais são: Variáveis e Escopo Variáveis que são definidas dentro de um método são chamadas de locais, automáticas, temporárias ou variáveis de pilha. Variáveis que são criadas quando o método é executado, mas que são destruídas ao término da execução do método. Variáveis locais requerem iniciação explícita. Variáveis de instância são automaticamente iniciadas
Exemplo de Escopo de Variável
Iniciação default de Variáveis de instância Variável Valor byte 0 short 0 int 0 long 0L float 0.0F double 0.0D char '\u0000' boolean false Todos tipos de referência null
Operadores E-D: associa da esquerda para a direita D-E: associa da direita para a esquerda Associação operadores D-E ++ -- + - ~! (tipo lógico) E-D * / % E-D + - E-D << >> >>> E-D < > <= >== instanceof E-D ==!= E-D E-D & ^ D-E E-D && E-D D-E?: D-E == *= /= %= += -= <<= >>= >>>= &= ^= =
Operadores Lógicos Os operadores lógicos (Boolean) são:! Negação & E OU ^ OU Exclusivo Os operadores lógicos short-circuit são: && E OU Você pode utilizar estes operadores da seguinte forma:... Data d = new Data(7,5,1977); if ((d!= null) && (d.getdia() > 31)) { // Faça algo com d...
Operadores Lógicos de Bits Os operadores lógicos de bits são: ~ Complemento & E ^ OU Exclusivo OU exemplos:
Os operadores >> e >>> O operador de deslocamento aritmético para a direita com preservação de sinal (>>) é utilizado da seguinte maneira: 128 >> 1 retorna 128/2 1 = 64 256 >> 4 retorna 256/2 4 = 16-256 >> 4 retorna -256/2 4 =-16 O bit de sinal é copiado durante o deslocamento. O operador de deslocamento lógico para a direita sem preservação de sinal (>>>) é: Usado em padrões de bits. O sinal de bit não é copiado durante o deslocamento.
Operador Deslocamento para a Esquerda (<<) O operador de deslocamento para a esquerda funciona da seguinte forma: 128 << 1 retorna 128 * 2 1 = 256 16 << 2 retorna 16 * 2 2 =64
Exemplos de Operadores de Deslocamento
O operador + : Concatenação de String com + Executa uma concatenação de String. Produz uma nova String: String titulo = "Rei"; String nome = "Luis" + " " + "XIV"; String profissao = titulo + " " + nome; um argumento deve ser um objeto String Não-strings são convertidos para objetos String automaticamente.
Conversão (Casting) Se informação pode ser perdida em uma atribuição, o programador deve confirmar a atribuição com um cast. A atribuição entre long e int requer um cast explícito. A atribuição de um literal int para byte ou short é feita automaticamente caso o valor seja compatível long valorgrande = 99L; int valormenor = valorgrande; // errado, necessita de conversão int valormenor = (int) valorgrande; // OK int valormenor = 99L; // errado, necessita de conversão int valormenor = (int)99l; // OK int valormenor = 99; // literal inteiro default
Promoção e Conversão de Expressões Variáveis são automaticamente convertidas para uma forma maior (tal como de int para long). Uma expressão é compatível em atribuição se o tipo da variável é pelo menos do tamanho (mesmo número de bits) do tipo de expressão long valorgrande = 6; // 6 é um tipo int, OK int valorpequeno = 99L; // 99L é um long, ilegal double z = 12.414F; // 12.414F é float, OK float z1 = 12.414; // 12.414 é double,ilegal.
Instruções Condicionais A sintaxe da instrução if, else: If (expressão booleana){ Instrução ou bloco; ou if (expressão booleana){ instrução ou bloco; else { instrução ou bloco;
Instruções Condicionais Um exemplo if, else: int contador = 10; int valormaximocontador = 100; if (contador < 0) { System.out.println("Erro: valor de contador é negativo."); else { if(contador > getvalormaximocontador()) { System.out.println("Erro: valor grande para contador."); else { System.out.println("Haverá" + contador + pessoas hoje");
Instruções Condicionais A sintaxe da instrução switch: switch(expr1){ case constante2: instruções; break; case constante3: instruções; break; default:instruções; break;
Instruções Condicionais Um exemplo da instrução switch: private static final int LUXO = 1; //exemplo de constante... int modelocarro = 1; switch(modelocarro) { case LUXO: adicionararcondicionado(); adicionarcdplayer(); adicionarrodas(); adicionarmotor(); break; case SERIE: adicionarcdplayer(); adicionarrodas(); adicionarmotor(); break; default: adicionarrodas(); adicionarmotor(); OBS: Aprenderemos constantes no módulo 07. Além de constante, a expressão avaliada em um switch deve ser byte, short, int, char ou enum (visto no curso Linguagem de Programação Java)
Instruções Condicionais... private static final int LUXO = 1; //exemplo de constante...... public void metodox() { int modelocarro = 1; switch (modelocarro) { case SUPER_LUXO: adicionarairbag(); adicionarbancodecouro(); case LUXO: adicionartapetes(); adicionararcondicionado(); case SERIE: adicionarcdplayer(); adicionarvidrosverdes(); default: adicionarrodas(); adicionarmotor();
Instruções de Loop O loop for: for(expriinicial; boolean testeexpressao; alteracaoexpressao){ instrução ou bloco; Exemplo: for(int i=0; i<10; i++) { System.out.println("Não terminou ainda?"); System.out.println("Pronto!");
Instruções de Loop O loop while: while(expressão booleana){ Instrução ou bloco; Exemplo:... int i =0; while(i < 10) { System.out.println("Não terminou ainda?"); i++; System.out.println("Pronto");...
Instruções de Loop O loop do/while: do { instrução ou bloco; while(expressão booleana); Exemplo: int i = 0; do { System.out.println("Não terminou ainda?"); i++; while(i < 10); System.out.println("Pronto");
A instrução break: Controle de Fluxo Avançado do { instrução; if (condição verdadeira){ break; instrução; while(expressão booleana);
Controle de Fluxo Avançado A instrução continue: do { instrução; if (expressão booleana){ continue; instrução; while (expressão booleana);
Controle de Fluxo Avançado Utilizando break com rótulos: externo: do { instrução; do { instrução; if(expressão booleana){ break externo; instrução; while (expressão booleana); instrução; while(expressão booleana);
Controle de Fluxo Avançado Utilizando continue com rótulos: teste: do { instrução; do { instrução; if (condição verdadeira){ continue teste; instrução; while(condição verdadeira); instrução; while(condição verdadeira);
Perguntas?