Modificadores de Acesso para Membros de Classes


É possível aplicar modificadores a membros de classe, métodos e variáveis de instância (variáveis globais). Esses modificadores podem ser de acesso e não-acesso, da mesma forma que ocorre com as classes. Aqui iremos tratar dos modificadores de acesso.
Métodos e variáveis de instância são membros de classe e são tratados com modificadores de acesso da mesma maneira. Enquanto as classes só podem usar dois controles de acesso (default e public), membros de classe podem usar todos os quatro: default, public, protected, e private.
Existem duas questões de acesso diferentes: se uma classe pode acessar um membro de outra classe, e se uma subclasse pode herdar o membro de uma superclasse.
O primeiro tipo de acesso ocorre quando em uma classe um método instancia outra classe e tenta acessar métodos ou variáveis desta. O segundo tipo de acesso ocorre quando uma subclasse herda de uma superclasse e passa a ter acesso aos seus membros diretamente, ou seja, sem ter que instanciar a superclasse dentro de um método.

Membros públicos:

Quando um método ou variável de instância é declarado como public, significa que todas as outras classes, independente de pacote, podem acessar esse membro.

Membros privados:

Métodos e variáveis marcadas como private só podem ser acessados pela classe na qual foram declarados; outras classes não acessam membros privados nem por herança, nem por instância.

Membros protegidos e default:

Os controles de acesso protected e default são quase idênticos. Os dois só podem ser acessados por classes do mesmo pacote por meio da instanciação, com a diferença de que membros protected também podem ser acessados por classes de outros pacotes através de herança; ou seja, membros default e protected diferem apenas quando se trata de subclasses.
Mesmo que aconteça de uma classe conseguir instanciar uma outra classe que possua membros protegidos e esteja em um pacote diferente, ela não conseguirá acessar esses membros através da instanciação, apenas por herança (com a chamada explícita do método).


package geracao1;

public class Pai {

      public String nome;
     
      protected int cod;
     
      private void ensinar() { }
     
      protected void educar() { }
           
}



package geracao2;

import geracao1.Pai;

/* encontra-se em um pacote diferente da sua
 * superclasse */
public class Filho extends Pai {

      public void aprender() {
            // membro público de Pai
            String var = nome;
           
            /* n possui acesso a esse membro default,
             * pois estão em pacotes diferentes */
            int codPai = cod;
           
            /* não possui acesso a esse membro porque
             * trata-se de um membro private de Pai */
            ensinar();
           
            /* consegue acessar esse membro protected
             * de Pai por herança,apesar de estarem 
             * em pacotes diferentes */
            educar();
           
            Pai pai = new Pai();
           
            /* não consegue acessar esse membro
 * protected de Pai por instanciação 
 * porque estão em pacotes diferentes */
            pai.educar();
      }
     
}


Observação1: modificadores de acesso não são aplicados a variáveis locais; de fato, apenas o modificador de não-acesso final pode ser aplicado a variáveis locais.



Fonte: SCJP Sun Certifi ed Programmer for Java 6 Study Guide

0 comentários:

Postar um comentário