Protected

8 respostas
marcelpinheiro

Iae galera. Seguinte, pesquisando aqui no forum, li alguns topicos em relação ao modificador Protected mas ainda não intendi direito. Até onde eu sei, o modificador Protected dá acesso ás classes de seu próprio pacote e também às suas filhas, certo? Então por que meu exemplo não funciona?

package pacotedois;

public class TesteDois {
	
	 protected int x = 4;
		
	
	}
package pacoteum;
import pacotedois.TesteDois;


public class TesteUm extends TesteDois{
	public static void main(String[] args) {
		 pacotedois.TesteDois testedois = new TesteDois();
		 
		 System.out.println(testedois.x);
		
	}
	 	  
}

Se eu mudo minha variável x para public, ai funciona beleza. Mas se o Protected vale para classes do mesmo pacote E também para suas classes filhas, por que meu exemplo não roda?

8 Respostas

eldercrul

Se não me engano protected só libera acesso para a própria classe e suas subclasses,
não para as outras classes do pacote

" Métodos e atributos declarados como protected possuem um nível intermediário de
proteção. Um membro protected é como um membro private, exceto pelo fato de
que ele pode ser acessado pelas classes derivadas de uma superclasse. Cada vez que
deseja-se utilizar algum método da superclasse, utiliza-se a palavra-chave super
seguida pelo operador ponto (. )." JAVA MAGAZINE http://www.unesp.br/gs/treinamento/java/guj-oop.pdf

Lavieri

não funciona pq o método main é static....

tente fazer...

public class TesteUm extends TesteDois{   
    public static void main(String[] args) {  
         TesteDois td = new TesteDois();
         pacotedois.TesteDois testedois = new TesteDois();   
           
         System.out.println(testedois.getX());   
           
    }
    
    public int getX() {
         return super.x;
    }
}
thiago.correa

Lavieri não é porque é static. é porque ele está tentando acessar por referência, e não por herança

taaqui

Subclasse em outro pacote SOMENTE pode ter acesso ao atributo protected por herança (extends etc).

public class TesteUm extends TesteDois{  
        public static void main(String[] args) {  
             TesteDois testedois = new TesteDois();  
               
             System.out.println(testedois.x);  
             
       }  
               
   }
marcelpinheiro

Então cara, está exatamente desta forma que vc postou meu codigo. Mas ao imprimir o TesteDois.x, ele nao compila, diz que a variavel não está visivel. Obs: a variavel x está como protected na classe TesteDois.

Jauns
Da uma olhada http://www.guj.com.br/posts/list/118851.java#643612

Passe o acesso por Get e Set no TesteDois

package pacotedois;

public class TesteDois {

	protected int x = 4;

	public void setX(int x) {
		this.x = x;
	}

	public int getX() {
		return x;
	}
}
System.out.println(testedois.getX());
L.Bach

A resposta é a que os colegas falaram anteriormente: valores protected só são acessados fora do pacote via herança.

marcelpinheiro

Galera, finalmente eu entendi sobre acessar por herança e nao por referencia ueahheauea. Desta forma, o codigo correto sera:

public class TesteUm extends TesteDois{
	public static void main(String[] args) {
		 
		 TesteUm testeum = new TesteUm();
		 
		 System.out.println(testeum.x);
Valeu a força!
Criado 2 de março de 2009
Ultima resposta 3 de mar. de 2009
Respostas 8
Participantes 7