Duvida Modificador "Protected"

Boa noite amigos do GUJ.

Estou revisando alguns conceitos para minha prova de certificação, porém me deparei com um problema no mínimo curioso pelo menos para mim…
Até onde sei, membros “protected” acessados de fora da propria classe ou fora de uma subclasse, são “invisiveis”, porém aqui em casa compilou normalmente chegando a exibir os valores protegidos, algum erro meu? não estou conseguindo enxergar o erro. Segue abaixo os arquivos.

Arquivo 1

public class Teste1{
	
	protected int x;
	
	protected void metodoTeste1(){System.out.println("Metodo Teste 1");};
	
}

Arquivo 2

public class Teste{
	
	public static void main (String... args){
	
    	Teste1 t1 = new Teste1();
	
		t1.metodoTeste1();
		
		t1.x = 10;
		
		System.out.println(t1.x);
	
	}
			
}

P.S: Caso ajude estou utilizando a IDE JCreator e o JDK 1.5.0_07.

Desde já agradeço.

cara é o seguinte… o protected vc considera pacote + filho(subclasse)

qualquer classe dentro do mesmo pacote tem acesso, e também tem acesso de outro pacote caso a classe seja uma subclasse…

no seu exemplo não tem declaração de pacote, ou seja, supõe-se que estão no mesmo pacote e tudo tem que rodar perfeito…

agora se vc colocar na classe Teste1 um: package testeUm; e na classe Teste um package testeDois; ai sim eles não seriam visíveis…

entendeu…
flw Hewerton

Membros protected são visíveis se estiverem em classes no mesmo pacote.

Amigo,

O nivel de acesso protected pode ser acessado por classes q estão no mesmo pacote, esse e o seu caso.
As 2 classes estão no mesmo pacote por isso vc conseguiu esse valor, se o Arquivo2 estivesse em outro pacote vc nao conseguitia acessar os membro do arquivo1 a menos q o arquivo2 fosse um subclasse do arquivo1.

Protected = pacote+subsclasse.

Espero ter ajudado.

Valeu.

Opa se ajudou galera… valeu… e isso mesmo acabei esquecendo deste detalhe sobre o protected, foi o vicio com comportamento do modificador protected do delphi… valeu novamente a todos… :wink:

e fora também :!: esqueceu das subclasses :?:

e ae pessoal, só pra complementar …

se uma subclasse for chamar um atributo protected da superclasse,
terá que chamar com super.x = 10

se não me engano…

mas é isso ai…

valeu!!

[quote=oculos]e ae pessoal, só pra complementar …

se uma subclasse for chamar um atributo protected da superclasse,
terá que chamar com super.x = 10

se não me engano…

mas é isso ai…

valeu!!

8)[/quote]

estais confundindo sim!
uma subclasse só tem acesso a uma variável protected através da herança, vc não consegue acessá-la usando o .(ponto)
a classe filha herda o atributo e pronto, ela não tem acesso indo buscar na classe mãe…

[quote=Javabuntu][quote=oculos]e ae pessoal, só pra complementar …

se uma subclasse for chamar um atributo protected da superclasse,
terá que chamar com super.x = 10

se não me engano…

mas é isso ai…

valeu!!

8)[/quote]

estais confundindo sim!
uma subclasse só tem acesso a uma variável protected através da herança, vc não consegue acessá-la usando o .(ponto)
a classe filha herda o atributo e pronto, ela não tem acesso indo buscar na classe mãe…

[/quote]

Concordo que não precise utilizar o ponto para acessar um método protect herdado da superclasse.

Ae galera, sou novo no GUJ, e entrei com o objetivo de me especializar em Java, que é a minha paixão.

Só para esclarecer, e para ver se estou certo: na classe Teste1, se o atributo e o métodos fossem declarados como private, aí nem classes especializadas, nem classes do mesmo pacote conseguiriam acessar, certo???

[quote=brunoha]Ae galera, sou novo no GUJ, e entrei com o objetivo de me especializar em Java, que é a minha paixão.

Só para esclarecer, e para ver se estou certo: na classe Teste1, se o atributo e o métodos fossem declarados como private, aí nem classes especializadas, nem classes do mesmo pacote conseguiriam acessar, certo???[/quote]

Sim private é visto apenas naquela classe… um exemplo que costumo usar é que private é como as roupas intimas… por exemplo: “Vc herdou a cueca do seu pai? Está usando ela?” rs

class Pai{
private String cueca;
}
class Filho extends Pai{
//o filho nao tem a cueca do pai nao
}

flw!

[quote=rmalati]

Concordo que não precise utilizar o ponto para acessar um método protect herdado da superclasse.[/quote]

só tem um detalhe no seu comentário, no “não precise”, na verdade NÃO PODE, a subclasse em outro pacote SOMENTE tem acesso ao atributo protected pela herança, ou seja, apenas o que ela herdou, ela não tem nenhum conhecimento sobre o atributo que está na classe pai, se vc usar o operador ponto pra tentar acessar através de uma instância, o compilador vai simplesmente dizer, "que variável é essa que está tentando acessar :?: não conheço nenhum :!: " erro de compilador ok…

flw Hewerton

[quote=Javabuntu][quote=rmalati]

Concordo que não precise utilizar o ponto para acessar um método protect herdado da superclasse.[/quote]

só tem um detalhe no seu comentário, no “não precise”, na verdade NÃO PODE, a subclasse em outro pacote SOMENTE tem acesso ao atributo protected pela herança, ou seja, apenas o que ela herdou, ela não tem nenhum conhecimento sobre o atributo que está na classe pai, se vc usar o operador ponto pra tentar acessar através de uma instância, o compilador vai simplesmente dizer, "que variável é essa que está tentando acessar :?: não conheço nenhum :!: " erro de compilador ok…

flw Hewerton[/quote]

Hahaua, é isso mesmo vc tá certo.
Abraço.