Dúvida sobre Modificador de acesso protected

4 respostas
jbjares

Olá Pessoal,

Resolvendo umas questões do enthuware encontrei esta que me deixou confuso com relação ao modificador de acesso protected. Até onde eu sei o protected permiti a visibilidade de pacote ou em pacotes diferentes através da herança. Sendo que ao tentar compilar o código abaixo recebi um erro de compilação dizendo que a variavel i possui acesso protected:

Para piorar a situação adicionando static a mesma variavel o código compila e executa normalmente. Alguem faz idéia do porque disso acontecer?

//in file A.java
package p1;
public class A
{
      protected int i = 10;
      public int getI() { return i; }
}

//in file B.java
package p2;
import p1.*;
public class B extends p1.A
{
   public void process(A a)
   {
      a.i = a.i*2;
   }
   public static void main(String[] args)
   {
      A a = new B();
      B b = new B();
      b.process(a);
      System.out.println( a.getI() );
   }
}

4 Respostas

Loiane

Olá,

Na classe filha, você pode acessar os métodos e atributos da classe pai através da palavra reservada super.

Você está tentando acessar o atributo “i” de uma variável ‘externa’ “a”, ou seja, é uma variável que não pertence a classe B, apesar de você estar codificando dentro da classe B.

O que você está tentando fazer é a mesma coisa que não usar a herança:

package p2;

import p1.A;

public class C {
	
	public void process(A a)  
	 {  
		a.i = a.i*2;
	 } 

}

Para seu exemplo funcionar, você deve criar um método setI na classe A e modificar o seu código no método process:

public class B extends A{

	 public void process(A a)  
	 {  
	       a.setI(super.i*2);
	 }  
	    public static void main(String[] args)  
	    {  
	       A a = new B();  
	       B b = new B();  
	      b.process(a);  
	       System.out.println( a.getI() );  
	    } 

}
Loiane

Segue um outro exemplo que se comporta do mesmo jeito:

package p1;

public class D {
	
	protected int num;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}
}
package p2;

import p1.A;
import p1.D;

public class B extends A{

	 public void process(D d)  
	 {  
	       d.setNum(super.i*2);
	 }  
	    public static void main(String[] args)  
	    {  
	       D d = new D();  
	       B b = new B();  
	      b.process(d);  
	       System.out.println( d.getNum() );  
	    } 

}
B

Na verdade, sempre que vc fizer acesso a um método ou variável com modificador de acesso "protected" apartir de um outro pacote, vc deve sempre referenciar o objeto à subclasse.

Assim o código compila normalmente:

//in file A.java  
 package p1;  
 public class A  
 {  
       protected int i = 10;  
       public int getI() { return i; }  
 }  
   
 //in file B.java  
 package p2;  
 import p1.*;  
 public class B extends p1.A  
 {  
    public void process(B a)  
    {  
       a.i = a.i*2;  
    }  
    public static void main(String[] args)  
    {  
       B a = new B();  
       B b = new B();  
       b.process(a);  
       System.out.println( a.getI() );  
    }  
 }
jbjares

Cara Loiane e brrodo,
100% a explicação. Muito Obrigado!

Criado 15 de março de 2009
Ultima resposta 15 de mar. de 2009
Respostas 4
Participantes 3