O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Java 08 Modificadores Acesso E Membros De Classe

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Próximos SlideShares
Java: Heranca e polimorfismo
Java: Heranca e polimorfismo
Carregando em…3
×

Confira estes a seguir

1 de 32 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Quem viu também gostou (20)

Anúncio

Semelhante a Java 08 Modificadores Acesso E Membros De Classe (20)

Mais de Regis Magalhães (20)

Anúncio

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

×