Enums 'aninhadas' + protected + subclasse externa

classe mãe

[code]package br.com.ocjp.protegido;

import java.io.IOException;

public class ClasseMae implements InterfaceFilha {

protected enum minhasEnums {OPA, QUE_LEGAL}

}[/code]

classe filha

[code]package br.com.ocjp.protegido2;

import br.com.ocjp.protegido.ClasseMae;

public class ClasseFilha extends ClasseMae {

public void imprimeAtributo(){
	System.out.println(ClasseMae.minhasEnums.OPA);
}

}[/code]

eu posso acessar ENUMS Protegidas dessa forma?

Sem problemas.

O atributo enum esta definido como protected, sendo assim apenas suas classes filhas mesmo é que poderão acessa-lo.

sim, já que os atributos protected são visiveis as subclasses, e ClasseFilha extende ClasseMae.

mas eu acessei diretamente… e estou em outro pacote

Sim, você acessou diretamente… porém de dentro de uma classe filha, portanto você vai ter acesso ao atributo. Também funcionaria: ClasseFilha.attributo

[]'s

Isso mesmo, como macafe disse, você tem acesso de dentro de uma classe filha. Qualquer membro da superclasse definido como protected, independente do pacote, é visível apenas as suas classes filhas.

mas pessoal… eu acessei DIRETAMENTE… subclasses(de outro pacote) so tem acesso aos atributos da superclasse através de herança…
E isso que eu acho estranho

Mas você não esta fazendo isso mesmo no seu exemplo? A ClasseFilha não é uma herança da ClasseMae?

isso aqui é acessar via herança

[code]package br.com.ocjp.protegido2;

import br.com.ocjp.protegido.ClasseMae;

public class ClasseFilha extends ClasseMae {

public void imprimeAtributo(){  
    System.out.println(this.minhasEnums.OPA);  
}  

}[/code]

Esse exemplo vai gerar um erro de compilação. Você usa this pra se referência a um membro da própria classe. Mesmo com a herança o correto seria se referenciar diretamente ao atributo.

Veja esses exemplos:

[code]package br.com.pacote1;

public class SuperClasse {

private enum membroPrivado {
	TIPO_QUALQUER
}

protected enum membroProtegido {
	OUTRO_TIPO_QUALQUER
}

public enum membroPublico {
	MAIS_UM_TIPO
}

}

package br.com.pacote2;

import br.com.pacote1.SuperClasse;

public class ClasseFicha extends SuperClasse {

public void teste() {
	System.out.println(membroProtegido.OUTRO_TIPO_QUALQUER); // acesso legal pela herança
	System.out.println(membroPublico.MAIS_UM_TIPO); // acesso legal de um memblo publico
	System.out.println(membroPrivado.TIPO_QUALQUER); // erro de compilação, membro privado
}

}

package br.com.pacote3;

import br.com.pacote1.SuperClasse;

public class OutraClasse {

public void teste() {
	System.out.println(SuperClasse.membroPublico.MAIS_UM_TIPO); // acesso legal, membro publico
	System.out.println(SuperClasse.membroProtegido.OUTRO_TIPO_QUALQUER); // erro de compilação, um membro 
	  // protegido só é visivel para as subclasse da SuperClasse.
}

}
[/code]

Se é protected e voce herdou, poderá acessar. Não poderá acessar caso seja default ou private. Esses modificadores de acesso são iguais para metodos, variaveis,enums etc.

package pacotea;

public class ClasseA {
  protected  String acessivel;
      		String inacessivel;
}
package pacoteb;

import pacotea.ClasseA;

public class ClasseB extends ClasseA{
  	  public ClasseB(){
		  this.acessivel = "";    //de boa na lagoa
		  this.inacessivel = ""; // erro nesta linha;
	  }
}

Acho q o q causa um pouco d confusão é q quando um enum é membro d uma classe, ele é implicitamente estático. Portanto tem como acessar o enum dessa maneira q vc postou. Da mesma maneira q se fosse uma variável qq estática, vc poderia acessar dessa forma, colocando o nome da superclasse na frente.

Agora se o membro não for estático, faz sentido o q vc flw. Ai se vc colocar o nome da superclasse na frente dará erro. Nesse caso vc pode acessar usando o this ou nome do membro diretamente.