[Resolvido] Dúvida com modificador de acesso

4 respostas
charlesbraw

Galera,

Segue os códigos para depois a dúvida:

Principal5.java
import outro.*;

public class Principal5 extends Parent{

	public void doWrite2() {
		System.out.println("doWrite2");
		this.doWrite(); //USEI DIRETAMENTE USANDO RECURSO DA HERANÇA
	} 
	
	public static void main(String[] args) {
		 System.out.println("teste");
		 Principal5 p = new Principal5();
		 Parent pa = new Parent();
		 pa.doWrite(); // ESTOU TENTANDO USAR COM INSTANCIA
	}
}
Parent.java
package outro;

public class Parent {
	
	protected void doWrite() {
		System.out.println("doWrite");
	}
}

É o seguinte, estou usando um método que esta em outro pacote e tem o modificador de acesso protected, porém só consigo acessa-lo atraves do recurso de h herança (usando this por exemplo), se eu tentar acessá-lo usando uma instancia isso não é permitido, seria isso mesmo? (Estou levando em consideração que estejam em pacotes diferentes).

os nomes dos pacotes estão esquisitos porque estava fazendo alguns testes rápidos arqui ... hehhe

4 Respostas

E

O modificador de acesso protected permite o acesso apenas a:

a) Classes que herdem dessa classe,
e
b) Classes do mesmo pacote.

Em particular, acho errado que seja assim. Deveria ser apenas a opção a) (classes que herdam dessa classe); a opção b) é um pouco permissiva demais para meu gosto.
Eu acharia melhor que houvesse um modificador “internal” (como no C#) que indicasse que algo pode ser usado apenas dentro de um módulo (no caso do C#, uma DLL).

http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6.2

charlesbraw

Acho que entendi.

Apeser de estar herdando da class Parent, eu tambem estou instanciando, nesse caso quando eu uso o método pela instancia e a classe esta em outro pacote vai valer a regra da letra b.

estou certo?

isso é muito louco né, extender e instancia na mesma classe hehheheh, mas é um teste para o exame.

Hebert_Coelho
Como nosso amigo explicou, só fica visível para classes do mesmo pacote quer herdam a classe pai, ou para outras classes dentro do mesmo pacote. Olha só o exemplo:
package test;

public class Pai {
	protected String soFilhoVe = "AA";
}


//----------------

package test;

public class Filho extends Pai {
	public void imprime(){
		System.out.println(soFilhoVe);
	}
}
Funciona que uma beleza. Note que estão no mesmo package. Agora, o código abaixo vai dar erro:
package sec;

import test.Pai;

public class Tio {
	public void oTioNaoVe(){
		Pai pai = new Pai();
		System.out.println(pai.soFilhoVe);
	}
	
}
Note que a classe tio, está em pacote diferente. Olha a mensagem de erro que o java exibe:
[color=red]Exception in thread "main" java.lang.Error: Unresolved compilation problem: The field Pai.soFilhoVe is not visible

at sec.Tio.oTioNaoVe( Tio.java:8 )
at test.Princ.main(Princ.java:11)[/color]

charlesbraw

Então galera,
Fiz vários testes aqui e consegui entender o que vocês me explicaram.
Show de bola, valeu mesmo.

Criado 16 de julho de 2010
Ultima resposta 16 de jul. de 2010
Respostas 4
Participantes 3