quarta-feira, 27 de agosto de 2008

Declarando membros de classes - Parte 2

No post anterior nós estudamos sobre membros públicos. Vimos que eles são acessíveis a partir de qualquer classe. Neste post iremos estudar sobre os níveis protected e default. Isso porque eles são muito parecidos. E você vai notar rapidamente a diferença entre eles.

O nível default pode ser entendido como um nível de acesso de pacotes. Isso quer dizer que se você declarar um membro como default (na verdade você não vai colocar o modificador, lembra?) somente as classes que estiverem dentro do mesmo pacote que a sua terão acesso ao membro. Vamos pegar o exemplo anterior e retirar o modificador das variáveis de instância:


Animal.java
//Classe public diz que todos vão enxergá-la
public class Animal {
//Membro (variável) default
//somente classes do mesmo pacote
//poderão acessar o membro.
String nome;
}

Gato.java

public class Gato extends Animal {
String raça;

public void mostrarNome(){
System.out.println(nome); //pode?
}

}

package javeiro;
Exercicio1.java
public class Exercicio1 {

public static void main(String arg[]){
Gato g = new Gato();
g.nome = "Garfield"; //e aqui?
g.raça = "preguiçoso"; //aqui também né?
}
}

O método mostrarNome numa primeira olhada parece fazer uma operação ilegal tentando exibir a variável nome, que é de Animal e está marcada como default. Porém não há problemas, pois as classes Animal e Gato estão no mesmo pacotes, isso significa que além de herdar os membros públicos, gato também herda os membros default, nós veremos mais adiante que é possível fazer uma classe herdar os membros default de uma classe que está em outro pacote. Já a classe Exercicio1 não será compilada com sucesso. O compilador irá dizer que não conhece a propriedade nome e muito menos raça do objeto gato. Por que isso acontence? Exatamente isso que você pensou, Exercicio1 está em um pacote diferente da classe Gato, e isso faz com ela possa acessar somente os membros públicos dela.

Membros protegidos (protected)

O nível protected é muito parecido com o nível default. A diferença básica é que os membros protegidos podem ser acessados por classes de pacotes diferentes, desde que estas sejam subclasses da sua classe. As outras regras são iguais, ou seja, os membros protegidos só podem ser acessados por classes que estão dentro do mesmo pacote (com a exceção que falamos antes). O exemplo que faremos irá elucidar as dúvidas que possam ter resistidos:


Animal.java
package javeiro.pacote1;
//Classe public diz que todos vão enxergá-la
public class Animal {
//Membro (variável) protected
//somente classes do mesmo pacote
//e subclasses poderão acessar o membro.
protected String nome;
}

Gato.java
package javeiro.pacote2;
import javeiro.pacote1.Animal;

public class Gato extends Animal {
protected String raça;

public void mostrarNome(){
System.out.println(nome); //herdou nome
}

}

package javeiro;
Exercicio1.java
public class Exercicio1 {

public static void main(String arg[]){
Gato g = new Gato();
g.nome = "Garfield"; //não pode
g.raça = "preguiçoso"; //não pode
}
}

Temos aqui algo muito parecido com a versão anterior onde tínhamos os membros default. A diferença pode ser nota na classe Gato, que faz um acesso ao membro nome mesmo este sendo protected (deveria ser acessado por classes do mesmo pacote), porém membros protected são acessíveis por classes de outros pacotes através de herança. Já a classe Exercicio1 não compilará, pois está tentando fazer acesso a duas variáveis protegidas de classes de outros pacotes (Animal e Gato).
Então não esqueça:
  • DEFAULT -> Permite acesso aos seus membros SOMENTE às classes do mesmo pacote.
  • PROTECTED -> Permite acesso aos seus membros às classes do mesmo pacote e às classes de outros pacotes através de HERANÇA.
Até o nosso próxim post!

Nenhum comentário:

Postar um comentário