Enums 'aninhadas' + protected + subclasse externa

11 respostas
faeldix

classe mãe

package br.com.ocjp.protegido;

import java.io.IOException;

public class ClasseMae implements InterfaceFilha {

	protected enum minhasEnums {OPA, QUE_LEGAL}

}

classe filha

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);
	}

}

eu posso acessar ENUMS Protegidas dessa forma?

11 Respostas

Arthemus

Sem problemas.

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

aajjbb

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

faeldix

mas eu acessei diretamente… e estou em outro pacote

macafe

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

Arthemus

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.

faeldix

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

Arthemus

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

faeldix

isso aqui é acessar via herança

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);  
    }  
  
}
Arthemus

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:

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.
	}
}
ErickRAR

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;
	  }
}
Andersonrms

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.

Criado 28 de junho de 2012
Ultima resposta 29 de jun. de 2012
Respostas 11
Participantes 6