Modificador Protected

Olá a todos eu já li vários tópicos aqui no fórum , mas não consigo entender uma coisa, o modificador de acesso protected.
Eu posso dizer não levando em contes packages ou seja tudo dentro do mesmo pacote o nível de encapsulamento de protected e o mesmo que public??
E levando em conta packages os atributos protecteds só podem ser acessados por suas classes, classes filhas, e classes do mesmo pacote, e o public de todos os pacotes??

Alguém pode me esclarecer melhor porque esta dúvida está me deixando com dor de cabeça!!!

O livro que estou lendo atualmente http://www.novateceditora.com.br/livros/javaguia/ monta uma tabela dizendo o seguinte
Acessibilida de membros por meio da herança:

Especificador: Protected:
ImplementacaoDaClasse
Sim
InstanciaSuperClasse
Nao
ImplementacaoSubClasse
sim
InstanciaSubClasse
nao

No caso do protected acho que está errado, porque eu consigo acessar um atributo direto com a instancia tanto da superClasse como da SubClasse. Ou estou errado??

Att

Cara… vc esta entendendo certinho…
Public pode ser acessado diretamente, por qualquer classe do projeto, ouseja esta visível ao mundo
Protected pode ser acessado por classes q estão dentro do mesmo pacote.
e private so poderá ser acessado dentro da mesma classe…

blz? espero q tenho conseguido ajudar…
abraços

Opa cara, tudo bom?

Protected é algo intermediário a public e private.
Caso um membro seja protected em uma superclasse, esse cara pode ser acessado pela superclasse, pelas subclasses e por outras classes no mesmo pacote (eles também têm acesso a pacotes). Os membros protected são parecido com o public quando falamos da relação entre a superclasse e a subclasse. Isso quer dizer que ambos os caras (protected e public) podem ser acessados com o mesmo “nível”… uma subclasse pode acessar um membro public tratando ele como public (ele fica public na subclasse?) e protected tratando ele como protected, ou seja, ambos tornam-se membros protected na subclasse.

Mas acho que não respondi à sua pergunta :stuck_out_tongue:

no caso da superClasse, qndo vc envoca um atributo da superClasse na SubClasse, é como se vc estivesse na superClasse, ja q vc usou herança, certo?

super.NOME por exemplo, nesse caso vc esta acessando diretamente…

num sei se ficou claro cara…

tem um livro mtooo bacana q explica isso direitinho

INTRODUÇÃO A PROGRAMAÇÃO ORIENTADA A OBJETOS EM JAVA
autor: Carlos Camarão… é mto bom o livro…
da uma olhada la
blz?

Isso mesmo.
Mas só dá pra acessar quando for public ou protected.

public class SuperClasse
{
	public void mostraTexto1()
	{
		System.out.println("Texto 1 :D");
	}

	protected void mostraTexto2()
	{
		System.out.println("Texto 2 :D");
	}

	private void mostraTexto3()
	{
		System.out.println("Texto 3 :D");
	}
}

public class SubClasse
{
	public static void main(String args[])
	{
		[b]super[/b].mostraTexto1();
		[b]super[/b].mostraTexto2();
		[b]super[/b].mostraTexto3(); // aqui vai dar erro.
	}
}

Ali vai dar erro porque é como, na visão da subclasse, o método mostraTexto3() não existisse.

Valeu galera pela ajuda, obrigado a todos!!!
Mas só mais uma coisa nesta tabela que eu postei o autor diz que eu não conisgo acessar um atributo protected através da InstanciaDaSuperClasses e nem da InstanciaDaSubClasse, mas acho que ele se enganou, porque eu consigo acessar sim!!
Se estiver errado, alguem me corrige!!

Obrigado

Po cara, eu acredito que seja possível sim.
Mas dependendo do tipo da superclasse, ela não pode ser instanciada. Se você instanciar uma subclasse, obviamente você tem todos os acessos aos membros public e (eu acho que) aos protected.

Você me deixou meio em dúvida agora. Assim, protected parece um membro public.

Pense neste modificador em nível de pacote, sómente classes no mesmo pacote podem herdar de uma classe definida como procted.

Márcio mas eu não posso pensar assim, porque se eu tiver uma classe que extends de outra que está em pacote diferente, eu consigo acessar os atributos definidos como protected. 

Essa a utilização do protected, quando tenho uma classe filha que está em outra pacote mas quero acessar os atributos da classe mãe se tivesse definido como default, eu não conseguiria então uso o protected.

Veja:

private<default<protected<public!

Me corrija se eu estiver errado!!

Att

Pois então kra eu tbm to em dúvida eu testei aqui no eclipse, e eu consigo acessar os atributos definidos como protected, pela instancia da SuperClasse e tbm da SubClase!!
Se conseguir esclarecer melhor, poste aii , porque ainda to com um pouco de dúvida!!

Abraço!!

cara… será q esse exemplo q vc viu no livro, num era de uma classe abstrata naum? pq classes abstratas, vc nunca podera instanciá-la de forma alguma… Mas mesmo q ela seja abstrata, se vc tiver um modificar PROTECTED num ATRIBUTO, ele tem q funcionar…

se tiver como, poste um exemplo aki… pra gente dar uma olhada…
abraços

Subclasses de fora do Pacote podem herdar membros protected.
Isso que você disse serve para acesso default! :thumbup:

Basicamente o acesso protected é visivel para herança e invisivel para instancia fora do pacote.

Falou

Se você possui n classes em apenas um pacote, acho que não há a necessidade de você definir uma variável de instância com o modificador protected, pois ele é um modificador de acesso do tipo “PACOTE”. Em vez disso, faça uso do public e do private, de acordo com a necessidade.

Se eu estiver errado, por favor me corrijam.

Abraços

[quote=danielbussade][quote]
Po cara, eu acredito que seja possível sim.
Mas dependendo do tipo da superclasse, ela não pode ser instanciada. Se você instanciar uma subclasse, obviamente você tem todos os acessos aos membros public e (eu acho que) aos protected.

Você me deixou meio em dúvida agora. Assim, protected parece um membro public.
[/quote]

Pois então kra eu tbm to em dúvida eu testei aqui no eclipse, e eu consigo acessar os atributos definidos como protected, pela instancia da SuperClasse e tbm da SubClase!!
Se conseguir esclarecer melhor, poste aii , porque ainda to com um pouco de dúvida!!

Abraço!![/quote]

Então cara, depois de algum tempo eu volto a responder…
Os protecteds só são acessados pelas classes do pacote mesmo… quando eu disse que as superclasses não podem ser instanciadas eu quis dizer que elas podem ser classes abstratas… aí dentro dela pode ter um atributo protected ou um public. Como o amigo acima disse, eu também prefiro usar somente public e private em classes normais ou abstratas…

Enfim…

Abraço.

[quote=destination]Se você possui n classes em apenas um pacote, acho que não há a necessidade de você definir uma variável de instância com o modificador protected, pois ele é um modificador de acesso do tipo “PACOTE”. Em vez disso, faça uso do public e do private, de acordo com a necessidade.

Se eu estiver errado, por favor me corrijam.

Abraços[/quote]

Não entendo que você esteja errado, mas gostaria de fazer algumas observações:

  • Realmente a idéia do protected é definir regras de acesso “interpacotes”, e não teria necessidade
    de utilizarmos protected se tivessemos apenas um pacote em nosso aplicativo… porém em qualquer bom
    projeto você irá utilizar algum design pattern, assim vários pacotes deverão ser criados, então o protected poderá ser útil!

  • Em relação as variáveis de instância utilizarem public não é uma boa prática! A idéia é utilizarmos encapsulamento. A não ser que sejam também static final.

  • Outro detalhe é que quando declaramos uma variável de instância ou método como private estamos dizendo que estes não serão herdados. Já no caso de protected eles seriam herdados pelas subclasses, e claro, indepedente de pacotes.

De todos os modificadores o protected é certamente o que gera mais dúvidas, mas é um excelente recurso que devemos aprender e utilizar. :smiley:

so para acrescentar vc pode acessar um membro protected de outro pacote, através da herança esse é o beneficio de ter um membro protected… pq se for apenas por restrição de package basta deixar o membro com o valor default.

:smiley:

default: package
protected: package + kids

Vc consegue acessar (ver) o atributo herdado no classe herdeira.

O que o autor deve ter dito, e vc confundido, é que nao e possivel acessar um membro protected, de dentro da
classe herdeira, com uma referência à superclasse.

Imagine que vc esta dentro do codigo da classe Filho, e tenta fazer:

Pai pai = new Pai();
pai.atritutoProtectedString = "teste" // nao funciona! atributoProtectedString so esta visivel via herança

Agora:

this.atritutoProtectedString = "teste"; // Funciona