Revisões de PG (POO) Centro de Cálculo Instituto Superior de Engenharia de Lisboa Pedro Alexandre Pereira (palex@cc.isel.ipl.pt)
Compilar e executar programas em Java Ficheiro fonte (Prog.java) Ficheiro de texto Texto em linguagem java Compilador (javac.exe) Ficheiro executável Transforma (.java.class) Prog.java javac javac.exe Prog.class Ficheiro compilado (Prog.class) Ficheiro binário Instruções para máquina virtual input java java.exe Máquina virtual (java.exe) output Executa as instruções do ficheiro compilado 2
Erros / Bugs Erros de compilação (compile time) Não foi cumprida alguma regra sintática ou semântica O compilador reporta o erro mostrando o que está mal e o que esperaria Erros de execução (runtime) Não foi cumprida uma regra semântica Exemplo: Indexação fora dos limites do array A máquina virtual provoca o término da execução reportando uma exceção Erros lógicos O programa não produz o resultado desejado É necessário fazer testes de execução para detetar estes erros 3
Programa com erros import java.util.*; Erro de compilação? C:\ISEL\POO>javac Average.java Average.java:10: cannot find symbol symbol: method println(string) location: class System Average.java public class Average { static Scanner in; = new Scanner(System.in); public static void main(string[] Args) { int a,b,c; a = in.nextint(); b = in.nextint(); c = in.nextint(); float media = (a+b+c) / 3; 3.0F; System.out.println("Average="+media); System.println("Average="+media); } } Erro de execução? C:\ISEL\POO>java Average Exception java.lang.nullpointerexception at Average.main(Average.java:6) Erro lógico? C:\ISEL\POO>java Average 1 4 0 Average=1.0 4
Identificadores / Nomes Nomes sugestivos que identificam classes, variáveis, métodos Compostos por letras, dígitos e _ sem espaços O primeiro símbolo não pode ser um dígito Distinção entre maiúsculas e minúsculas Não podem ser palavras reservadas (if, class, public, ) Dimensão ilimitada Convenções: Prog Classes: UpperCamelCase Variáveis e métodos: lowercamelcase Constantes: UNDER_SCORE maxvalue counter3 MIN_VALUE O _ não é normalmente usado no início nome Identificador letra O $ também é permitido mas não é normalmente usado letra 0..9 letra Maiúscula, minúscula ou _ a..z A..Z _... 5
Tipos, Variáveis e Valores Tipos primitivos Usados para informação simples que não permite decomposição. Cada variável de tipo primitivo contém diretamente o valor em causa. int, float, char, boolean As operações sobre tipos primitivos estão pré-definidas na linguagem Java. Tipos classe / referência Usados para objetos com vários campos (variáveis) Cada variável de tipo classe contém como valor uma referência para um objeto ou null, caso não refira um objeto String, int[], Scanner Na classe podem ser definidos métodos para manipular os valores dos campos 6
Tipos primitivos Inteiros (com sinal) byte short int long Reais (norma IEEE 754) float double Caracteres (Unicode) char Lógicos boolean Dimensão Mínimo Máximo 1 byte -128 127 2 bytes -32768 32767 4 bytes -2147483648 2147483647 8 bytes -(2 63 ) 2 63-1 4 bytes 8 bytes 2 bytes false true 7
Valores e literais Um literal é um valor (constante) de determinado tipo int: long: double: float: 2.7F char: 27-32 0x2F 037 0b1010 27L -32L 0x2FL 2.7-0.42 6.5e12 2.7F 'A' '\n' -0.42F String: "Olá mundo" "ISEL\n" "ISEL\n" literal ' Constante inteiro real caráter true false ' " caráter " inteiro Valor inteiro - 1..9 0..9 0 0..7 x 0..9 L real - Valor real. 0..9 0..9 F A..F b 0..1 e - 0..9 8
Declaração de variáveis Uma variável associa um nome a um local de memória onde se armazena um valor de determinado tipo. Uma declaração define uma ou mais variáveis do mesmo tipo. Cada variável pode ser iniciada com a avaliação de uma expressão. int x; byte b = 0xFF; float average, sum; long time=100, total=0; java.util.scanner in; declaração tipo Declaração de variáveis, nome = expressão ; tipo Nome de um tipo int char float boolean byte short long double nome.... 9
Expressões Com variáveis, literais e operadores (e outros elementos). Cada expressão tem um valor de determinado tipo. Uma expressão pode ser apenas uma variável ou um literal. expressão Para obter um valor 23 counter counter + 23 : expressão binop? -a * b++ (a+2)*2 prefixop elemento sufixop 10 * in.nextint() + 1 10
Operadores Unários pós-fixos expr++ expr-- Unários prefixos ++expr --expr +expr -expr ~! Multiplicativos * / % Aditivos + - Deslocamentos (shift) << >> >>> Relacionais Teste de igualdade ==!= E (AND) OU exclusivo (XOR) OU (OR) E lógico (AND) {parcial} < > <= >= instanceof & ^ && OU lógico (OR) {parcial} Ternário? : Afetações = += -= *= /= %= &= ^= = <<= >>= >>>= + Prioridade - 11
Conversões A linguagem Java é fortemente tipificada (strongly typed) Não permite afetar uma variável de um tipo com um valor de outro tipo Quando necessário, são realizadas conversões: Implícitas (automáticas) De tipos menos abrangentes para mais abrangentes: byte short int long float double char int int c = 'A'; De qualquer tipo para String (se for objeto, com método tostring()) "x = " + x Explícitas (indicadas no código) São da responsabilidade do programador 2.5 + 1 byte value; value = (byte)34; ((float)(a + b + c)) / 3; 12
Avaliação de expressões As expressões são avaliadas operador a operador. O resultado de uma operação produz o operador para o seguinte Pela ordem definida pelos parêntesis Pela ordem de prioridade dos operadores envolvidos Da esquerda para a direita entre operadores da mesma prioridade (exceto afetações e operadores unários) a-b*(3+c)+2 ((a-(b*(3+c)))+2) As operações binárias exigem que os operandos sejam do mesmo tipo, caso contrário o operando de tipo menos abrangente é convertido para o tipo mais abrangente. 27 + 3.5 ((double)27)+3.5 As operações aritméticas são realizadas no tipo int ou noutro mais abrangente. 'C' - 'A' ((int)'c')-((int)'a') 2 13
Expressões booleanas Os operadores de comparação ( <, >, <=, >=, ==,!= ) e os operadores lógicos (&&,, &,, ^,!) produzem um valor lógico (do tipo boolean) como resultado.! (time > 0 && time < limit time == 3) Os operadores lógicos && e realizam avaliação parcial. Não sendo avaliado o operando direito se o esquerdo é decisivo. false && a false true a true Os operadores &, e ^ realizam dois tipos de operações: bit a bit se os operandos forem inteiros lógicas (AND, OR e XOR) se os operandos forem booleanos, fazendo sempre a avaliação completa 14