Conceitos JAVA, polimorfismo e acesso a protected

12 respostas
Wolky

Bom dia pessoal,

seguinte, preciso saber o nome que se dá em java de uma classe poder acessar um atributo protected em um método que recebe como parametro a própria classe.
Deixa exemplificar:

class Iterador { 
	protected  ArrayList<ItemPersistencia> colecao;
	protected int indice;
	
	public Iterador () {
		colecao = new ArrayList<ItemPersistencia>();
		indice = 0;
	}
	public Iterador (ArrayList<ItemPersistencia> arl) {
		colecao = arl;
		indice  = 0 ;
	}
	
	public boolean vazio () { return colecao.isEmpty();}

	public void primeiro() {indice = 0;}

	public void fim() {indice = colecao.size() - 1;}

	//mais metodos como anterior e proximo...
}

class IteradorCliente extends Iterador {
	public IteradorCliente (ArrayList<ItemPersistencia> arl) {super(arl);}
	public IteradorCliente (Iterador it) { colecao = it.colecao;}
	public Cliente obter() {return (Cliente) super.obter();}
}

Em IteradorCliente no construtor 2 há uma sobrecarga de metodos, mas como se chama isso de o pode eu passar o it.colecao, sendo que ele é protected?

xD

12 Respostas

luciano2

O atributo protected é visível em qualquer classe do mesmo pacote.

bruno.bariotti

o atributo protected é visivel alem de qualquer classe dentro do mesmo pacote, também é visivel nas subclasses!

P

Como bruno falou… é totalmente visivel dentro do mesmo pacote… mas pode ser visivel nas subclasses de fora do pacote e essa é a unica diferenca de protected para default

Wolky

Disso eu já sabia
eu queria saber o nome desse conceito em java
mas falei com o professor e ele falou para estudar Classe prima

LPJava

cada professor viu.
bem, vamos la, o mais importante é aprender o conceito, polimorfismo significa muitas formas, vc nao tem nenhuma classe chamada polimorfismo,é um conceito e ponto final.
Porem, vc precisa saber quando ele acontece. Uma situacao do mundo real, todo animal, corre/anda, porem cada um de forma diferente. A tartaruga corre de uma forma e o cachorro de outra, porem ambos sao animais, dai o polimorfismo, vc tem uma classe Animal, vc acoes, porem cada animal vai implementar a sua forma de andar/correr.
protected é usado qdo vc nao quer algo tao publico nem tao privado, vc quer classe de outros pacotes tenha acesso, porem atraves da herança ai vc tem protected, pq o publico vc tem acesso independente da forma herança ou nao, e private nao dar pra ter acesso de outro pacote.

espero ter ajudado flw.

luciano2

Bem você esqueceu de dizer que o conceito de polimorfismo está fortemente ligado com interface, pois sem uma interface em comun os animais não executam as mesmas operações.

Ex:
Nessas duas classes não existe polimorfismo

public class Carro{ 
    public void correr()
}

public class Homem{
   public void correr()
}
Mas nessas duas existe
public interface Animal{ 
    public void correr();
}
Homem implements Animal{
   public void correr()
}

Cachorro implements Animal{
   public void correr()
}
esmiralha
luciano@@:
Ex: Nessas duas classes não existe polimorfismo
public class Carro{ 
    public void correr()
}

public class Homem{
   public void correr()
}

Existe sim, afinal ambas estendem Object. A operação correr() é que não é polimórfica.

luciano2

Se vamos falar do polimorfismo dando Object como exemplo então ninguem iria precisar aprender.

discorpio

Boa noite a todos.

Quando um atributo de uma classe é do tipo objeto e recebe como valor a própria classe em que está declarado, este conceito chama-se “Recursividade”.

No seu caso, a sub-classe está recebendo como parâmetro um objeto que é a super-classe e armazenando num atributo protegido do tipo objeto declarado na própria super-classe, pois a recursividade acontece também nestes casos, e também se o seu atributo fosse privado e estivesse encapsulado, também pode ocorrer a recursividade com o método set. Ex.

class Iterador {   
    private  ArrayList<ItemPersistencia> colecao;  
    protected int indice;  
      
    public Iterador () {  
        colecao = new ArrayList<ItemPersistencia>();  
        indice = 0;  
    }  
    public Iterador (ArrayList<ItemPersistencia> arl) {  
        colecao = arl;  
        indice  = 0 ;  
    }

    public ArrayList<ItemPersistencia> getColecao(){
         return colecao;
    }
    public void setColecao(ArrayList<ItemPersistencia> colecao){
        this.colecao = colecao;
    }
      
    public boolean vazio () { return colecao.isEmpty();}  
  
    public void primeiro() {indice = 0;}  
  
    public void fim() {indice = colecao.size() - 1;}  
  
    //mais metodos como anterior e proximo...  
}  
  
class IteradorCliente extends Iterador {  
    public IteradorCliente (ArrayList<ItemPersistencia> arl) {super(arl);}
    // Mesmo encapsulado ocorre a recursividade  
    public IteradorCliente (Iterador it) { setColecao(it) }  
    public Cliente obter() {return (Cliente) super.obter();}

    // Assim também há recursividade
    setColecao(new Iterator());  
}
esmiralha

Luciano,

Eu só quis lembrar que o polimorfismo se aplica também a herança e não só a implementação de interfaces. Desculpe se eu atrapalhei você em alguma coisa.

carlos.e.a
luciano@@:
Mas nessas duas existe
public interface Animal{ 
    public void correr();
}
Homem implements Animal{
   public void correr()
}

Cachorro implements Animal{
   public void correr()
}

Vou reviver aqui esse topico apenas para tentar ajudar quem esta começando e acaba caindo nesses topicos...se bem que é uma "ressurreicao" que nem se compara a muitas que vejo por ai de 10 anos antes xD

Enfim, é soh pra citar uma coisa importante: no caso desse codigo do amigo Luciano seria bem mais adequado usar uma classe abstrata em vez de uma interface pois a meu ver essas duas classes estao "fortemente relacionadas", logo poderiam compartilhar alguns metodos "não abstratos" da superclasse Animal...nao estou dizendo que o que ele fez esta errado, longe disso, apenas estou citando classe abstrata(aliás, interface nao deixa de ser um caso particular de classe abstrata) no intuito de enriquecer esse topico e ajudar quem está iniciando pois esse assunto gera realmente muita duvida no inicio =D

discorpio
carlos.e.a:
luciano@@:
Mas nessas duas existe
public interface Animal{ 
    public void correr();
}
Homem implements Animal{
   public void correr()
}

Cachorro implements Animal{
   public void correr()
}

Vou reviver aqui esse topico apenas para tentar ajudar quem esta começando e acaba caindo nesses topicos...se bem que é uma "ressurreicao" que nem se compara a muitas que vejo por ai de 10 anos antes xD

Enfim, é soh pra citar uma coisa importante: no caso desse codigo do amigo Luciano seria bem mais adequado usar uma classe abstrata em vez de uma interface pois a meu ver essas duas classes estao "fortemente relacionadas", logo poderiam compartilhar alguns metodos "não abstratos" da superclasse Animal...nao estou dizendo que o que ele fez esta errado, longe disso, apenas estou citando classe abstrata(aliás, interface nao deixa de ser um caso particular de classe abstrata) no intuito de enriquecer esse topico e ajudar quem está iniciando pois esse assunto gera realmente muita duvida no inicio =D

Bom dia a todos.

Principalmente quando todos os animais tem algo em comum, como se alimentar, locomover, dormir, acordar, enxergar e etc.

Estes métodos comuns a todos os animais, podem e devem ser implementados em uma classe abstrata, onde essa implementação numa interface não seria possível.

O uso de uma interface cabe quando todos os métodos a serem utilizados variam de classe para classe.

Criado 20 de novembro de 2010
Ultima resposta 11 de jan. de 2011
Respostas 12
Participantes 8