Protected

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?

[code]package pacotedois;

public class TesteDois {

 protected int x = 4;
	

}[/code]

[code]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);
	
}

}[/code]

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?

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

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

tente fazer…

[code]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;
}

} [/code]

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

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

[code] public class TesteUm extends TesteDois{
public static void main(String[] args) {
TesteDois testedois = new TesteDois();

         System.out.println(testedois.x);  
         
   }  

}
[/code]

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.

Passe o acesso por Get e Set no TesteDois

[code]
package pacotedois;

public class TesteDois {

protected int x = 4;

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

public int getX() {
	return x;
}

}[/code]

		 System.out.println(testedois.getX());

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

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

[code]public class TesteUm extends TesteDois{
public static void main(String[] args) {

	 TesteUm testeum = new TesteUm();
	 
	 System.out.println(testeum.x);[/code]

Valeu a força!