Programação Orientada a Objetos* Criando Classes em Java Prof. Isabel Cafezeiro [email protected] http://www.dcc.ic.uff.br/~isabel *Baseado no livro Introdução à Programação Orientada a Objetos usando JAVA – Rafael Santos – Editora Campus – Série SBC O ambiente de programação JDK (Java Development Kit) http://java.sun.com http://java.sun.com/docs/books/tutorial Linux, Windows e outros Edição, Compilação e Execução de classes Editor de textos, Javac e Java (Jcreator: http://www.jcreator.com/, wordpad) O ambiente de programação JDK (Java Development Kit) javac ( compilador ) java ( interpretador ) appletviewer ( visualizador de applets ) javadoc ( gerador de documentação ) jar ( programa de compactação ) javap ( disassembler ) ... O processo de compilação/execução Javac A classe Java em arquivo com extensão .java Java A classe précompilada (bytecode), em arquivo com extensão .class interpretação do bytecode pela máquina virtual Java (JVM) Classes em Java Nome de classes: Acentos e cedilha são desaconselhados (o compilador usa o nome das classes pra nomear arquivos) Números podem aparecer após letra $ e _ são considerados letra Maiúsculas minúsculas Há palavras reservadas Recomenda-se: Iniciar nomes de classes com maiúsculas Usar maiúsculas para separar palavras ex: CadastroDeFuncionário Uma classe por arquivo Usar o mesmo nome para o arquivo (com extensão .java) e para a classe Classes em Java /** * A classe Vazia não possui campos nem métodos, mas * mesmo assim pode ser usada para exemplificar as regras Javadoc * sintáticas básicas de Java, podendo até mesmo ser * compilada. Maiúscula? */ Class Vazia // esta é a declaração da classe! { /* se houvessem campos ou métodos, eles deveriam ser declarados aqui. */ } // fim da classe Vazia Vazia.java Classes em Java f:\AULAS\POO>c:\j2sdk1.4.2_03\bin\javac Vazia javac: invalid flag: Vazia Usage: javac <options> <source files> where possible options include: -g Generate all debugging info ... f:\AULAS\POO>c:\j2sdk1.4.2_03\bin\javac Vazia.java Vazia.java:7: 'class' or 'interface' expected Class Vazia // esta Ú a declaraþÒo da classe! ^ 1 error f:\AULAS\POO>c:\j2sdk1.4.2_03\bin\javac Vazia.java f:\AULAS\POO>java Vazia Exception in thread "main" java.lang.NoSuchMethodError: main f:\AULAS\POO> Campos de classes em Java Tipos Nativos: Nome do tipo boolean byte Valores do tipo (true, false) [-128,127] short (dois bytes) [-32768,32767] int (quatro bytes) [-2147483648,2147483647] long (oito bytes) char (dois bytes, Unicode [0,65535],operados como inteiros) 'a','b',... float (ponto flutuante, 4bytes) double (ponto flutuante, 8bytes) Campos de classes em Java Tipos Nativos: Nome do tipo Operações do tipo boolean &&, ||, ! byte short int +,- (unário e binário), long *,/, char % (resto ), float <,>,<=,>=,==,!= double Campos de classes em Java Literais .... .... quando atribuídas para variáveis dos tipos de tamanhos específicos são automaticamente convertidas, desde que estejam no intervalo esperado short umAno; Literal inteira 32767 convertida para tipo short. umAno = 32767; Erro de compilação: valor fora do intervalo. umAno = 32768; C:\>javac testedata.java testedata.java:6: possible loss of precision found : int required: short umDia = 22; umMês = 13; umAno = 32768; ^ 1 error Campos de classes em Java Literais .... .... quando passadas como argumentos devem ser explicitamente convertidas (operação cast) n.inicializaData(umDia,umMês,32767); Erro de compilação: Literal inteira 32767 onde é esperado tipo short C:\>javac testedata.java testedata.java:7: inicializaData(byte,byte,short) in Data cannot be applied to (byte,byte,int) n.inicializaData(umDia,umMês,32767); ^ 1 error n.inicializaData(umDia,umMês, (short) 32767); Campos de classes em Java /** A classe DataSemMetodos contém somente alguns campos * que exemplificam as declarações de campos e tipos de dados em * Java. */ class DataSemMetodos { byte dia,mês; short ano; // o ano completo (quatro dígitos) /* Se houvessem métodos para esta classe, eles seriam declarados aqui dentro. */ } // fim da classe DataSemMetodos dataSemMetodos.java Campos de classes em Java Nomes de campos de classes: Acentos e cedilha podem ser usados sem restrição Números podem aparecer após letra _ e $ são considerados letra Maiúsculas minúsculas Há palavras reservadas É possível declarar vários campos com o mesmo tipo (ou classe) separando seus nomes por vírgulas Recomenda-se: Iniciar nomes de campos de classes com minúsculas Usar maiúsculas para separar palavras ex: nomeDoAluno Métodos em Java Nomes de métodos: Mesmas regras que nomes de campos Recomenda-se: Iniciar nomes de métodos com minúsculas Usar maiúsculas para separar palavras ex: mostraCampos, acende, inicializa Forma geral da declaração: modificador-de acesso tipo-ou-classe-de retorno nome-de-método ( lista-de-argumentos ) Métodos em Java tipo (classe) de retorno /** Este método chama o método dataÉVálida para verificar se os * argumentos são correspondentes a uma data válida: se forem, * inicializa os campos, caso contrário zera todos os três campos. */ void inicializaDataSimples(byte d,byte m,short a) lista de { parâmetros if (dataÉVálida(d,m,a)) { dia = d; mês = m; ano = a; } else { dia = 0; mês = 0; ano = 0; } } // fim do método inicializaDataSimples sem vírgula no final do método DataSimples.java Métodos em Java /** Este método recebe uma instância da própria classe DataSimples como * argumento e verifica se a data representada pela classe e pela instância * passada é a mesma. A comparação é feita campo a campo. */ boolean éIgual(DataSimples outraDataSimples) { if ((dia == outraDataSimples.dia) && (mês == outraDataSimples.mês) && objeto passado como (ano == outraDataSimples.ano)) parâmetro return true; else acesso aos campos do objeto return false; } // fim do método éIgual método com retorno deve conter a palavra return no corpo DataSimples.java Escopo Regras de Escopo: Determinam a visibilidade dos nomes campos da classe são visíveis em toda classe desconsidera-se ordem e localização variáveis e instâncias declaradas dentro de métodos são visíveis no próprio método considera-se ordem e localização argumentos de métodos são visíveis no próprio método Escopo /** A classe Triangulo representa os três lados de um triângulo qualquer. */ lado2,lado3 são class Triangulo visíveis em toda { float lado1; classe, inclusive no boolean éEquilátero() { .... } float calculaPerímetro() { .... } corpo de qualquer método com declaração precedente à declaração de lado2,lado3 . float lado2,lado3; } // fim da classe Triangulo triangulo.java Escopo boolean éEquilátero() { boolean igualdade12,resultado; igualdade12 = (lado1 == lado2); boolean igualdade23; igualdade23 = (lado2 == lado3); if (igualdade12 && igualdade23) resultado = true; else resultado = false; return resultado; } // fim do método éEquilátero igualdade12, resultado e igualdade23 só são visíveis neste método o uso de cada nome local ao método só pode ocorrer após a declaração do nome triangulo.java Modificadores de Acesso Encapsulamento: Para assegurar o uso correto, recomenda-se que os usuários de uma classe não tenham acesso aos campos da classe ou aos métodos que não implementam serviços oferecidos pela classe modificador private: impede a manipulação pelo usuário da classe; campos de classes, métodos que não implementam serviços modificador public: permite a manipulação pelo usuário da classe; métodos que implementam serviços Outros modificadores: protected, ausente Modificadores de Acesso /** A classe Data contém campos e métodos que permitem a manipulação de datas. */ campos privados: a classe deve class Data implementar métodos (públicos) para { modificá-los private byte dia,mês; private short ano; public void inicializaData(byte d,byte m,short a) { ... } // fim do método inicializaData public byte retornaDia() { return dia; } // fim do método retornaDia ... Data.java Modificadores de Acesso ... public boolean éIgual(Data outraData) { if ((dia == outraData.dia) && (mês == outraData.mês) && (ano == outraData.ano)) return true; else Outra instância da mesma classe: seus return false; campos e métodos (mesmo os privados) } // fim do método éIgual podem ser manipulados diretamente. .... } // fim da classe Data Data.java