Baixe o app para aproveitar ainda mais
Prévia do material em texto
22/4/14 1 Estrutura geral de uma classe Introdução a Programação II BCC – DEINFO – UFRPE sidney.ufrpe@gmail.com Até agora • Definimos classes sem atributos – Apenas método main • A maior utilidade das classes é definir seus atributos e o comportamento de objetos Forma geral para uma classe pública • Nome da classe igual ao nome do arquivo .java // lista de imports public class NomeDaClasse { // declaração de atributos // declaração de métodos } Classe • Tipo para objetos • Define variáveis (atributos) e operações (métodos) dos objetos • Exemplo: Classe Conta na representação gráfica (UML) Conta numero : String saldo: double creditar(double valor) debitar(double valor) Objeto • Instância (exemplo) de uma classe • Possui valor para cada atributo (variáveis de instância) • Exemplo: Objetos do Tipo Conta na representação gráfica c1 : Conta numero = “1246-‐8” saldo = 400.50 creditar(...) debitar(...) c2 : Conta numero = “9654-‐3” saldo = 780.50 creditar(...) debitar(...) Objeto c1 Objeto c2 Estado de um objeto • Valor variáveis (ou atributos) de um objeto em dado instante c1 : Conta numero = “1246-8” saldo = 400.50 ... c1 : Conta numero = “1246-8” saldo = 300.50 ... c1.debitar(100) Estado antes Estado depois 22/4/14 2 Atributos da classe • Definem as variáveis dos objetos (instâncias) • Possuem valor padrão caso nenhum seja definido • Possuem um tipo de acesso definido: – Public – Private – Protected – Default (quando nenhum é definido) Classe Conta public class Conta { public String numero; public double saldo; // métodos } Definindo atributos tipoAcesso tipo nome = valorInicial; public ou private (mais comuns) Opcional Classe Conta • Criando objeto do tipo conta e mudando seus atributos Conta c1 = new Conta(); c1.numero = “1”; c1.saldo = 100; Construtor • Método usado para criar instâncias da classe – Tem o mesmo nome da classe – Usado após a palavra new • O construtor que não recebe parâmetros é chamado de construtor padrão – Se nenhum é definido o compilador cria um padrão • Uma classe pode ter mais de um construtor Construtor padrão para a Classe Conta public class Conta { public String numero; public double saldo; // métodos } public Conta() { numero = null; saldo = 0; } 22/4/14 3 Valor padrão para atributos • De tipo primitivo: – numérico é 0 – booleano é igual a false • De tipo de referência é null • Exemplo: ao criar uma Conta com o construtor padrão número = null e saldo = 0.0; Definindo construtor para Conta public class Conta { public String numero; public double saldo; public Conta(String num, double s) { numero = num; saldo = s; } // outros métodos } Definindo construtor para Conta • Passando parâmetros para o construtor definido para Conta Conta c1 = new Conta(“1246-8”, 400.5); Conta c2 = new Conta(“9654-3”, 780.5); Construtor da Classe Conta • Usando this no construtor de Conta public class Conta { // atributos public Conta(String numero, double saldo) { this.numero = numero; this.saldo = saldo; } } this • Referência que aponta para o próprio objeto • Útil para remover ambiguidades – Ex: definir se uma variável é parâmetro do método ou atributo da classe • Facilita a leitura do código Exercício: • Algum outro construtor pode ser útil para a Classe Conta? • Qual seria o construtor de uma Classe Endereco que possui atributos do tipo string para rua, cidade e estado? 22/4/14 4 Escondendo atributos • Os atributos Saldo e número estão “abertos” (public) portanto podem ser modificados por outras classes – Ex: é possível mudar o número a qualquer momento • Information hiding – Princípio de projeto OO que esconde os detalhes internos da classe – Utiliza métodos para controlar o acesso aos atributos Escondendo atributos • Tornando atributos da classe conta privativos public class Conta { private String numero; private double saldo; public Conta(String numero, double saldo) {...} } Métodos • Definem as formas de interagir com os objetos de um tipo • Interface da classe • Exemplo: • Interface de uma conta: debitar, creditar, etc • Interface de um carro: acelerar, freiar, etc Métodos debitar e creditar public class Conta { // atributos privativos // método construtor public void debitar(double valor) { this.saldo = this.saldo - valor; } public void creditar(double valor) { this.saldo = this.saldo + valor; } // métodos get e set } Métodos • Idealmente, toda mudanças em um objeto devem ser feita através de seus métodos (interface) • Exemplos: 1. para colocar o velocímetro de um carro em 100 km/ h é preciso acelerar 2. não posso mudar o saldo de uma conta sem colocar ou tirar dinheiro public vs private • Regra padrão: – atributos private – métodos public • Quando necessário outros modificadores podem ser usados – Default (classes no mesmo pacote podem acessar) – Protected (subclasses podem acessar) 22/4/14 5 Métodos de acesso (get/set) • Boa prática de programação para controlar mudança nos atributos – Essenciais para atributos privativos • Método get permite leitura no atributo – Ex: getNumero • Método set permite atualização do atributo – Ex: setSaldo Get/set para Classe Conta public class Conta { // atributos, construtor, debitar, creditar public String getNumero() { return this.numero; } public void setSaldo(double saldo) { if (saldo > 0) this.saldo = saldo; } public double getSaldo() { return this.saldo; } } Atenção quando programar! • Variável de Tipo Primitivo vs Tipo Referência • Acesso a ponteiro nulo • Comparação de referência vs comparação de conteúdo Acesso à referência nula • Boa prática: inicializar todas as variáveis de referência • Invocar um método de uma referência nula (null) resulta em erro de execução que interrompe o programa Conta c; c.debitar(10); Levanta a exceção NullPointerExcepMon Tipo primitivo vs Tipo referência int num = 2; int num2 = num; 2 2 num num2 c1, c2: Conta numero = “1” ... ... c1 c2 • Primitivo: atribuição copia o valor • Referência: atribuição copia a referência Conta c1 = new Conta(“1”,0); Conta c2 = c1; Comparação entre objetos • Deve ser feita sempre usando o método equals • Exemplo: comparação entre contas c1 e c2 c1.getNumero() == c2.getNumero() c1.getNumero().equals( c2.getNumero()) Comparando referências Comparando conteúdos
Compartilhar