Programação Orientada a Objetos (DPADF 0063) Aula 3 – Abstração Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior de Tecnologia em Sistemas para Internet Prof. Bruno B. Boniati – www.cafw.ufsm.br/~bruno Classes x Objetos Abstração • Habilidade de generalizar, ou seja de se concentrar nos aspectos realmente importantes de um conceito ou fenômeno, ignorando características menos importantes ou acidentais; • Na POO, uma classe é uma abstração de entidades existentes no domínio do sistema de software; O que é uma classe • A classe é a unidade básica de trabalho em um programa orientado a objetos; • A maior parte do trabalho em POO consiste em modelar classes; • Representa um modelo abstrato a partir do qual são criadas instâncias; O que um objeto • Objeto é uma instância da classe; • É uma representação real da classe que ocupa espaço na memória e consome recursos do computador; • A classe é a descrição de um tipo de objeto; • Objeto está para classe da mesma forma que variável está para tipo de dado. Atributos & Métodos • A classe é uma coleção de dados (atributos) e operações (métodos) que manipulam tais dados ▫ Atributos São os dados (simples ou compostos) que caracterizam os objetos daquela classe; São armazenadas em variáveis; Constituem o estado do objeto. ▫ Operações São os métodos (procedimentos ou funções) que manipulam os dados; Uma classe em Java ... class Hora { private int hora; private int minuto; private int segundo; public public public public void void void void setHorario(int h, int m, int s) {...} setHora(int h) {...} setMinutos(int m) {...} setSegundos(int s) {...} Arquivo Hora.java (Após a compilação dará origem ao arquivo Hora.class) public String getHorario() {...} } • Inicia com a palavra reservada class; • Convenciona-se utilizar o nome da classe com a 1ª letra em maiúscula; • Uma “{“ (abre chave) marca o início e “}” (fecha chave) marca o fim da classe; • Normalmente cada classe é salva como um arquivo de mesmo nome da classe com extensão .java; Uma classe em Java ... (cont.) public class Hora { private int hora; private int minuto; private int segundo; public public public public public public Atributos (Variáveis de Instância) void setHorario(int h, int m, int s) {...} void setHora(int h) {...} void setMinutos(int m) {...} void setSegundos(int s) {...} void setHoraAtual() {...} String getHorario() {...} Operações (Métodos de Instância) } • Atributos e métodos iniciam pelo modificador de acesso • Atributos obrigatoriamente possuem um tipo; • Métodos devem indicar o tipo de retorno ou void quando não retornam nada; • Métodos podem receber argumentos (parâmetros) mas sempre terminam com “(“ e “)” mesmo que não os tenham. Modificadores de acesso (definem o escopo/visibilidade de um método/atributo) • public ▫ Simbolizado por “+” ▫ Indica que o atributo/método pode ser acessado por objetos de outras classes; • private ▫ Simbolizado por “-” ▫ Protege o atributo do acesso externo, permitindo ao mesmo ser acessado somente por métodos daquela classe e pelo objeto instanciado; • protected ▫ Simbolizado por “#” ▫ Permite o acesso a objetos de classes filhas mas protege do acesso de objetos que não fazem parte da hierarquia de classes; Método main(String [] args) • Permite que uma classe seja executada (normalmente pelo menos uma das classes da aplicação precisa ser executada); • Quando uma aplicação java é iniciada, a JVM localiza e chama o método main() que recebe por parâmetro um vetor de objetos String representando os parâmetros de linha de comando; Um objeto em Java • Precisa ser identificado enquanto entidade do código (uma variável, um elemento em uma lista, uma posição de um vetor, etc.); • O operador new ... ▫ Aloca memória para o novo objeto (a quantidade necessária é obtida a partir da definição da classe); ▫ Chama o construtor da classe para inicializar o estado do novo objeto; ▫ Retorna uma referência (um endereço de memória para o objeto recém criado); Um objeto em Java ... (cont.) public class Aplicacao { public static void main(String[] args) { Hora horaDoAlmoco; horaDoAlmoco = new Hora(); horaDoAlmoco.setHorario(12,30,00); Hora horaAtual = new Hora(); horaAtual.setHoraAtual(); } } • Métodos são acessados através do operador “.” (ponto), precedido pelo nome do objeto (variável) e seguido do nome do método; Referência null • Valor default para inicialização de atributos de tipos não primitivos; • Indica que determinado atributo/variável de referência não se refere a nenhum objeto; Atribuição de referências public class Aplicacao { Referências horaDoAlmoco public static void main(String[] args) { horaAtual Hora horaDoAlmoco; horaDoAlmoco = new Hora(); horaDoAlmoco.setHorario(12,30,0); Hora horaAtual = new Hora(); horaAtual.setHoraAtual(); horaAtual = horaDoAlmoco; } } h = 12 m = 30 s = 0 Instância • Quando atribuímos uma referência para um objeto para outra referência, temos ao final duas referências para um único objeto e não uma cópia do objeto (como seria com tipos primitivos) Métodos Construtores • Método especial chamado automaticamente pelo ambiente de execução quando um objeto é criado; • SEMPRE tem o mesmo nome da classe e pode opcionalmente receber parâmetros; • Nunca pode ter um tipo de retorno (isso é implícito pois ele retorna uma referência para um objeto da classe em questão). Métodos construtores public class Hora { private int hora; private int minuto; private int segundo; public Hora(int h, int m, int s) { setHorario(h, m, s); } public Hora(int h) { setHorario(h, 0, 0); } public public public public public public } Métodos construtores (com assinaturas diferentes) void setHorario(int h, int m, int s) {...} void setHora(int h) {...} void setMinutos(int m) {...} void setSegundos(int s) {...} void setHoraAtual() {...} String getHorario() {...} Referência this • Todos os métodos de instância recebem um parâmetro implícito chamado this que pode ser utilizado dentro do método de instância para se referir ao objeto corrente (cujo método foi invocado); • É normalmente utilizado em duas situações: ▫ Quando o nome de uma variável de instância é igual ao nome de um parâmetro do método; ▫ Quando o método precisa chamar outro método passando por parâmetro uma referência ao objeto atual. Referência this public class Hora { private int hora; private int minuto; private int segundo; public Hora(int h, int m, int s) { setHorario(h, m, s); } public Hora(int h) { setHorario(h, 0, 0); } public void setHorario(int hora, int minuto, int segundo) { this.hora = hora; this.minuto = minuto; this.segundo = segundo; } } Neste caso this resolve a ambiguidade de nomes (parâmetros x atributos) Variáveis de Classe • Também conhecida por variável estática (static); • É uma variável comum a todas as instâncias da classe; • Há somente uma instância de uma variável de classe, não importa quantas instâncias da classe existam; • Não é recomendado que seus valores sejam alimentados por métodos construtores e sim através de inicializadores com valores default. Variáveis de Classe public class Hora { private int hora; private int minuto; private int segundo; Variável de classe static int fusoHorario; public Hora(int h, int m, int s) { setHorario(h, m, s); } public Hora(int h) { setHorario(h, 0, 0); } static { fusoHorario = - 3; } } É possível definir um bloco inicializador estático que não possui nome nem valor de retorno e começa com a palavra static. Ele funciona de maneira similar a um construtor porém é executado apenas uma vez, quando o primeiro objeto daquela classe for instanciado. Métodos de Classe • Não necessitam de uma instância da classe para que sejam invocados; • São definidos com o uso da palavra reservada static. • Alguns exemplos (classe Math) ▫ Math.sqrt(double a) retorna a raiz quadrada de “a”. ▫ Math.abs(int a) retorna o valor absoluto de “a”. ▫ Math.random() retorna um valor randômico entre zero e um. Métodos de Classe public class Hora { private int hora; private int minuto; private int segundo; static int fusoHorario; public static int diferencaEmMinutos(Hora a, Hora b) { int diferenca; ... return diferenca; } } Método de classe (Pode ser invocado diretamente pela classe, sem a necessidade de uma instância – objeto) Sobrecarga de Métodos • Métodos de mesmo nome com assinaturas diferentes (tipos de argumentos/parâmetros diferentes); ▫ Valor de retorno não é considerado parte da assinatura; • Métodos sobrecarregados são resolvidos em tempo de compilação; public class Hora { private int hora; private int minuto; private int segundo; public void ajustarHorario(int hora, int minuto, int segundo); Estes dois métodos não tem assinaturas diferentes isso não é permitido public void ajustarHorario(int hora, int minuto); public void ajustarHorario(int minuto, int segundo); public void ajustarHorario(int hora); } Atributos final • O modificador final indica que o atributo não poderá sofrer alteração em seu valor; • Possui o mesmo comportamento de uma constante que deve ser inicializada; • Em geral possui um escopo púbico permitindo seu acesso externo; • O atributo PI da classe Math é um exemplo de atributo final (que retorna a constante π); Método finalize • Java não implementa o conceito de “destrutores” (métodos invocados para destruir a instância e liberar seus recursos); ▫ Para isso há o conceito de “coletor de lixo” • Contudo, há situações onde é interessante que ao destruir o objeto, outros recursos, que não a memória, venham a ser liberados. • Neste caso pode-se definir um método de nome finalize e retorno void que será chamado antes do coletor de lixo eliminar o objeto; Classe String Classe String • Uma String em Java não são é um tipo primitivo e sim objetos de uma classe com algumas características especiais; • Valores literais entre aspas duplas são transformados pelo compilador Java em objetos da classe String; Classe String (cont.) • A classe String representa uma string imutável, ou seja, uma vez criado um objeto String ele não poderá mais ser alterado; • O operador “+” é utilizado como uma das formas de concatenar strings; • Tipos primitivos são automaticamente convertidos para Strings em concatenações; Classe String ... exemplos String nome; nome = “Testando”; nome = “Testando” + “ “ + “Java”; int dez = 10; nome = nome + “ “ + dez; Nome = “ Teste “.concat(“Java”); Classe String ... mais exemplos String s = “Testando”; System.out.println(s.length()); // 8 System.out.println(s.charAt(2)); // s System.out.println(s.substring(2,4)); // st System.out.println(s.toUpperCase()); // TESTANDO System.out.println(s.toLowerCase()); // testando System.out.println(s.trim()); // Testando s = “Fábrica de brinquedos”; System.out.println(s.indexOf(“br”)); //2 System.out.println(s.lastIndexOf(“br”)); //11 System.out.println(s.equals(“br”)); //false System.out.println(s.equalsIgnoreCase(“br”)); //false Classes Wrappers • Para cada tipo primitivo, Java fornece uma classe invólucro (wrapper) correspondente. • Classes Wrappers permitem que um tipo primitivo seja manipulado como se fosse um objeto; • Cada classe wrapper fornece um método estático para conversão de Strings para o tipo primitivo correspondente. Classes Wrappers Grupo Tipo Primitivo Classe Wrapper Lógico boolean Boolean Caractere char Caracter byte Byte short Short int Integer long Long float Float double Double Inteiros Ponto Flutuante Conversão (String x Classes Wrapper) Origem Destino Método boolean, char, byte, short, int, long, double, float String String.valueOf( ? ) String int Integer.parseInt( ? ) String float Float.parseFloat( ? ) Variáveis multidimensionais Variáveis multidimensionais • Vetor é uma coleção de objetos do mesmo tipo; • Cada elemento pode armazenar um único item. Os itens podem ser ▫ Tipos primitivos; ▫ Referências para objetos. • Quando o vetor é criado seu tamanho é fixado; • A primeira posição do vetor é a posição 0 (zero); • O tamanho do vetor não precisa ser uma constante, pode ser uma variável definida em tempo de execução; Variáveis multidimensionais (cont.) • Um vetor precisa ser declarado, criado e somente depois acessado; • Existem formas equivalentes de se declarar um vetor: int[] numeros; //Declaração int numeros[]; //Declaração numeros = new int[4]; //Criação numeros[0] = 10; //Acesso //Abaixo ñ se utiliza o operador new e o tamanho é detectado automaticamente int[] diasMes = {31,28,31,30,31,30,31,31,30,31,30,31}; int num = diasMes.length(); //12 Exercícios para fixação Classe Hora • Para finalizar a implementação da classe Hora, codifique o que se pede: ▫ Um novo método construtor que recebe um valor em minutos transcorridos e inicializa os atributos hora e minutos; ▫ Três novos métodos para validar os valores informados nos atributos hora, minutos e segundos (considerando o conjunto de valores válidos); ▫ Um método estático para indicar a diferença em minutos entre duas horas passadas por parâmetro; ▫ Um método para escrever a hora em formado hh:mm:ss