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!!!
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??
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…
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.
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!!
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.
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.
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!!
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
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.
[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…
[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.
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.
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