Módulo 03 Identificadores, Palavras Reservadas, e Tipos Objetivos • Utilizar comentários em um programa. • Distinguir entre identificadores válidos e não-válidos. • Reconhecer palavras-reservadas da tecnologia Java. • Listar os oito tipos primitivos. • Definir valores constantes para tipos texto e numéricos. • Definir os termos variáveis primitivas e variável de referência. Objetivos (Cont.) • Declarar variáveis do tipo classe (referência). • Construir um objeto utilizando o operador new. • Descrever iniciação default de objetos. • Descrever o significado de uma variável de referência. • Mostrar as conseqüências de associação de variáveis de referência. Estudar a padronização de nomenclatura na utilização de JavaBeans. Comentários • Os três estilos permitidos de comentários em um programa Java são: // comentário de uma linha /* comentário de uma ou mais linhas */ /** comentário para documentação */ Ponto e Vírgula, Blocos e Espaços em Branco • Uma instrução é uma ou mais linhas de código terminado por um ponto e vírgula (;): total = a+b+c +d+e+f; • Um bloco é uma coleção de instruções englobadas por chaves: { x= y+1; y= x+1; } Ponto e Vírgula, Blocos e Espaços em Branco • Devemos usar um bloco em uma definição de classe: public class Data { private int dia; private int mes; private int ano; } • Podem-se aninhar instruções de bloco. • Qualquer quantidade de espaços em branco é permitida em um programa Java. Identificadores • Nomes dados às variáveis, classe ou método. • Pode iniciar com um caractere Unicode, sublinhado, ou sinal de dólar ($) Não pode conter o caractere #, mesmo não sendo o primeiro caractere do identificador. • São “case-sensitive” e não possuem tamanho máximo. • Exemplos: Identificador _sis_var1 nomeUsuario $mude nome_usuario Palavras Reservadas em Java abstract char double for int private strictfp throws assert boolean class else goto interface protected super transient enum break const extends if long public switch try byte continue final implements native return synchronized void case default finally import new short this volatile catch do float instanceof package static throw while Tipos Primitivos • A linguagem de programação Java define oito tipos primitivos: • • • • Lógico – boolean Texto – char Inteiros – byte, short, int, e long Ponto Flutuante – double e float Lógico – boolean • O tipo de dados boolean possui duas constantes, true ou false. • Por exemplo, a instrução: boolean verdade = true; Declara a variável verdade como boolean e associa a ela o valor true. Texto – char e String char • Representa um caractere Unicode de 16 bits. • Possui seus literais envoltos por aspas (’ ’). • Utiliza as seguintes notações: 'a' a letra a '\t' Uma tabulação '\u????' Um caractere Unicode específico, ????, é substituído por exatamente 4 dígitos hexadecimais (por exemplo, ’\u03A6’ é a letra grega pi [ Φ] ) Texto – char e String String • Não é um tipo de dados primitivo; é uma classe. • Possui seus literais englobados por aspas duplas (" "). "Iremos aprender programação em Java." • Pode ser utilizada da seguinte forma: String saudacao = " Bom Dia !! \n"; String mensagemErro = "registro não encontrado!"; Inteiros – byte, short, int, e long • Utilizam três formas – decimal, octal, ou hexadecimal 2 Forma decimal do inteiro 2. 077 O zero no início indica um valor octal. 0xBAAC 0x indica um valor hexadecimal. • Constantes tem como valor padrão int. • Constantes com o sufixo L ou l são do tipo long. Inteiros – byte, short, int, e long • Tipos de dados inteiros possuem a seguinte faixa de valores: Ponto Flutuante – float e double • Literais de ponto flutuante incluem um ponto decimal ou um dos seguintes: • • • E ou e (Adiciona valor exponencial) F ou f (float) D ou d (double) 3.14 6.02E-23 2.718F 123.4E+306D Um simples valor de ponto flutuante (um double) Um número ponto-flutuante bem menor. Um número simples de tipo float Um número double com valor redundante D • double é tipo padrão de pontos flutuantes Ponto Flutuante – float e double • Tipos de dados ponto flutuante possuem os seguintes números de bits: Variáveis, Declarações, e Atribuições 1 public class Atribuicao { 2 public static void main (String args[]) { 3 // declarando variáveis inteiras 4 int x,y; 5 // declarando e atribuindo um ponto flutuante 6 float z = 3.414f; 7 // declarando e atribuindo um double 8 double w = 3.1415; 9 // declarando e atribuindo um tipo lógico 10 boolean verdade = true; 11 // declarando um caracter 12 char c; 13 // declarando uma variável do tipo String 14 String str; Variáveis, Declarações, e Atribuições(Cont.) 15 // declarando e atribuindo uma variável String 16 String str1 = "tchau"; 17 // Atribuindo um valor a uma variável char 18 c = 'A'; 19 // Atribuindo um valor a uma variável String 20 str = "Olá Pessoal !!!”; 21 // Atribuindo valores à variáveis int 22 x = 6; 23 y = 1000; 24 } 25} Tipos de Referência em Java • Além de tipos primitivos, todos os outros são tipos de referência. • Uma variável de referência contém a forma de se manusear um objeto. • Exemplo: 1 public class Data { 2 private int dia = 1; 3 private int mes = 1; 4 private int ano = 2000; 5 public Data(int dia,int mes,int ano) { ... } 6 public void print() { ... } 7} 1 public class TestaData { 2 public static void main(String[] args) { 3 Data hoje = new Data(22,7,1964); 4 } 5} Construindo e Iniciando Objetos • Utilizar new Xxx()para criar um novo objeto resulta em: • • • Alocação de memória: Espaço para o novo objeto é alocado e variáveis de instância são iniciadas com seus valores padrão (por exemplo, 0, false, null, etc...) Iniciação explícita de atributos é executada Um construtor é executado • A referência do objeto é atribuída a uma variável. • Exemplo: Data aniversario = new Data(22,07,1964); Alocação e Layout de Memória • Uma declaração aloca espaço de armazenamento apenas para uma referência: Data aniversario = new Data(22,7,1964); • Use o operador new para alocar o espaço de Data: Data aniversario = new Data(22,7,1964); Iniciação Explícita de Atributos • Inicia os atributos por padrão: Data aniversario = new Data(22,7,1964); • os valores padrão são da declaração de atributos na classe. Executando o Construtor • Execução do construtor correspondente: Data aniversario = new Data(22,7,1964); • No caso de sobrecarga de construtor (Overload), o primeiro pode chamar o outro. Atribuindo a Referência a uma Variável • Atribua o recém criado objeto à variável de referência: Data nascimento = new Data(22,7,1964); Atribuindo Referências ... int x = 7; int y = x; Data s = new Data(22,7,1964); Data t = s; • Duas variáveis referindo a um único objeto: Atribuindo Referências (Cont.) • Re-atribuição faz com que duas variáveis apontem para dois objetos distintos: t = new Data(22,12,1964); Passagem por Valor • Em uma Máquina Virtual, a linguagem de programação Java passa argumentos apenas por valor. • Quando um objeto é passado como um argumento para um método, o valor do argumento é a referência do objeto. • O conteúdo pode ser mudado no método invocado, mas a referência original do objeto nunca é mudada. Passagem por Valor 1 public class TestePassagemParametros { 2 3 // Métodos para mudar os valores iniciais 4 public static void mudaInt(int valor) { 5 valor = 55; 6 } 7 public static void mudaRefObjeto(Data ref) { 8 ref = new Data(1,1,2000); 9 } 10 public static void mudaAtributoObjeto(Data ref) { 11 ref.setDia(4); 12 } 13 14 public static void main(String args[]) { 15 Data data; 16 int val; 17 18 // atribui a variável int 19 val = 11; 20 // Tenta alterá-la Passagem por Valor(Cont.) 21 mudaInt(val); 22 // Qual é o valor agora? 23 System.out.println("O valor inteiro é : " + val); 24 25 // Atribui a data 26 data = new Data(22,7,1964); 27 // Tenta mudá-la 28 mudaRefObjeto(data); 29 // Qual o valor agora? 30 data.print(); 31 32 // Mudando agora o atributo dia 33 // através da referência do objeto 34 mudaAtributoObjeto(data); 35 // Qual o valor agora? 36 data.print(); 37 } 38 } 39 A Referência this Eis alguns usos da palavra reservada this: • Resolução de ambigüidade: para referenciar um membro dentro do código que possui variáveis locais ou argumentos com o mesmo nome daquele membro. • Passar o objeto atual como parâmetro para outro método ou construtor. A Referência this 1 public class Data { 2 public int dia = 1; 3 public int mes = 1; 4 public int ano = 2000; 5 6 public Data(int dia, int mes, int ano) { 7 this.dia = dia; 8 this.mes = mes; 9 this.ano = ano; 10 } 11 public Data(Data data) { 12 this.dia = data.dia; 13 this.mes = data.mes; 14 this.ano = data.ano; 15 } 16 17 public Data adicionarDias(int mais_dias) { 18 Data nova_data = new Data(this); 19 20 nova_data.dia = nova_data.dia + mais_dias; 21 // Não implementado: código para verificação do limite de dias em um 22 // mês... 23 return nova_data; 24 } A Referência this(Cont) 25 public void print() { 26 System.out.println("Data: " + dia + "/" + mes +"/" + ano); 27 } 28 } 1 public class TestaData { 2 public static void main(String[] args) { 3 Data aniversario = new Data(22,7,1964); 4 Data semanaSeguinte = aniversario.addDias(7); 5 6 semanaSeguinte.print(); 7 } 8} Convenções de Nomenclatura em JavaBeans No início, a especificação JavaBeans foi criada para auxiliar desenvolvedores Java a criar componentes que poderiam ser facilmente integrados em um IDE . Hoje em dia, JavaBeans são utilizados com diversos propósitos além de sua integração com IDEs Beans de Formulário, Beans de entidade, etc... JavaBeans são classes Java que possuem propriedades. Pense em propriedades como variáveis de instância privadas. Métodos segunda a especificação JavaBeans devem ser nomeados dependendo do propósito do método com os prefixos set, get, is, add ou remove Convenções de Nomenclatura em JavaBeans Um JavaBean deve ter um construtor default. A especificação JavaBeans suporta o conceito de eventos: Eventos permitem que componentes notifiquem outros componentes quando algo acontece Exemplo, um clique do mouse em um botão pode disparar um evento para diversos outros componentes. Os objetos que recebem a informação de ocorrência de um evento são chamados de listeners. Estudaremos eventos e listeners com detalhes no curso de Padões de Projetos e Programação para Desktop. Convenções de Nomenclatura em JavaBeans Para a prova SCJP você precisa saber que os métodos que são usados para adicionar ou remover listeners para um evento devem também seguir padrões de nomenclatura JavaBeans. Métodos de registro de listener devem usar o prefixo add, seguido pelo tipo do listener Exemplo: addActionListener() Convenções de Nomenclatura em JavaBeans Métodos para remoção de listener devem usar o prefixo remove, seguido pelo tipo do listener Exemplo: removeActionListener() O tipo do Listener a ser adicionado ou removido deve ser passado como argumento para o método Exemplos de assinaturas de métodos inválidas em um JavaBean void setNomeCliente(String s) // deve ser public public void modifiqueMeuValor(int v) // não podemos usar a palavra modifique public void addXListener(MeuListener m) // tipos de Listeners diferentes Exemplos de assinaturas de métodos válidas em um JavaBean public void setMeuValor(int v) public int getMeuValor() public boolean isMeuStatus() public void addMeuListener(MeuListener m) public void removeMeuListener(MeuListener m) Convenções de Codificação em Java • Pacotes: package banco.dominio; • Classes: class ContaPoupanca • Interfaces: interface Conta • Métodos: getSaldoEmConta() Convenções de Codificação em Java (Cont.) • Variáveis: clienteAtual • Constantes: LIMITE_INFERIOR TAMANHO_MAXIMO Perguntas?