Alguem sabe como a JVM lida com a herança? Como ela funciona internamente?
Ó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.
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.
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…
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.
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?
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
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…
http://wikis.sun.com/display/HotSpotInternals/Home
Leia principalmente o link “Virtual Calls” (http://wikis.sun.com/display/HotSpotInternals/VirtualCalls)
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.
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.
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.
[quote=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.[/quote]
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.
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
[quote=Ssalgado][quote=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.[/quote]
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.[/quote]
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.
[quote=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[/quote]
[i]
O Java é Open Source!
Você pode ver como as coisas foram feitas e assim fica mais fácil entender como o compilador funciona.
[quote=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.[/quote]
A JVM não é tãooooooooo complicada assim… se voce entender C++ e compiladores voce já vai sabe praticamente como funciona.