Boas,
Sempre que programo preocupo-me muito com a memória do computador, acho que às vezes até me preocupo demais o que me deixa um bocado limitado mas de qualquer maneira a minha questão é esta… vejam o código abaixo:
class A {
void methodX() {}
}
class B extends A{
void methodY() {}
void methodZ() {}
}
Neste caso sempre que eu criar um objecto da classe B também será criado automaticamente um da classe A certo?
Agora vejam este …
class C {
void methodX() {}
void methodY() {}
void methodZ() {}
}
Agora esquecendo o que é correcto ou não de fazer, porque eu sei que é mais facil extender uma classe de outra do que voltar a criar uma com todos os metodos da classe base mais os que quero adicionar, até porque não é essa a ideia da programação orientada a objectos. A minha questão é apenas… se eu criasse um objecto da class B e outro da C, qual deles ocuparia mais espaço na memoria? os exemplos q dei são mto simples mas era para perceberem a ideia, imaginem exemplos mais complexos… o que acham?
Será que o C ocupa o mesmo que o B porque na realizade o B é uma fusão do B+A ? ou será q o B ocupa mais por serem criados dois objectos?
PEACE
Na falta de alguma outra resposta, vou dar a minha opiniao baseada totalmente em teorias e sem conclusao definitiva alguma.
Quando voce estiver usando heranca, sera necessario ter algumas referencias a mais em memoria, pois eh necessario saber se o metodo eh da classe pai ou da classe filha. Veja, apenas as referencias, nao os objetos inteiros. Isso eh coisa minima, nao ira fazer diferenca alguma ( nao-significativa ) quanto ao uso de memoria.
Em todos os casos, o ClassLoader carrega em memoria as referencias dos metodos, eh so cria os objetos quando voce chamar ele. A diferenca entre heranca ou nao eh que vai ser preciso saber se o metodo eh da classe pai ou da classe filha, soh isso.
Nao justifica a solucao que vc colocou como exemplo, pois - mesmo que usasse um minimo a mais de memoria -, as perdas em termos de usabilidade e funcionalidade seriam enormes.
Rafael
ps: como eu disse, tirei conclusoes sem pesquisar pra confirmar
Pra cada método, um ponteiro. Isso significa que um objeto da classe B tem 3 ponteiros para métodos, a mesma coisa que um objeto da classe C. São ambas subclasses de Object, então a menos que vc esteja sobreescrevendo um método de Object (como equals(Object), por exemplo), vc vai ter ponteiros pra esse métodos também.
todos os objetos têm uma referência para a própria classe, e podem falar com ela pelo método getClass(). As classes também têm ponteiros para os método definidos nela. No caso, a Classe B tem 2 ponteiros, enquanto a Classe C tem 3. Note que esses ponteiros são da classe, não são repetidos para todas as instâncias.
Note que para fazer um design OO melhor, vc economizou uma referência interna apenas, não importando quantos objetos vc crie.
[]s
Esqueci de falar duas coisas:
-
eu tb to falando sem conhecimento profundo sobre o tema… 8)
-
Quando vc tem membros (variáveis de instância), a coisa muda um pouco, mas segue a mesma linha.
aquelão!!