Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java 08 Modificadores Acesso E Membros De Classe

11,680 views

Published on

  • Be the first to comment

Java 08 Modificadores Acesso E Membros De Classe

  1. 1. Modificadores de Acesso e Membros de Classe <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>
  2. 2. Modificadores de Acesso ou de Visibilidade class Conta { int numero ; String dono ; double saldo ; double limite ; // .. void saca( double quantidade) { if (quantidade <= this . saldo ) this . saldo = this . saldo - quantidade; } }
  3. 3. Modificadores de Acesso ou de Visibilidade class TestaContaEstouro2 { public static void main(String args[]) { Conta minhaConta = new Conta(); minhaConta. limite = 100; minhaConta. saldo = -200; } }
  4. 4. Modificadores de Acesso ou de Visibilidade <ul><ul><li>A melhor forma de resolver isso seria forçar quem usa a classe Conta a chamar o método saca e não permitir o acesso direto ao atributo. </li></ul></ul><ul><ul><li>Para fazer isso no Java basta declarar que os atributos não podem ser acessados de fora da classe usando a palavra chave private : </li></ul></ul>class Conta { private int numero ; private String dono ; private double saldo ; private double limite ; // .. }
  5. 5. Modificadores de Acesso ou de Visibilidade <ul><ul><li>private é um modificador de acesso (também chamado de modificador de visibilidade). </li></ul></ul><ul><ul><li>Marcando um atributo como privado, fechamos o acesso ao mesmo de todas as outras classes. </li></ul></ul><ul><ul><li>É uma prática quase que obrigatória proteger seus atributos como private . </li></ul></ul><ul><ul><li>Quem chama o método saca não precisa saber que há um limite que está sendo checado. Quem for usar essa classe basta saber o que o método faz, e não como ele faz. </li></ul></ul><ul><ul><li>Sempre devemos expor o mínimo possível de funcionalidades, para criar um baixo acoplamento entre as classes. </li></ul></ul>
  6. 6. Modificadores de Acesso ou de Visibilidade <ul><ul><li>A palavra chave private também pode ser usada para modificar o acesso a um método. </li></ul></ul><ul><ul><li>Isso é usado quando existe um método apenas auxiliar à própria classe, e não queremos que outras pessoas o usem. </li></ul></ul><ul><ul><li>Há também o modificador public , que permite a todos acessarem um determinado atributo ou método. </li></ul></ul><ul><ul><li>É muito comum que atributos sejam private , e quase todos os métodos sejam public (não é uma regra!). </li></ul></ul><ul><ul><ul><li>Assim, toda conversa de um objeto com outro é feita por troca de mensagens, isso é, acessando seus métodos. </li></ul></ul></ul>
  7. 7. Modificadores de Acesso ou de Visibilidade <ul><ul><li>Quando precisarmos mudar como é realizado um saque na classe Conta , só é preciso modificar o método saca . </li></ul></ul><ul><ul><li>Se, por exemplo, quisermos cobrar CPMF de cada saque, basta modificar ali. </li></ul></ul>
  8. 8. Modificadores de Acesso ou de Visibilidade <ul><ul><li>Utilizados para garantir o encapsulamento em Java </li></ul></ul><ul><ul><li>Podem ser aplicados tanto a classes quanto a seus membros (atributos e métodos) individualmente </li></ul></ul><ul><ul><li>Java possui os seguintes modificadores de visibilidade </li></ul></ul><ul><ul><ul><li>public É visível em qualquer lugar. </li></ul></ul></ul><ul><ul><ul><li>protected Só é visível na mesma classe e em suas subclasses. </li></ul></ul></ul><ul><ul><ul><li>package Default. Só é visível em classes do mesmo pacote. Não existe modificador com este nome. A ausência de modificador o torna package. </li></ul></ul></ul><ul><ul><ul><li>private Só é visível dentro da mesma classe. </li></ul></ul></ul>
  9. 9. Modificadores de Acesso ou de Visibilidade <ul><li>Dicas </li></ul><ul><ul><li>Use public apenas para métodos e constantes que formam parte da API pública da classe. </li></ul></ul><ul><ul><li>É prática comum tornar campos não-public e encapsulá-los com métodos de acesso public . </li></ul></ul><ul><ul><li>Utilize protected para atributos e métodos que não são necessários para quem usa a classe, mas que podem ser úteis para quem cria uma subclasse como parte de um outro pacote </li></ul></ul><ul><ul><li>Use o modificador de visibilidade padrão ( package ) para atributos e métodos que você deseja esconder dentro de um pacote. </li></ul></ul><ul><ul><li>O modificador de visibilidade private deve ser usado para atributos e métodos que são disponibilizados apenas dentro da própria classe onde são definidos. </li></ul></ul>
  10. 10. Encapsulamento <ul><li>Encapsular </li></ul><ul><ul><li>Esconder membros de uma classe. </li></ul></ul><ul><ul><li>Esconder como funcionam as rotinas (no caso métodos) do nosso sistema. </li></ul></ul><ul><li>Para que? </li></ul><ul><ul><li>Para diminuir o acoplamento e assim: </li></ul></ul><ul><ul><ul><li>Facilitar alterações na aplicação. </li></ul></ul></ul><ul><ul><ul><ul><li>Uma regra de negócio só precisa ser modificada em um único lugar. </li></ul></ul></ul></ul><ul><ul><ul><li>Facilitar o aprendizado, pois o mínimo de funcionalidades é exposta e requer aprendizado. </li></ul></ul></ul>
  11. 11. Encapsulamento
  12. 12. Encapsulamento <ul><ul><li>Serve para ocultar os dados. </li></ul></ul><ul><ul><li>Evita que o usuário acesse membros que ele não precisa manipular. </li></ul></ul><ul><ul><ul><li>Proteção do código </li></ul></ul></ul><ul><ul><li>Permite a modificação interna de uma classe sem alterar a sua funcionalidade e o modo como é acessada. </li></ul></ul><ul><ul><ul><li>Separação clara entre o serviço oferecido e a forma como é implementado. </li></ul></ul></ul><ul><ul><li>Possibilita a disponibilização de uma API mais clara e enxuta aos usuários da classe. </li></ul></ul><ul><ul><li>Utilizado em Java através dos modificadores de visibilidade. </li></ul></ul>
  13. 13. Interface <ul><ul><li>O conjunto de métodos públicos de uma classe é também chamado de interface da classe , pois esta é a única maneira a qual você se comunica com objetos dessa classe. </li></ul></ul><ul><ul><li>Programar voltado para a interface e não para a implementação. </li></ul></ul><ul><ul><ul><li>É sempre bom programar pensando na interface da sua classe, como seus usuários estarão utilizando ela, e não somente como ela irá funcionar. </li></ul></ul></ul><ul><ul><ul><li>A implementação não tem tanta importância para o usuário, uma vez que ele só precisa saber o que cada método pretende fazer, e não como ele faz, pois isto pode mudar com o tempo. </li></ul></ul></ul>
  14. 14. Interface - Exemplos <ul><li>Dirigir um carro </li></ul><ul><ul><li>Motor a álcool, gasolina, diesel, ... </li></ul></ul><ul><li>Usar um celular </li></ul><ul><ul><li>GSM, TDMA, ... </li></ul></ul>
  15. 15. Encapsulamento public class Cliente { private String nome ; private String endereco ; private String cpf ; private int idade ; public void mudaCPF(String cpf) { validaCPF(cpf); this . cpf = cpf; } private void validaCPF(String cpf) { // Regras aqui, falha caso nao seja válido } // .. }
  16. 16. Getters e Setters <ul><ul><li>Para permitir o acesso aos atributos (já que eles são private ) de uma maneira controlada, a prática mais comum é de criar dois métodos, um que retorna o valor e outro que muda o valor. </li></ul></ul><ul><ul><li>O padrão para esses métodos é de colocar a palavra get ou set antes do nome do atributo. </li></ul></ul><ul><ul><li>O padrão do método get não vale para as variáveis de tipo boolean. </li></ul></ul><ul><ul><ul><li>Esses atributos são acessados via is e set . </li></ul></ul></ul><ul><ul><ul><li>Exemplo: para verificar se um carro está ligado seriam criados os métodos isLigado e setLigado . </li></ul></ul></ul>
  17. 17. Getters e Setters public class Conta { private double saldo ; private Cliente dono ; public Cliente getDono() { return dono ; } public void setDono(Cliente dono) { this . dono = dono; } public double getSaldo() { return saldo ; } public void setSaldo( double saldo) { this . saldo = saldo; } }
  18. 18. JavaBeans <ul><ul><li>Um JavaBean é um componente reutilizável que tem como finalidade representar um modelo de dados. </li></ul></ul><ul><ul><ul><li>Define convenções para que atributos de dados sejam tratados como &quot;propriedades&quot;. </li></ul></ul></ul><ul><ul><ul><li>Permite manipulação de suas propriedades, ativação de eventos, etc. através de um framework que reconheça as convenções utilizadas. </li></ul></ul></ul><ul><ul><li>Basicamente, um JavaBean é uma classe Java qualquer, que tem as seguintes características: </li></ul></ul><ul><ul><ul><li>Construtor público default (sem argumentos) </li></ul></ul></ul><ul><ul><ul><li>Atributos de dados private . </li></ul></ul></ul><ul><ul><ul><li>Métodos de acesso (acessors / getter) e/ou de alteração (mutators / setter) para cada atributo usando a convenção get Propriedade () ou is Propriedade () (boolean) e set Propriedade () . </li></ul></ul></ul>
  19. 19. JavaBeans <ul><li>Exemplo: </li></ul>
  20. 20. Membros de classe <ul><li>Problema: </li></ul><ul><ul><li>Controlar a quantidade de contas instanciadas. </li></ul></ul><ul><li>Soluções: </li></ul><ul><ul><li>Simples, mas problemática: </li></ul></ul><ul><ul><ul><li>Conta c = new Conta(); </li></ul></ul></ul><ul><ul><ul><li>totalDeContas = totalDeContas + 1; </li></ul></ul></ul><ul><ul><li>Atributo totalizador: </li></ul></ul>public class Conta { private int totalDeContas ; // ... public Conta() { this . totalDeContas = this . totalDeContas + 1; } }
  21. 21. Atributos de classe <ul><li>Problema do atributo totalizador: </li></ul><ul><ul><li>Cada objeto tem o seu e aí não se sabe o total de objetos instanciados. </li></ul></ul><ul><ul><ul><li>O atributo totalDeContas de todas as contas terá a valor 1 e o problema inicial não foi resolvido. </li></ul></ul></ul><ul><li>E agora? O que fazer? </li></ul><ul><ul><li>A solução seria ter um atributo que fosse compartilhado por todas as instâncias da classe Conta. </li></ul></ul><ul><ul><li>Para fazer isso em Java, declaramos a variável como static . </li></ul></ul>private static int totalDeContas;
  22. 22. Atributos de classe public class Conta { private static int totalDeContas ; // ... public Conta() { Conta. totalDeContas = Conta. totalDeContas + 1; } public int getTotalDeContas() { return Conta. totalDeContas ; } } <ul><li>Como saber quantas contas existem? </li></ul>Conta c = new Conta(); int total = c.getTotalDeContas();
  23. 23. Métodos de classe <ul><li>E como saber quantas contas temos, sem ser via objeto instanciado? </li></ul><ul><ul><li>Criando um método de classe. </li></ul></ul><ul><ul><li>Usando o método em outra classe: </li></ul></ul>public class Conta { private static int totalDeContas ; // ... public Conta() { Conta. totalDeContas = Conta. totalDeContas + 1; } public static int getTotalDeContas() { return Conta. totalDeContas ; } } // ... int total = Conta.getTotalDeContas(); // ...
  24. 24. Membros de classe <ul><ul><li>Métodos e atributos estáticos só podem acessar outros métodos e atributos estáticos da mesma classe, pois dentro de um método estático não temos acesso a referência “this”, pois um método estático é chamado através da classe, e não de um objeto. </li></ul></ul><ul><ul><li>Usar static significa programar semelhante à programação estruturada, porém muitas vezes é necessário. </li></ul></ul>
  25. 25. Membros de instância e membros de classe <ul><li>Membros de instância </li></ul><ul><ul><li>Cada objeto instanciado tem membros de instância alocados para si. </li></ul></ul><ul><ul><li>Membros de instância só podem ser usados através de objetos. </li></ul></ul><ul><li>Membros de classe ou estáticos </li></ul><ul><ul><li>Existe apenas uma única cópia de um membro de classe associado a uma determinada classe. </li></ul></ul><ul><ul><li>Não são replicados quando novos objetos são instanciados. </li></ul></ul><ul><ul><li>Podem ser usados através da classe, independente da instanciação de objetos. </li></ul></ul><ul><ul><li>Declarados com a palavra chave static antes da declaração usual de um membro. </li></ul></ul>
  26. 26. Membros de classe ou estáticos <ul><li>Atributos de classe </li></ul><ul><ul><li>Variável única, compartilhada por todos os objetos da classe. </li></ul></ul><ul><li>Métodos de classe </li></ul><ul><ul><li>Preferivelmente invocados usando o nome da classe e não através de instâncias da classe. </li></ul></ul><ul><ul><ul><li>String cpf = Formatador .formataCPF(cpfNaoFormatado); </li></ul></ul></ul><ul><ul><li>Não podem utilizar a referência this . </li></ul></ul><ul><ul><li>Não podem acessar nenhum atributo ou método de instância. </li></ul></ul><ul><li>Declaração </li></ul><ul><ul><li>Atributo de instância: private String nome; </li></ul></ul><ul><ul><li>Método de instância: public String getNome() {...} </li></ul></ul><ul><ul><li>Atributo de classe: private static int contador; </li></ul></ul><ul><ul><li>Método de classe: public static String formataCPF() {...} </li></ul></ul>
  27. 27. Sobrecarga de Métodos <ul><li>Métodos com mesmo nome </li></ul><ul><ul><li>Em Java, métodos podem ter o mesmo nome desde que não sejam ambíguos, isso é, que exista uma maneira de distinguir no momento da chamada. </li></ul></ul><ul><ul><li>Isso se chama sobrecarga de método (overloading). </li></ul></ul><ul><ul><li>Não confundir com sobrescrita (overriding), que é um conceito completamente diferente envolvendo herança. </li></ul></ul>
  28. 28. Sobrecarga de Métodos <ul><li>Um objeto pode possuir métodos definidos com o mesmo nome </li></ul><ul><ul><li>Métodos devem possuir nomes fáceis para que programadores possam entender e dar manutenção </li></ul></ul><ul><ul><li>Métodos com finalidades semelhantes devem possuir nomes semelhantes ou iguais </li></ul></ul><ul><li>A distinção é feita através da lista de parâmetros </li></ul><ul><ul><li>Cada método deve possuir uma lista única de parâmetros </li></ul></ul><ul><ul><li>A ordem dos tipos dos parâmetros é suficiente para identificar um método </li></ul></ul><ul><ul><ul><li>Essa abordagem não é recomendada por causar maiores dificuldades durante o uso e manutenção </li></ul></ul></ul>
  29. 29. Sobrecarga de Métodos <ul><li>Exemplo </li></ul>
  30. 30. Constantes <ul><ul><li>A palavra reservada final geralmente quer dizer “ Isto não pode ser alterado ou só pode ser alterado em sua inicialização ”. </li></ul></ul><ul><ul><li>Normalmente evita-se mudanças em um membro por duas razões: projeto ou eficiência . </li></ul></ul><ul><ul><li>Constantes são usadas em duas situações: </li></ul></ul><ul><ul><ul><li>Constante em tempo de compilação que nunca será mudada. </li></ul></ul></ul><ul><ul><ul><li>Inicializada em tempo de execução e depois disso não mais alterada. </li></ul></ul></ul><ul><ul><li>Declaradas com a palavra chave final antes da declaração usual de um atributo. </li></ul></ul><ul><ul><li>static final : local de armazenamento único que não pode ser alterado. </li></ul></ul><ul><ul><li>final com tipos primitivos : torna o valor constante . </li></ul></ul><ul><ul><li>final com objetos : torna a referência constante , não podendo mais apontar para outro objeto. No entanto, o objeto pode ser alterado. </li></ul></ul><ul><ul><li>Não é possível definir um objeto constante, a não ser sua classe seja escrita de modo a evitar alterações. </li></ul></ul>
  31. 31. Constantes <ul><ul><li>Modo típico de declarar uma constante: </li></ul></ul><ul><ul><ul><li>public static final <tipo> NOME_DA_CONSTANTE; </li></ul></ul></ul><ul><ul><li>Por convenção, tipos primitivos static final (constantes em tempo de compilação) são nomeados com caixa alta e com as palavras separadas por underline. </li></ul></ul><ul><ul><ul><li>public static final int VAL_UM = 39; </li></ul></ul></ul><ul><ul><li>Existem constantes static final em tempo de execução: </li></ul></ul><ul><ul><ul><li>public static final int val_dois = rand.nextInt(20); </li></ul></ul></ul><ul><ul><li>Argumento final : a referência para onde o argumento aponta não pode ser alterada. </li></ul></ul><ul><ul><ul><li>void testeFinal(final Loja l) { </li></ul></ul></ul><ul><ul><ul><li>l = new Loja(); // Ilegal -- g é final </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
  32. 32. Exercício

×