Conceitos JAVA, polimorfismo e acesso a protected

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:

[code]class Iterador {
protected ArrayList 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 arl) {super(arl);}
public IteradorCliente (Iterador it) { colecao = it.colecao;}
public Cliente obter() {return (Cliente) super.obter();}
}[/code]

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

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

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

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

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

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.

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

[code] public class Carro{
public void correr()
}

public class Homem{
public void correr()
}[/code]

Mas nessas duas existe

public interface Animal{ 
    public void correr();
}
Homem implements Animal{
   public void correr()
}

Cachorro implements Animal{
   public void correr()
}

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

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

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

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.

[quote=luciano@@]

Mas nessas duas existe

[code]
public interface Animal{
public void correr();
}
Homem implements Animal{
public void correr()
}

Cachorro implements Animal{
public void correr()
}
[/code][/quote]

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

[quote=carlos.e.a][quote=luciano@@]

Mas nessas duas existe

[code]
public interface Animal{
public void correr();
}
Homem implements Animal{
public void correr()
}

Cachorro implements Animal{
public void correr()
}
[/code][/quote]

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[/quote]

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.