É 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