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…
blz? espero q tenho conseguido ajudar…
abraços
Andre_Brito
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
Hermanitto
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?
Andre_Brito
Isso mesmo.
Mas só dá pra acessar quando for public ou protected.
publicclassSuperClasse{publicvoidmostraTexto1(){System.out.println("Texto 1 :D");}protectedvoidmostraTexto2(){System.out.println("Texto 2 :D");}privatevoidmostraTexto3(){System.out.println("Texto 3 :D");}}publicclassSubClasse{publicstaticvoidmain(Stringargs[]){[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.
danielbussade
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
Andre_Brito
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.
Marcio_Nogueira
Pense neste modificador em nível de pacote, sómente classes no mesmo pacote podem herdar de uma classe definida como procted.
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
danielbussade
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!!
Hermanitto
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
C
carlospia
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
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
Andre_Brito
danielbussade:
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.
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!!
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.
C
carlospia
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
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.
LPJava
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.
fabim
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:
Paipai=newPai();pai.atritutoProtectedString="teste"// nao funciona! atributoProtectedString so esta visivel via herança