Laboratório de Computação Aula 08 e 09 – Implementação de Classes Prof. Fábio Dias [email protected] Métodos Acessores Usados para ler valores de atributos de classe ou de objeto Escritos como: get<NomeDoAtributo> Retorna o valor do atributo Exemplos public class Pessoa { private String nome; private int idade; public String getNome() { return nome; } public int getIdade() { return idade; } } Métodos Modificadores Utilizados para modificar os valores dos atributos de classe ou de objeto Escritos como: set<NomeDoAtributo> Recebe o valor do atributo Exemplos public class Pessoa { private String nome; private int idade; public void setNome(String nome) { this.nome = nome; } public void setIdade(int idade) { this.idade = idade; } } Envio de Argumentos Envio por valor – o método faz uma cópia do valor do argumento passado para o método Envio por referência – o método faz uma cópia da referência do argumento passado Envio por valor public class TestePassagemPorValor { public static void main(String args[]){ int i = 10; System.out.println(i); //Chama o método teste e passa como argumento teste(i); System.out.println(i); } public static void teste(int j){ j = 33;//Muda o valor do parametro j } } Envio por Referência public class TestePassagemPorReferencia { public static void main(String[] args){ int idades[] = {10, 11, 12}; for(int i = 0; i < idades.length; i++){ System.out.println(idades[i]); } //Chama o método teste e passa idades como argumento teste(idades); for(int i = 0; i < idades.length; i++){ System.out.println(idades[i]); } } public static void teste(int[] arr){ for(int i = 0; i < arr.length; i++){ arr[i] = i + 50; } } Envio por Referência Escopo de um Atributo Determina onde o atributo é acessível na classe Determina o tempo de vida de um atributo ou quanto tempo o atributo pode existir na memória É determinado pelo local onde o atributo é declarado na classe Para simplificar, pensemos no escopo como sendo algo existente entre as chaves {...}. A chave à direita é chamada de chave de saída do bloco e a chave à esquerda é chamada chave de entrada do bloco. Quando declarado dentro de um bloco, seu escopo inicia com a sua declaração e vai até a chave de saída do bloco. Exemplo 1 Exemplo 2 Escopo de um Atributo O identificador deve ser único no escopo Isto significa que a seguinte declaração: { int test = 10; int test = 20; } O compilador irá gerar um erro pois você deverá ter um nome único para o atributo dentro do bloco Escopo de um Atributo Pode-se ter atributo e variável definidos com o mesmo nome, desde que não sejam declarados no mesmo bloco. public class TesteBloco { int valor = 10; public void teste() { System.out.print(valor); int valor = 20; System.out.print(valor); } public static void main(String[] args) { TesteBloco testeBloco = new TesteBloco(); testeBloco.teste(); } } Casting de Tipos Casting de Tipos Casting de objetos Casting de Tipos Primitivos Casting permite a conversão de um tipo para outro É usual entre os tipos numéricos Tipos lógicos não aceitam casting Casting pode ser implícito ou explícito Casting Implícito Armazenar um atributo de tipo menor em um de tipo maior: int numInt = 10; double numDouble = numInt;//cast implícito Pela execução de fórmulas: byte numInt1 = 1; short numInt2 = 2; int numDouble = numInt1 + numInt2;//resulta em int Casting Explícito Converter um atributo cujo tipo tem um comprimento maior para um de comprimento menor, é necessário um cast explícito (tipoDado)valor Exemplos de Casting Explícito Para realizar um casting de um valor do tipo int para char char valChar = 'A'; System.out.print((int)valChar); //explícito Exemplos de Casting Explícito double valDouble = 10.12; //converte valDouble para o tipo int int valInt = (int)valDouble; double x = 10.2; int y = 2; //faz o cast do resultado da operação para int int result = (int)(x/y); Casting de Objetos Em instâncias de classes a operação de casting também pode ser usada para fazer a conversão para instâncias de outras classes: A classe de origem e a classe de destino devem ser da mesma família, relacionadas por herança; uma classe deve ser subclasse da outra Analogamente à conversão de valores primitivos para um tipo maior, alguns objetos não podem ser convertidos implicitamente (NomeClasse)objeto Exemplo de Casting de Objetos Funcionario funcionario = new Funcionario(); Gerente gerente = new Gerente(); funcionario = gerente;//cast não é necessário de baixo para cima gerente = (Gerente)funcionario;//necessita do cast explícito Convertendo Tipos Primitivos para Objetos e vice-versa Não se pode fazer, sob qualquer circunstância, casting de um objeto para um tipo de dado primitivo ou vice-versa Como alternativa, o pacote java.lang inclui classes que fazem a correspondência para cada tipo primitivo: Float, Boolean, Byte, dentre outros Chamamos estas classes de Wrapper Class Wrapper Class Possuem o mesmo nome dos tipos primitivos, exceto pelo fato que o nome dessas classe começam com letra maiúscula (Short ao invés de short, Double ao invés de double, etc) Duas possuem nomes que diferem do correspondente tipo de dados: Character é usado para variáveis char e Integer para variáveis int Usando as classes que correspondem a cada um dos tipos primitivos, é possível criar objetos que armazenam o mesmo tipo de valor Convertendo Tipos Primitivos para Objetos e vice-versa Criar uma instância de uma classe Integer com o valor 7801 (primitivo para Objeto) Integer dataCount = new Integer(7801); Converter um objeto Integer para um tipo de dado primitivo int. O resultado é o valor 7801 int newCount = dataCount.intValue(); Converter String para um tipo numérico, digamos int (objeto para primitivo) String numero = "65000"; int num = Integer.parseInt(numero); Pacotes É utilizado no Java para agrupar classes e interfaces relacionadas em uma única unidade. Oferece um mecanismo conveniente para o gerenciamento de um grupo grande de classes e interfaces, e evita conflitos de nomes. Importando Pacotes Para utilizar classes externas ao pacote atual Por padrão, todos os programas Java importam o pacote java.lang A sintaxe para importar pacotes é: import <nomeDoPacote>.<nomeDaClasse>; Exemplo: import java.awt.Color; import java.awt.*; Criando Pacotes Para criar nossos pacotes, escrevemos: package <nomePacote>; Pacotes também podem ser aninhados. Neste caso, o interpretador espera que a estrutura de diretórios contendo as classes combinem com a hierarquia dos pacotes. Modificadores de Acesso Há quatro diferentes tipos de modificadores de acesso: public private Protected Default public, protected e private são escritos explicitamente na instrução para indicar o tipo de acesso. default não deve ser escrito. Acesso Padrão Especifica que os elementos da classe são acessíveis somente aos métodos internos da classe e às suas subclasses e classes do mesmo pacote. Não há palavra-chave para o modificador default; sendo aplicado na ausência de um modificador de acesso. Exemplo public class Pessoa { String sobreNome; void imprimirSobreNomePessoa(){ System.out.println("Sobrenome: " + sobreNome); } } Acesso Público Especifica que os elementos da classe são acessíveis seja internamente e externamente à classe Qualquer objeto que interage com a classe pode ter acesso aos elementos públicos da classe Palavra-chave: public Exemplo public class Pessoa { public String nome; public void imprimirNomePessoa(){ System.out.println("Nome: " + nome); } } Acesso Protegido Especifica que somente classes no mesmo pacote podem ter acesso aos atributos e métodos da classe. Palavra-chave: protected Exemplo public class Pessoa { protected String endereco; protected void imprimiorEnderecoPessoa(){ System.out.println("Endereco: " + endereco); } } Acesso Privado Especifica que os elementos da classe são acessíveis apenas pela classe que os definiram. Palavra-chave: private Exemplo public class Pessoa { private int idade; private void imprimiorIdadePessoa(){ System.out.println("Idade: " + idade); } } Exercícios 1 – Registro de Agenda Sua tarefa é criar uma classe que contenha um Registro de Agenda. A tabela 1 descreve as informações que um Registro de Agenda deve conter: Crie os seguintes métodos: Forneça todos os métodos assessores e modificadores necessários para todos os atributos. Construtores. Exercícios 2 – Agenda Para Entregar – 22/04/2008 Crie uma classe Agenda que possa conter entradas de objetos tipo Registro de Agenda (utilize a classe criada no primeiro exercício). Devem ser oferecidos os seguintes métodos para a agenda: 1. Adicionar registro 2. Excluir registro 3. Visualizar registros 4. Modificar um registro