Programação Orientada a Objetos C ++ 4 Conceitos de OO em Java Classes e Objetos Departamento de Informática Prof. Anselmo C. de Paiva Classes O conjunto de requisições que um objeto pode cumprir é determinado pela sua classe. A classe também determina que método será executado para cumprir uma requisição. A classe especifica que informações um objeto armazena internamente. Objetos são instâncias de classes. Classes podem ser compostas em hierarquias, através de herança. Classes e Objetos Prof. Anselmo Cardoso de Paiva
Resumo Agentes são objetos; Ações (computações) são executadas através da troca de mensagens entre objetos; Todo objeto é uma instância de uma classe; Uma classe define uma interface e um comportamento; Classes podem estender outras classes através de herança. Classes e Objetos Prof. Anselmo Cardoso de Paiva 3 Exemplos: Objeto Vídeo PLAY > 1456 > >>> <<< DI Classes e Objetos Prof. Anselmo Cardoso de Paiva 4
Exemplos: Objeto Conta Bancária Crédito Saldo 875,3 Número 1.34-7 Débito Classes e Objetos Prof. Anselmo Cardoso de Paiva 5 Estados do Objeto Conta Crédito(0) Crédito Crédito Crédito Saldo Número Saldo Número 875,3 1.34-7 875,3 1.34-7 Saldo 895,3 Número 1.34-7 Débito Débito Débito Classes e Objetos Prof. Anselmo Cardoso de Paiva 6
Classe de Contas Bancárias Classes e Objetos Prof. Anselmo Cardoso de Paiva 7 Classes em Java Em Java, a declaração de novas classes é feita através da construção class. Podemos criar uma classe Point para representar um ponto (omitindo sua implementação) da seguinte forma: class Point {... Classes e Objetos Prof. Anselmo Cardoso de Paiva 8
Classe de Contas em Java public class Conta { public String numero; public double saldo; public void credito (double valor) { saldo = saldo + valor; public void debito (double valor) { saldo = saldo - valor; Classes e Objetos Prof. Anselmo Cardoso de Paiva 9 Criação de Objetos Criar objeto = instanciar classe Instanciação resulta em uma referência Produto lápis = new Produto(); lápis.id = Produto.proximo_id++; lápis.nome = Lápis ; Produto caneta = new Produto(); caneta.id = Produto.proximo_id++; caneta.nome = Caneta ; Classes e Objetos Prof. Anselmo Cardoso de Paiva 10
Criando Instâncias (Objetos) Forma geral da declaração e criação de objetos Declaração <id-classe> <lista-id>; exemplo: Conta conta1, conta; Criação <id> = new<id-classe> (<args>); exemplo: conta1 = newconta(); Combinando declaração e criação <id-classe> <id> = new<id-classe> (<args>) exemplo: Conta conta1 = newconta (); Classes e Objetos Prof. Anselmo Cardoso de Paiva 11 Inicializações Blocos de inicialização execução implícita na criação de objetos static: execução implícita na leitura da classe Construtores execução na criação deobjetos construtor default Classes e Objetos Prof. Anselmo Cardoso de Paiva 1
Construtores Classes podem ter construtores servem como interfaces para inicializar objetos possuem o mesmo nome das respectivas classes similares a métodos, mas não têm tipo de retorno pode haver mais de um por classe (sobrecarga) Ex.: public class Conta { public String numero; public double saldo; public void credito (double valor) {saldo = saldo + valor; public void debito (double valor) {saldo = saldo - valor; public Conta (String n) {numero = n; saldo = 0; Classes e Objetos Prof. Anselmo Cardoso de Paiva 13 Exemplo de Construtor class Produto { public long id; public String nome; public static long proximo_id = 0; public Produto(String nome) { this.nome = nome; this.id = proximo_id++; Produto lápis = new Produto( Lápis ); Produto caneta = new Produto( Caneta ); Classes e Objetos Prof. Anselmo Cardoso de Paiva 14
Criando Objetos com Construtores... Conta conta1; conta1 = new Conta( 1.34-7 ); conta1.credito(500.87); conta1.debito(45.00); System.out.println(conta1.saldo);... Classes e Objetos Prof. Anselmo Cardoso de Paiva 15 Inicialização de Campos Por exemplo, a classe Point poderia declarar: class Point { int x = 0; int y = 0; void move(int dx, int dy) { this.x += dx; this.y += dy; Classes e Objetos Prof. Anselmo Cardoso de Paiva 16
Construtores Ao invés de criar pontos sempre em (0,0), poderíamos querer especificar a posição do ponto no momento de sua criação. O uso de construtores permite isso. Construtores são mais genéricos do que simples atribuições de valores iniciais aos campos: podem receber parâmetros e fazer um processamento qualquer. Classes e Objetos Prof. Anselmo Cardoso de Paiva 17 Declaração de Construtores O construtor citado para a classe Point pode ser definido da seguinte forma: class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y;... Classes e Objetos Prof. Anselmo Cardoso de Paiva 18
Usando Construtores Como o construtor é um método de inicialização do objeto, devemos utilizá-lo no momento da instanciação. Point p1 = new Point(1,); // p1 é o ponto (1,) Point p = new Point(0,0); // p é o ponto (0,0) Classes e Objetos Prof. Anselmo Cardoso de Paiva 19 Construtor Padrão Quando não especificamos nenhum construtor, a linguagem Java declara, implicitamente, um construtor padrão, vazio, que não recebe parâmetros. Se declararmos algum construtor, esse construtor padrão não será mais declarado. Classes e Objetos Prof. Anselmo Cardoso de Paiva 0
Finalizações Pode ser necessário executar alguma ação antes que um objeto deixe de existir. Para isso são utilizados os destrutores. Destrutores são métodos que são chamados automaticamente quando um objeto deixa de existir. Em Java, destrutores são chamados de finalizadores. Classes e Objetos Prof. Anselmo Cardoso de Paiva 1 Gerência de Memória Java possui uma gerência automática de memória, isto é, quando um objeto não é mais referenciado pelo programa, ele é automaticamente coletado (destruído). A esse processo chamamos coleta de lixo. Nem todas as linguagens OO fazem coleta de lixo e, nesse caso, o programador deve destruir o objeto explicitamente. Classes e Objetos Prof. Anselmo Cardoso de Paiva
Finalizadores em Java Quando um objeto Java vai ser coletado, ele tem seu método finalize chamado. Esse método deve efetuar qualquer procedimento de finalização que seja necessário antes da coleta do objeto. Classes e Objetos Prof. Anselmo Cardoso de Paiva 3 Ex.: programa que cria e manipula 1 conta class CriaConta { /** Criando um objeto do tipo Conta */ public static void main (String [] args) { Conta conta1 = new Conta (); conta1.numero = 1.34-7 ; // referencia a atributos conta1.saldo = 0; conta1.credito (500.87); // referencia a metodos conta1.debito (45.00); System.out.println(conta1.saldo); Classes e Objetos Prof. Anselmo Cardoso de Paiva 4
Encapsulamento em uma classe Métodos públicos Métodos privados Atributos públicos Atributos privados Classes e Objetos Prof. Anselmo Cardoso de Paiva 5 Controle de Acesso em Java Normalmente, é conveniente proibir o acesso a certos atributos (ou mesmo métodos). Os níveis de proteção extremos são: public - permite acesso a partir de qualquer classe private - permite acesso apenas na própria classe Java oferece outros níveis de acesso que serão estudados posteriormente Classes e Objetos Prof. Anselmo Cardoso de Paiva 6
Conseqüências de tornar um atributo privado Tentar acessar um componente privado (de fora da classe) resulta em erro de compilação Mas como torná-lo acessível apenas para consulta (leitura)? Isto é possível definindo-se um método que retorna o atributo (na própria classe onde o atributo se encontra) Classes e Objetos Prof. Anselmo Cardoso de Paiva 7 Classe de Contas com Atributos Privados class Conta { private String numero; private double saldo; public void credito (double valor) {saldo = saldo + valor; public void debito (double valor) {saldo = saldo - valor; public String numero() {return numero; public double saldo() {return saldo; Conta (String n) {numero = n; saldo = 0; Classes e Objetos Prof. Anselmo Cardoso de Paiva 8
Membros de Classe Classes podem declarar membros (campos e métodos) que sejam comuns a todas as instâncias, ou seja, membros compartilhados por todos os objetos da classe. Tais membros são comumente chamados de membros de classe (versus de objetos ). Em Java, declaramos um membro de classe usando o qualificador static. Daí, o nome membros estáticos usado em Java. Classes e Objetos Prof. Anselmo Cardoso de Paiva 9 Membros de Classe: Motivação Considere uma classe que precise atribuir identificadores unívocos para cada objeto. Cada objeto, ao ser criado, recebe o seu identificador. O identificador pode ser um número gerado seqüencialmente, de tal forma que cada objeto guarde o seu mas o próximo número a ser usado deve ser armazenado na classe. Classes e Objetos Prof. Anselmo Cardoso de Paiva 30
Membros de Classe: Um Exemplo Podemos criar uma classe que modele produtos que são produzidos em uma fábrica. Cada produto deve ter um código único de identificação. Classes e Objetos Prof. Anselmo Cardoso de Paiva 31 Membros de Classe: Codificação do Exemplo class Produto { static int próximo_id = 0; int id; Produto() { id = próximo_id; próximo_id++;... Classes e Objetos Prof. Anselmo Cardoso de Paiva 3
Membros de Classe: Análise do Exemplo // Considere que ainda não há nenhum produto. // Produto.próximo_id = 0 Produto lápis = new Produto(); // lápis.id = 0 // lápis.próximo_id = 1 Produto caneta = new Produto(); // caneta.id = 1 // caneta.próximo_id = Um só campo! Classes e Objetos Prof. Anselmo Cardoso de Paiva 33 Membros de Classe: Acesso Direto Como os membros estáticos são da classe, não precisamos de um objeto para acessá-los: podemos fazê-lo diretamente sobre a classe. Produto.próximo_id = 00; // O próximo produto criado terá id = 00. Classes e Objetos Prof. Anselmo Cardoso de Paiva 34
Membros de Classe: Outras Considerações Java possui apenas declarações de classes: a única forma de escrevermos uma função é como um método em uma classe. Classes e Objetos Prof. Anselmo Cardoso de Paiva 35 Membros de Classe: Análise de Caso Para prover uma biblioteca matemática, Java declara uma classe, Math, que contém apenas métodos estáticos. Exemplo: calcular a distância entre dois pontos. float dx = p1.x - p.x; float dy = p1.y - p.y; float d = Math.sqrt(dx*dx + dy*dy); Classes e Objetos Prof. Anselmo Cardoso de Paiva 36
this revisitado Nós vimos que um método estático pode ser chamado diretamente sobre a classe. Ou seja, não é necessário que haja uma instância para chamarmos um método estático. Dessa forma, não faz sentido que o this exista dentro de um método estático. Classes e Objetos Prof. Anselmo Cardoso de Paiva 37 Variáveis estáticas versus atributos Enquanto cada instância da classe (objeto) tem seus próprios atributos, variáveis estáticas (ou de classe) são compartilhadas por todas as instâncias da classe Classes e Objetos Prof. Anselmo Cardoso de Paiva 38
Exemplo: classe Contas com um gerador de números de conta prox_num = 13 Classes e Objetos Prof. Anselmo Cardoso de Paiva 39 Em Java... class ContaComGerador { private int numero; private double saldo; private static int prox_num = 1; void credito... ContaComGerador () { numero = prox_num; saldo = 0; prox_num = prox_num + 1; Classes e Objetos Prof. Anselmo Cardoso de Paiva 40
Exercício Defina uma classe para representar um candidato a uma eleição, com atributos para armazenar o nome do candidato e o número de votos, ambos privados. Defina um método de acesso para cada atributo, um método para incrementar o número de votos do candidato e um construtor para a classe que recebe como argumento o nome do candidato e inicializa o número de votos com zero. Desenvolva um programa que cria um candidato com nome de sua escolha. Em seguida, deve ser lido um nome. Se o nome lido for o do seu candidato, incrementar o contador de votos. No final, imprimir o nome do candidato e o total de votos. Classes e Objetos Prof. Anselmo Cardoso de Paiva 41 Métodos Manipulamo estado do objeto ou da classe Podem prover acesso aos campos private String name; public String getname() { return name; public void setname(string new_name) { name = new_name; Classes e Objetos Prof. Anselmo Cardoso de Paiva 4
Métodos Recebem parâmetros por valor Podem ser sobrecarregados public Produto() { id = proximo_id++; public Produto(String nome) { id = proximo_id++; this.nome = nome; Classes e Objetos Prof. Anselmo Cardoso de Paiva 43 Métodos Além de atributos, uma classe deve definir os métodos que irá disponibilizar, isto é, a sua interface. A classe Point pode, por exemplo, prover um método para mover o ponto de um dado deslocamento. Classes e Objetos Prof. Anselmo Cardoso de Paiva 44
Declaração de Método Para mover um ponto, precisamos saber quanto deslocar em x e em y. Esse método não tem um valor de retorno pois seu efeito é mudar o estado do objeto. class Point { int x, y; void move(int dx, int dy) { x += dx; y += dy; Classes e Objetos Prof. Anselmo Cardoso de Paiva 45 Envio de Mensagens: Chamadas de Método Em Java, o envio de uma mensagem é feito através de uma chamada de método com passagem de parâmetros. Por exemplo, a mensagem que dispara a ação de deslocar um ponto é a chamada de seu método move. p1.move(,); // agora p1 está deslocado de duas unidades, // no sentido positivo, nos dois eixos. Classes e Objetos Prof. Anselmo Cardoso de Paiva 46
Métodos estáticos e mensagens Da mesma forma que há variáveis estáticas (de classe) e variáveis de instância (atributos), há métodos estáticos (de classe) e métodos de instância (mensagens) Um exemplo de mensagem é o método que retorna o atributo saldo na classe Conta Mesmo que presente na mesma classe dos atributos, um método estático não tem acesso a estes Um método estático pode ser acrescentado à classe ContaComGerador para retornar o valor corrente de prox_num Classes e Objetos Prof. Anselmo Cardoso de Paiva 47 Os métodos de um programa são sempre estáticos class Maior { private static int maior (int x, int y) { if (x > y) return x; else return y; public static void main(string [] args) { int m, x, y; x = Console.readInt(); y = Console.readInt(); m = maior (x,y); System.out.println(m); Classes e Objetos Prof. Anselmo Cardoso de Paiva 48
Passagem de parâmetro Em Java, a passagem é por valor, ou seja, o valor (e não o endereço) da variável é passado. Conseqüências: - Modificações no parâmetro formal não são refletidas no parâmetro real. - Uma expressão pode ser usada como argumento - Ineficiência em alguns casos (cópia) Classes e Objetos Prof. Anselmo Cardoso de Paiva 49 Exemplo classpassagemporvalor { private static void incrementa (int x) { x = x + 1; System.out.println ( x = + x); public static void main (String [] args) { int y = 1; System.out.println( y = + y); incrementa (y); System.out.println( y = + y); Classes e Objetos Prof. Anselmo Cardoso de Paiva 50
O resultado desejado pode ser obtido assim... classpassagemporvalor { private static int incrementa (int x) { x = x + 1; System.out.println ( x = + x); return x; public static void main (String [] args) { int y = 1; System.out.println( y = + y); y = incrementa (y); System.out.println( y = + y); Classes e Objetos Prof. Anselmo Cardoso de Paiva 51 Mas a referência é passada por valor... class Referencia { private static void redefine(conta a) { Conta b = newconta( 567-8 ); a.credito(100); a = b; a.credito(100); public static void main (String [] args) { Conta c = newconta( 13-4 ); redefine (c); System.out.println(c.numero() + c.saldo()); Classes e Objetos Prof. Anselmo Cardoso de Paiva 5
Arrays Estrutura de dados que permite agrupar variáveis de um mesmo tipo Declaração <tipo> [] <lista-de-identificadores> exemplo: int [] a; Criação <identificador> = new<tipo> [<tamanho>]; exemplo: a = new int [1]; (Indexado de 0 a 11) Combinando declaração e criação <tipo> [] <identificador> = new<tipo> [<tamanho>]; exemplo: int [] a = new int [1]; Classes e Objetos Prof. Anselmo Cardoso de Paiva 53 Inicialização de arrays Arrays podem ser inicializados no momento de sua declaração: <tipo> [] <identificador> = {e1,..., en; Exemplo: a declaração String [] cores = { verde, azul, preto ; equivale a String [] cores = new String [3]; cores [0] = verde ; cores [1] = azul ; cores [] = preto ; Classes e Objetos Prof. Anselmo Cardoso de Paiva 54
Tamanho de um array Se a é um identificador de array, a.length dá o tamanho de a Exemplo: o método a seguir imprime um array de inteiros de tamanho arbitrário static void imprime (int [] a) { for (int i = 0; i < a.length; i = i + 1) System.out.println (a[i]); Classes e Objetos Prof. Anselmo Cardoso de Paiva 55 Classe de Bancos: Operações cadastro de uma nova conta crédito débito saldo transferência entre contas Classes e Objetos Prof. Anselmo Cardoso de Paiva 56
Classe de Bancos: Descrição class Banco { private Conta[] contas; private int indice = 0; void cadastro(conta c) { contas[indice] = c; indice = indice + 1; Classes e Objetos Prof. Anselmo Cardoso de Paiva 57 private Conta procura(string n) { int i = 0; boolean achou = false; while ((! achou) && (i < indice)) { if (contas[i].numero().equals(n)) achou = true; else i = i + 1; if (achou) return contas[i]; else return null; Classes e Objetos Prof. Anselmo Cardoso de Paiva 58
void debito(string num, double val) { Conta c; c = this.procura(num); if (c!= null) c.debito(val); else System.out.println("Conta inexistente!"); A operação credito é similar Classes e Objetos Prof. Anselmo Cardoso de Paiva 59 Exercício Completar a implementação da classe Banco com o construtor e os métodos transfere e saldo. Acrescente um novo método para remover uma conta Classes e Objetos Prof. Anselmo Cardoso de Paiva 60
Exercício Desenvolva um sistema simples de eleição, usando a classe já implementada para modelar um candidato. Definir uma outra classe para agrupar candidatos (usando arrays). Elabore um programa que lê um número arbitrário de nomes de candidatos e efetua a contagem; no final, indique o vencedor e o total de votos. Classes e Objetos Prof. Anselmo Cardoso de Paiva 61 Exercício Desenvolva um sistema simples para controle de estoque, contendo pelo menos as classes Produto e Estoque, e as seguintes operações: alterar as propriedades dos produtos (nome, preço, quantidade em estoque), retirar um produto do estoque, e verificar que produtos precisam ser repostos. Classes e Objetos Prof. Anselmo Cardoso de Paiva 6
Sobrecarga Um recurso usual em programação OO é o uso de sobrecarga de métodos. Sobrecarregar um método significa prover mais de uma versão de um mesmo método. As versões devem, necessariamente, possuir algo que as diferencie: tipo e/ou número de parâmetros ou tipo do valor de retorno. Classes e Objetos Prof. Anselmo Cardoso de Paiva 63 Sobrecarga de Construtores Como dito anteriormente, ao criarmos o construtor da classe Point para inicializar o ponto em uma dada posição, perdemos o construtor padrão que, não fazendo nada, deixava o ponto na posição (0,0). Nós podemos voltar a ter esse construtor usando sobrecarga. Classes e Objetos Prof. Anselmo Cardoso de Paiva 64
Sobrecarga de Construtores: Exemplo de Declaração class Point { int x = 0; int y = 0; Point() { Point(int x, int y) { this.x = x; this.y = y;... Classes e Objetos Prof. Anselmo Cardoso de Paiva 65 Sobrecarga de Construtores: Exemplo de Uso Agora temos dois construtores e podemos escolher qual usar no momento da criação do objeto. Point p1 = new Point(); // p1 está em (0,0) Point p = new Point(1,); // p está em (1,) Classes e Objetos Prof. Anselmo Cardoso de Paiva 66
Encadeamento de Construtores Uma solução melhor para o exemplo dos dois construtores seria o construtor vazio chamar o construtor que espera suas coordenadas, passando zero para ambas. Isso é um encadeamento de construtores. Java suporta isso através da construção this(...). A única limitação é que essa chamada seja a primeira linha do construtor. Classes e Objetos Prof. Anselmo Cardoso de Paiva 67 Exemplo revisitado class Point { int x, y; Point() { this(0,0); Point(int x, int y) { this.x = x; this.y = y;... Classes e Objetos Prof. Anselmo Cardoso de Paiva 68
Sobrecarga de Métodos Pode ser feita da mesma maneira que fizemos com os construtores. Quando sobrecarregamos um método, devemos manter a semântica: não é um bom projeto termos um método sobrecarregado cujas versões fazem coisas completamente diferentes. Classes e Objetos Prof. Anselmo Cardoso de Paiva 69 Sobrecarga de Métodos: Exemplo de Uso A classe Math possui vários métodos sobrecarregados. Note que a semântica das várias versões são compatíveis. int a = Math.abs(-10); // a = 10; double b = Math.abs(-.3); // b =.3; Classes e Objetos Prof. Anselmo Cardoso de Paiva 70
Critérios para Modularidade Decomposição capacidade de decompor o problema em sub-problemas (top-down). Composição capacidade de construir partes básicas que possam ser compostas para construir novos sistemas (bottom-up). Entendimento capacidade de criar módulos que facilitem o entendimento. Continuidade capacidade de absorver pequenas mudanças de especificação dentro de poucos módulos, sem ter que alterar a arquitetura. Proteção capacidade de conter situações anormais dentro dos módulos. Classes e Objetos Prof. Anselmo Cardoso de Paiva 71 Princípios de Modularidade Lingüística Modular Módulos devem corresponder a unidades sintáticas da linguagem. Poucas Interfaces Módulos devem se comunicar com o menor número possível de outros módulos. Acoplamento Fraco Se dois módulos se comunicam, eles devem trocar a menor quantidade de informações possível. Acoplamento Explícito Se dois módulos se comunicam, essa comunicação deve estar explicitamente indicada. Ocultação de Informações Toda informação sobre um módulo deve ser privada, a menos que seja explicitamente declarada pública. Classes e Objetos Prof. Anselmo Cardoso de Paiva 7
Modularidade OO No paradigma OO, um módulo, atendendo ao primeiro princípio, pode ser implementado por uma classe. Para determinarmos que classes devem ser criadas, devemos olhar os cinco critérios. Ao definirmos uma classe, devemos ter em mente os quatro demais princípios. Classes e Objetos Prof. Anselmo Cardoso de Paiva 73 Modularidade em Java: Pacotes Java provê um recurso adicional que ajuda a modularidade: o uso de pacotes. Um pacote é um conjunto de classes e outros pacotes. Pacotes permitem a criação de espaços de nomes, além de mecanismos de controle de acesso. Classes e Objetos Prof. Anselmo Cardoso de Paiva 74
Pacotes: Espaços de Nomes Pacotes, a princípio, possuem nomes. O nome do pacote qualifica os nomes de todas as classes e outros pacotes que o compõem. Exemplo: classe Math. int a = java.lang.math.abs(-10); // a = 10; Classes e Objetos Prof. Anselmo Cardoso de Paiva 75 Pacotes: Controle de Acesso Além de membros públicos e privados, temos também membros package. Um membro package só pode ser acessado por classes declaradas no mesmo pacote da classe que declara esse membro. Quando omitimos o modificador de controle de acesso, estamos dizendo que o membro é do tipo package. Classes e Objetos Prof. Anselmo Cardoso de Paiva 76
Tipos de Visibilidade (até agora) Os membros que vínhamos declarando eram do tipo package pois sempre omitimos o modificador de controle de acesso. class A { private int i; { int j;... public int k; public class B Classes e Objetos Prof. Anselmo Cardoso de Paiva 77 Implementação de Pacotes Pacotes são tipicamente implementados como diretórios. Os arquivos das classes pertencentes ao pacote devem ficar em seu diretório. Hierarquias de pacotes são construídas através de hierarquias de diretórios. Classes e Objetos Prof. Anselmo Cardoso de Paiva 78
Empacotando uma Classe Para declararmos uma classe como pertencente a um pacote, devemos: declará-la em um arquivo dentro do diretório que representa o pacote; declarar, na primeira linha do arquivo, que a classe pertence ao pacote. Classes e Objetos Prof. Anselmo Cardoso de Paiva 79 Importação de Pacotes Podemos usar o nome simples (não qualificado) de uma classe que pertença a um pacote se importarmos a classe. A importação de uma classe (ou classes de um pacote) pode ser feita no início do arquivo, após a declaração do pacote (se houver). As classes do pacote padrão java.lang não precisam ser importadas (Ex.: Math). Classes e Objetos Prof. Anselmo Cardoso de Paiva 80