Herança por trás dos panos

16 respostas
gustavobs

Alguem sabe como a JVM lida com a herança? Como ela funciona internamente?

16 Respostas

dlt

Ótima questão. Eu tb não sei nada sobre isso. Fiz uma pesquisa básica no google e achei um link interessante que explica como o “super” é implementado.

http://coding.derkeiler.com/pdf/Archive/Java/comp.lang.java.programmer/2008-10/msg01053.pdf

Espero que alguém mais inteirado sobre o assunto apareça pra dar sua contribuição. :smiley:

M

Herança e polimorfismo: estão ligados. Para que servem?

Sugiro que leiam a apostila da Caelum FJ-11 capítulo 7. Bem explicado e com vários exemplos. Dá pra ter uma boa noção de herança.

gustavobs

Na verdade os conceitos básicos eu já sei…gostaria de saber como o compilador age… o que acontece internamente quando tu estende uma classe, por exemplo… se ele cria uma variável invisível da super classe com acessos especiais dentro da propria classe…

M

Quanto ao super, existem classes que herdam (são filhas) de outras (que por sua vez são “pais” ou superclasses). O super é a palavra chave usada para se referir à superclasse. Por exemplo:

import javax.swing.JFrame;
public class Janela extends JFrame {
    public Janela() {
        super("Minha janela"); 
        /* essa chamada do super refere-se 
         * ao construtor da classe pai, no caso,
         * JFrame
         */
        setSize(200, 200);
        setVisible(true);
    }

    /**
     * Aqui eu crio um método setVisible
     * que sobreescreve o da classe pai.
     * Ele não deixa a janela ser vista e
     * faz mais algo.
     */
    public void setVisible(boolean arg0) {
        super.setVisible(arg0);
        // faz algo a mais que a classe pai
    }
}

É isso aí. “super” nada mais é que uma referência à classe pai.

M

Acho que entendi agora…

Veja bem, quando você cria uma classe que estende JFrame e chama o seu construtor com “super”, é como se você estivesse instanciando normalmente um JFrame. Algo como:

JFrame frame = new JFrame("Título");

E todas as vezes que se faz uma referência com super, segue-se a mesma idéia. Usar “super.setVisible(false);” é algo similar à:

frame.setVisible(false);

“super” não tem segredo, é uma referência especial e funciona como outra referência qualquer. A grande diferença da herança é ter todos os métodos e características não-privadas da classe pai. A JVM, quando se chama o método setVisible(boolean arg0) da classe filha deve verificar (não sei ao certo): existe um método setVisible(boolean arg0) na classe filha? Se a resposta for sim, executa esse método. Se a resposta for não, procura na classe pai. A pergunta agora seria: existe um método setVisible(boolean arg0) na classe pai? Se sim, chama esse método, se não, verifica: existe algum método setVisible(boolean arg0) na classe pai da classe pai (poderia ser chamada de classe avó? :-D). Se sim, executa, se não continua a busca, até chegar em Object. Se não houver nenhum método em toda a hierarquia, lança um erro de compilação.

Era essa exatamente a dúvida?

gustavobs

Na verdade minha dúvida é um pouco mais complexa, não é essa parte didática, quero saber o como o compilador lida com isso internamente, o que ele faz eu sei… queria saber COMO ele faz…
Não diria que seria a nível de bytecodes… mas quase heheh

luistiagos

Não sei mas acredito que internamente ele trate tudo como sendo Object e suas classes filhas como sendo 1 só
ou seja qdo vc da new toda a hierarquia sera alocada em um espaço de memoria bastante grande para tal…
me corrija se falei besteira mas creio que é isto…

T

http://wikis.sun.com/display/HotSpotInternals/Home

Leia principalmente o link “Virtual Calls” (http://wikis.sun.com/display/HotSpotInternals/VirtualCalls)

M

Cara, para se você conseguir entender COMO a JVM funciona, parabéns. Já está na hora de criar su própria linguagem de programação. Isso é MUITO, MUITO, MUITO MESMO, complexo. Já se ouve dizer, quanto ao paradigma da orientação a objetos: interessa o que determinada classe faz, e não como ela faz.

Acho que a JVM funcionando, está bom. Mas se você quer se aventurar a entendê-la, boa sorte.

gustavobs

bom, isso é de cada um, algumas coisas eu me interesso saber como funciona pra entender melhor, quando se entende na base a funcionalidade tu consegue ter um campo de visão muito maior.

T

Dica: veja como é que isso funciona em C++ (Vtable) e chamadas de funções virtuais em C++. Pelo menos a JVM da Sun funciona bem parecido com C++ quanto a esse respeito.

S

marcobiscaro2112:
Cara, para se você conseguir entender COMO a JVM funciona, parabéns. Já está na hora de criar su própria linguagem de programação. Isso é MUITO, MUITO, MUITO MESMO, complexo. Já se ouve dizer, quanto ao paradigma da orientação a objetos: interessa o que determinada classe faz, e não como ela faz.

Acho que a JVM funcionando, está bom. Mas se você quer se aventurar a entendê-la, boa sorte.

Alguém tem que fazer a JVM, não é mesmo ?
Se ninguém entendesse como ela funciona ela simplesmente não existira.

A vida não é só aplicaçãozinha de TI.

E

http://www.guj.com.br/posts/list/77908.java

Acho que esse link vai lhe ser útil, já que se interessa por descobrir “como” as coisas funcionam.

aquele abraço

M

Ssalgado:
marcobiscaro2112:
Cara, para se você conseguir entender COMO a JVM funciona, parabéns. Já está na hora de criar su própria linguagem de programação. Isso é MUITO, MUITO, MUITO MESMO, complexo. Já se ouve dizer, quanto ao paradigma da orientação a objetos: interessa o que determinada classe faz, e não como ela faz.

Acho que a JVM funcionando, está bom. Mas se você quer se aventurar a entendê-la, boa sorte.

Alguém tem que fazer a JVM, não é mesmo ?
Se ninguém entendesse como ela funciona ela simplesmente não existira.

A vida não é só aplicaçãozinha de TI.


Alguém ou “alguéns”. A JVM foi criada e aprimorada por uma só pessoa? De fato a vida não se resume a “aplicaçãozinha de TI”, mas é bom ir com calma. Ou você quer aprender Java desenvolvendo a melhor aplicação do planeta? Começar a produzir seus próprios jogos, querendo que o primeiro saia melhor que o que uma equipe de centenas de pessoas levou anos para desenvolver. Aprender matemática começando pelos quatérnios?

Só lembrando essa é a área de Java Básico.

el_loko

gustavobs:
Na verdade minha dúvida é um pouco mais complexa, não é essa parte didática, quero saber o como o compilador lida com isso internamente, o que ele faz eu sei… queria saber COMO ele faz…
Não diria que seria a nível de bytecodes… mas quase heheh

[i]
O Java é Open Source!

Você pode ver como as coisas foram feitas e assim fica mais fácil entender como o compilador funciona.

http://www.sun.com/software/opensource/index.jsp
[/i]

Marky.Vasconcelos

marcobiscaro2112:
Cara, para se você conseguir entender COMO a JVM funciona, parabéns. Já está na hora de criar su própria linguagem de programação. Isso é MUITO, MUITO, MUITO MESMO, complexo. Já se ouve dizer, quanto ao paradigma da orientação a objetos: interessa o que determinada classe faz, e não como ela faz.

Acho que a JVM funcionando, está bom. Mas se você quer se aventurar a entendê-la, boa sorte.

A JVM não é tãooooooooo complicada assim… se voce entender C++ e compiladores voce já vai sabe praticamente como funciona.

Criado 15 de dezembro de 2008
Ultima resposta 16 de dez. de 2008
Respostas 16
Participantes 9