Propriedade privada, herda ou não herda?  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
Andre Brito
Forum Spammer
[Avatar]

Membro desde: 21/07/2007 17:44:31
Mensagens: 1214
Localização: Paraná
Offline

Guizelini,

Eu também achava que heradava tudo... mas pelo que dizem estou errado.

Sim eu sei o que é HERANÇA!

balboa is jamming.
"We couldn't find a good UML tool for our community. So our community built one. You guys are awesome."
TopCoder
Stop blaming everything (and everybody) else for your own laziness.
Dieval Guizelini
JavaEvangelist
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 472
Localização: Curitiba - PR
Offline

dedejava wrote:Guizelini,

Eu também achava que heradava tudo... mas pelo que dizem estou errado.

Sim eu sei o que é HERANÇA!


Então eu vou mudar a pergunta, você já viu ou alguém conseguiu te demonstrar que uma subclasse não herda todos os recursos (inclusive os privados)?

Tenho algumas propostas para avaliar a implementação do Java com relação a esse ponto:

A primeira:
Crie uma classe base com um tipo int como campo private e atribua a ele um inteiro qualquer.
Veja a quantidade de memória disponível
instancie e armazene em um array list 1000 desses objetos
Veja a quantidade de memória disponível
repita para 10.000 e 100.000.
Você conseguirá ver o quanto de memória esse objeto está ocupando.
Depois crie uma subclasse da primeira classe com mais um único atributo inteiro e faça o mesmo teste.
Qual será o resultado esperado? o dobro do consumo de memória.

A segunda:
Use o profile do netbenas e verifique os objetos.

A terceira:
faça a serialização de uma classe base e de uma subclasse, e armazene em disco.

eu dei uma procurada por cima na especificação da VM do java e não encontrei onde descreve isso, e deveria ser na parte de memória da VM. Mas o comportamento das linguagens como elas são implementadas internamente são muito similares. Lembrei de ter lido isso no manual do Delphi a alguns anos, procurei o manual no google e:

The internal data format of an object resembles that of a record. The fields of an
object are stored in order of declaration as a contiguous sequences of variables. Any
fields inherited from an ancestor class are stored before the new fields defined in the
descendant class.

fonte: Object Pascal Language Guide, 167
link: http://portal.aauj.edu/portal_resources/downloads/programming/delphi_object_pascal_language_guide.pdf

então quem te disse que uma subclasse não herda tudo da superclasse está definitivamente errado.

fw

This message was edited 1 time. Last update was at 22/12/2007 08:06:10


Sun Certified Java Programmer 5.0
[WWW]
pardal_nb
Virtual Machine Man

Membro desde: 12/09/2006 08:26:06
Mensagens: 672
Offline

Vejo que cada um fala uma coisa....

herda TUDO, nao herda PRIVATE...

afinal, HERDA ou NAO HERDA ???


LPJava
Forum Spammer
[Avatar]

Membro desde: 18/04/2006 12:50:23
Mensagens: 3839
Localização: Bahia
Offline

pardal_nb wrote:Vejo que cada um fala uma coisa....

herda TUDO, nao herda PRIVATE...

afinal, HERDA ou NAO HERDA ???




baseado na kathy ex-engenheira da sun, co-desenvolvedora do exame nao herda. e para com essa agonia pardal ja tem dois dias.. uauauhauh

Sun Certified Java Programmer 5.0
Blog! Atualizado 21/12 Habilidades Gerente de Projetos
http://camilolopes.wordpress.com
Colunista Java - Imasters http://www.imasters.com.br
Analyst Java Programmer - IBMistas
[WWW]
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 204
Localização: São Paulo
Offline

Teste muito simples....


Como você pode ver, o atributo i não é herdado.
Membros privados de uma classe não são acessíveis por nenhuma outra. NENHUMA. As outras classes não sabem sequer se os membros privados existem.
Dada a afirmação acima, pense nisso: como uma classe pode herdar aquilo que ela nem sabe se existe?

OBS: Por membro, leia atributos e métodos.

Felipe de Alencar Albuquerque
[MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 5516
Localização: Curitiba
Offline

Pessoal,

Existe uma diferença entre a existência de um atributo e a sua visibilidade.

O que o Dieval quer dizer é que, uma classe filha herdará um atributos e métodos do pai, no sentido de que, essas estruturas existirão, serão alocadas em memória, e serão usadas pelos mecanismos internos da classe. Afinal de contas, o filho é um objeto da classe pai e nada mais natural do que ele ter absolutamente todos os atributos do pai.

Entretanto, graças às regras de escopo, esses atributos e métodos não serão visíveis na classe filha. Daí a confusão. Assim, eles são herdados (pq existem e são acessados indiretamente pelos filhos), mas não são visíveis, estão fora do escopo da classe filha.

Por isso, não é possível fazer polimorfismo de métodos privados, por exemplo. O que ocorre se sobrescrevermos métodos privados é acabarmos com métodos de escopos diferentes. Um deles será usado quando a porção do pai invocar, outro será usado quando a porção do filho invocar que, se houvesse polimorfismo, apenas o método do filho seria invocado.

Isso é o que realmente acontece. Agora, a sensação para quem implementa um filho é de que os atributos e métodos privados não existem. Por isso tantos livros dizerem que não são herdados. Vai muito do que o autor considerar ou não herança.

Desenvolve jogos de computadores?
http://vinigodoy.wordpress.com
[WWW]
Dieval Guizelini
JavaEvangelist
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 472
Localização: Curitiba - PR
Offline

Com relação a kathy,

existem dois pontos, a forma com que ele escreve e para qual objetivo. Para o iniciante pode ser interessente ele ter a idéia de que não acontece a herança para entender o escopo de visualização, mas não a forma de implementação interna e quanto mais com relação a teoria de OO.

Outro ponto, você está se baseando em uma informação traduzida de má qualidade. Procure aqui mesmo no GUJ e você irá verificar que os tradutores fizeram um péssimo trabalho...

É como o Vini falou.

fw

Ps: felipealbuquerque recomendo que você veja o meu exemplo anterior, você está equivocado. O seu exemplo mostra o nível de controle sobre o escopo do recurso e não significa que a herança não ocorreu.

This message was edited 1 time. Last update was at 22/12/2007 09:31:50


Sun Certified Java Programmer 5.0
[WWW]
truck1n
JavaGuru

Membro desde: 26/04/2006 11:41:05
Mensagens: 241
Localização: São Paulo
Offline

Dieval Guizelini wrote:
1. herança sempre herda tudo (absolutamente tudo) da classe pai.


Não tem como Herdar membros privados... por isso tem os Gets e Setters!


Abraços!

Get Rich Or Die Trying
[WWW] [MSN]
Dieval Guizelini
JavaEvangelist
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 472
Localização: Curitiba - PR
Offline

truck1n wrote:
Dieval Guizelini wrote:
1. herança sempre herda tudo (absolutamente tudo) da classe pai.


Não tem como Herdar membros privados... por isso tem os Gets e Setters!

Abraços!


Vocês estão andando em circulos...

os métodos são apenas "interfaces" entre os estados internos de um objeto (propriedades, variáveis de instâncias, tipos primitivos) e o mundo externo (outros objetos). Os métodos por si só não são capazes de PRESERVAR a informação.
Quando se cria uma instância de uma subclasse ela possui TODAS as características da classe pai, por isso ela pode ser comparada com o operador instanceof da classe pai e ter como resultado verdadeiro, pois este operador verifica que objeto (de uma subclasse) É uma instância da classe pai, o que é muito diferente de TER um membro de uma determinada classe.

Logo o fato de um ou mais recursos serem declarados como private não impede destes mesmos recursos estarem presentes (fazerem parte) das instâncias de classes filhas. Não está em discussão se estes recursos são ou não acessíveis através destas instâncias e apenas se eles são ou não HERDADOS.

fw

Sun Certified Java Programmer 5.0
[WWW]
Andre Brito
Forum Spammer
[Avatar]

Membro desde: 21/07/2007 17:44:31
Mensagens: 1214
Localização: Paraná
Offline

truck1n wrote:
Dieval Guizelini wrote:
1. herança sempre herda tudo (absolutamente tudo) da classe pai.


Não tem como Herdar membros privados... por isso tem os Gets e Setters!


Abraços!


ACHO que você tem razão... Me deixou na dúvida agora... se eu tenho uma variável de instância j private, usar um getJ e um setJ(tipo novoJ), eu posso acessar com o get e setar com o set? Então ela é tanto visível quanto pode ser modificada e manipulada, concorda?

balboa is jamming.
"We couldn't find a good UML tool for our community. So our community built one. You guys are awesome."
TopCoder
Stop blaming everything (and everybody) else for your own laziness.
Dieval Guizelini
JavaEvangelist
[Avatar]

Membro desde: 05/07/2006 14:39:44
Mensagens: 472
Localização: Curitiba - PR
Offline

dedejava,

em partes,

você deve lembrar que os métodos podem realizar validações, e eventualmente não modificar o conteúdo da variável. Exemplo o CPF, você pode ter um método setCPF que valide a informação passada e se ela não passar pelo algoritmo de validação ela não será atribuída a propriedade cpf.
Na prática, os set e gets são recomendados principalmente para quando você precisar incluir alguma validação ou gerar um "evento/notificação" de modificação ou de acesso possa ser implementado a posteriori. Ou por exemplo, para se modificar o domínio ou realizar qualquer modificação interna no objeto sem a necessidade de reescrever todos as classes e objetos que façam uso destes recursos.
O legal de se compreender as definições de OO, é que se bem utilizados os métodos como interfaces das propriedades, você poderá modificar com relativa segurança quase tudo do seu objeto sem impactar nos outros pontos do sistema. O outro ponto é que a propriedade pode ser relevante para outros valores/estados do próprio objeto.

fw

Sun Certified Java Programmer 5.0
[WWW]
Andre Brito
Forum Spammer
[Avatar]

Membro desde: 21/07/2007 17:44:31
Mensagens: 1214
Localização: Paraná
Offline

Eu fiz os seguintes códigos:



A a subclasse



Bom... aí já tá dito né... agora é possível tanto acessar os valores e mostrar os mesmos e setar novos valores pra eles.
Tá certo e coeso isso?

This message was edited 1 time. Last update was at 22/12/2007 14:29:49


balboa is jamming.
"We couldn't find a good UML tool for our community. So our community built one. You guys are awesome."
TopCoder
Stop blaming everything (and everybody) else for your own laziness.
malsan
JavaChild

Membro desde: 14/12/2007 16:20:02
Mensagens: 112
Offline

Senhores,
Para responder é necessário tão somente lembrar das definições em OO para Herança:
Por herança compreendemos todos ser a capacidade que uma determinada classe possui de encapsular os membros de uma outra classe, então chamada "superclasse". Sabemos ainda que uma relação de herança corresponde a uma relação "is a". Ou seja: se "uma classe" "estende" uma outra, ela é "uma outra". Se é "uma outra", possui todos os membrpos existentes em "uma outra", o que inclui os membros privados. Pronto! A questão está respondida!
Mas, para que não hajam dúvidas, lembremos a definição de membro privado. Que diz que um membro privado só pode ser acessado a partir da classe em que é encapsulado. Desta forma, mesmo que "uma classe" herde um membro privado de "uma outra", não poderá acessá-lo pois este membro não foi encapsulado em "uma classe', mas sim em "uma outra". Caso seja necessário op acesso a estes membros privados em "uma outra" a partir de "uma classe", definem-se seletores e modificadores públicos para estes membros em "uma outra".
felipealbuquerque
JavaGuru
[Avatar]

Membro desde: 19/05/2006 08:19:09
Mensagens: 204
Localização: São Paulo
Offline

Eu li os posts desse tópico, que é muito interessante, e estou convencido de que membros privados de superclasses são herdados pelas suas subclasses. Já a visibilidade é outra coisa, eu estava confundindo herança com visibilidade.

Obrigado a todos pelas informações fornecidas!

Felipe de Alencar Albuquerque
[MSN]
LPJava
Forum Spammer
[Avatar]

Membro desde: 18/04/2006 12:50:23
Mensagens: 3839
Localização: Bahia
Offline

certo.. visibilidade é outra coisa.. mais segundo a kathy o membro nao é herdado.. seu filho tem o mesmo cpf que vc?
se tem um campo de cadatro cpf vc vai querer colocar private nao? para que outras classes nao acesse.. o membro..

veja em anexo o que kathy diz..
[Thumb - kathy.jpg]
 Nome do arquivo kathy.jpg [Disk] Download
 Descrição KATHY SIERRA - PRIVATE
 Tamanho 152 Kbytes
 Baixado:  58 vez(es)


Sun Certified Java Programmer 5.0
Blog! Atualizado 21/12 Habilidades Gerente de Projetos
http://camilolopes.wordpress.com
Colunista Java - Imasters http://www.imasters.com.br
Analyst Java Programmer - IBMistas
[WWW]
 
Índice dos Fóruns » Java Básico
Ir para:   
Apoiado e desenvolvido por Caelum Cursos Java - Powered by JForum 2.1.8 © JForum Team