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