Sou eu que estou errado ou o livro?

6 respostas
Grinvon

Eu tava vendo uma coisa no livro da Kathy (arg… versão português), sobre a respeito do modificador de acesso protected, achei estranho quando ele falou que por exemplo uma variável protected ela se torna inacessível a outra classe que herda de uma quasse que herdou da superclasse que no caso é a que têm a variável protected. Isso na prática é diferente, se eu tiver uma classe com tal variável protegida e tentar acessar po uma classe que herda da classe que herdou dessa super classe, o programador aceita normalmente. Realmente há muitas coisas estranhas… :roll:

6 Respostas

M

estranho, eu ja li este mesmo capitulo e não notei isso, poste o trexo do livro q a kathy fala isto…! :roll:

Bani

Bom, eu lembro quando li na versão original que era mais ou menos isso mesmo, e eu traduzi (e testei) assim no meu resumo:

- protected: acessível por classes do mesmo pacote ou através de herança. Os membros herdados não são acessíveis a outras classes fora do pacote em que foram declarados. Como o conceito de protected tem alguns detalhes que podem não ficar claros à primeira vista, veja estes exemplos:

package pai;
public class Pai{
	protected int teste = 9;
}

// Teste 1:
package filho;
import pai.Pai;
public class Filho extends Pai {
	public void teste() {
		System.out.println(teste); // OK, usa a variável herdada
		Pai p = new Pai();
		System.out.println(p.teste); // ERRO: teste has protected access in pai.Pai
	}
}

// Teste 2:
package filho; // Funcionaria se o package fosse o pai
public class Cunhado{
	void teste(){
		Filho filho = new Filho();
		System.out.println(filho.teste); // ERRO: teste has protected access in	pai.Pai
	}
}

Provavelmente no seu caso aceitou normalmente porque estava no mesmo pacote, e protected tem visibilidade maior que aquela default (sem modificador nenhum). Inclusive, essa ordem de visibilidade dos modificadores costuma cair na prova, então é bom prestar atenção.

Grinvon

Opa bani!

O problema que eu achei estranho foi o seguinte, vou da como exemplo o exemplo que você criou

// Teste 2: 
package filho; // Funcionaria se o package fosse o pai 
public class Cunhado{ 
   void teste(){ 
      Filho filho = new Filho(); 
      System.out.println(filho.teste); // ERRO: teste has protected access in   pai.Pai 
   } 
}

Nessa terceira classe do pacote externo, você tentou criar por instância da classe, isso no caso como você bem disse é errado, agora o que acho estranho é assim:

// Teste 2: // classe alterada package filho; // Funcionaria se o package fosse o pai public class Cunhado extends Filho{ void Cunhado(){ System.out.println(teste); // CERTO. Agora funcionou } }

Achei estranho assim, ou seja o construtor chama a variável de instância teste que está na classe Pai que é de outro pacote. Pensei que os membros ficariam como privado ou default, já que a classe Cunhado herda de Filhos e não de Pai, pensei que os membros ficariam invisíveis nesse caso aqui.

Bani

No caso de herança funciona infinitamente. O problema é só acessar de fora se não for por herança.

Grinvon

Nem isso o livro da Kathy falou, a respeito do protected, valeu Bani!

D

http://www.guj.com.br/forum/viewtopic.php?t=8060&highlight=protected

Criado 10 de abril de 2004
Ultima resposta 20 de abr. de 2004
Respostas 6
Participantes 4