要运行一个 main 方法 , 首先要知道 main 方法所在的 Class, 在命令行中指定这个 Class 名

Class Lava{

Private int speed = 4;

Void flow(){

}

}

Class Volcano{

Public static void main(String[]  args){

Lava lava = new Lava();

lava.flow();

}

}

Java Lava

1.        当虚拟机接受到这样的命令后 , 就从 class 文件 (Volcano.class) 中提取类型信息放到方法区中

2.        执行这个类字节码 , 即执行 main() 方法 . 在执行时会一直指向当前类的常量池的指针

3.        main() 方法的第一条指令告知虚拟机为列在常量池第一项的类分配足够的内存

4.        第一项是 Lava 的符号引用 , 然后去装载这个 class 文件到方法区 , 然后把第一项的符号引用改成一个指针 , 这个指针指向方法区中 Lava 类数据 . 以后就可以快速的用指针访问了 .

5.        实例化 Lava 时 , 为 Lava 分配内存 . 这个内存的大小是通过存储在方法区中的类型信息中获得的

6.        把新生的 Lava 对象压到栈中 ,main() 方法的第一条指令就完成了

为什么必须要求 : 通过对象能够找到他的类型信息呢 :

答 >>1. 当一种类型转化成另一种类型时 , 虚拟机要检查能否进行转换 , 如

List list = new ArrayList();

虚拟机怎么知道 ArrayList 能够转换成 List 类型呢 ? 只能去方法区中查看类型信息 .

2.instanceof 也是如此

3. 当程序调用实例的方法时 , 虚拟机必须进行动态绑定 . 换句话说 , 不能按照引用的类型来决定调用的方法 , 必须根据对象实际的类型进行调用 . 举例如下 :

List list = new ArrayList();

list.size();

执行 size() 方法时 . 是执行 List 类型的 size() 呢还是 ArrayList 的 size() 呢 ? 虚拟机就去找类型信息 , 再决定执行哪个 .

上面只是举例 , 当然 List 是接口是不能执行的 .

关于对象的方法表 :

不管虚拟机的实现使用什么样的对象表示方法 , 一般的对象都有一个方法表 , 方法表可以加快调用实例方法时的效率 ----- 很快可以找到要执行的代码

http://www.blogjava.net/esoa/articles/89400.html

Main方法的执行过程(转)的更多相关文章

  1. Java 调用对象方法的执行过程

    弄清调用对象方法的执行过程十分重要.下面是调用过程的详细描述: 1) 编译器查看对象的声明类型和方法名.假设调用x.f(param),且隐式参数x声明为C类的对象.需要注意的是:有可能存在多个名为f, ...

  2. 事件之onTouch方法的执行过程 及和 onClick执行发生冲突的解决办法

    转载:http://blog.csdn.net/jiangwei0910410003/article/details/17504315#quote 博主推荐: 风萧兮兮易水寒,“天真”一去兮不复还.如 ...

  3. Android中onTouch方法的执行过程以及和onClick执行发生冲突的解决办法

    $*********************************************************************************************$ 博主推荐 ...

  4. 第30篇-main()方法的执行

    在第7篇详细介绍过为Java方法创建的栈帧,如下图所示. 调用完generate_fixed_frame()函数后一些寄存器中保存的值如下: rbx:Method* ecx:invocation co ...

  5. 1.4 如何在main()方法之前执行输出“hello world”

    public class Test{ static{ System.out.println("hello world"); } public static void main(St ...

  6. jmeter 的java请求代码在main方法里面执行

    1.新建一个java请求执行加法类 public class TestDemo { public int Tdemo(int a,int b){ int sum = 0; sum = a+b; ret ...

  7. Linux中Main函数的执行过程

    1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, int main() { return(0); } 2.  编译 -#gcc -o ...

  8. Linux系统中,main函数的执行过程

    http://blog.csdn.net/rrerre/article/details/6728431

  9. jvm——Java main方法的执行

    这是什么神仙博客! https://www.cnblogs.com/kaleidoscope/p/9629156.html

随机推荐

  1. 用JS画斐波那契螺旋线(黄金螺旋线)

    偶然看到斐波那契螺旋线(黄金螺旋线)的定义及画图方法,试着用JS画了一下,很漂亮,很好玩 具体定义及画法大家查一下就有了,很简单. 以下是代码: <!DOCTYPE html> <h ...

  2. Android 百度地图开发问题----解决地图有时候加载不出来问题

    相信很多人在开发百度地图的时候会出现百度地图有时候会加载不出来,只显示网格图. 这个问题究其原因就是申请百度key的时候填写的SHA1也就是指纹证书有问题.估计很多开发者都是照着百度开放平台上介绍的流 ...

  3. 宣布在日本地区正式发布 Windows Azure

     昨天,我与 Microsoft 日本的集团副总裁 Yasuyuki Higuchi 一同站在台上,宣布在两个新地区正式发布 Windows Azure:日本东部和日本西部.能够亲自见证 Micr ...

  4. HDU 2215 Maple trees

    增量法的最小包围圈算法,不会…… #include <cstdio> #include <cstring> #include <iostream> #include ...

  5. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  6. 测试横竖屏切换时activity 的生命周期

    对于这个面试题,相信大家都见过,网上给出的答案是: 1.不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次 2.设 ...

  7. QQ聊天原理初识

    1:qq之间文件的传输是通过p2p通信进行的. 2:qq之间的表情发送实际上就是文字的发送,是client再接受到文字之后在本地自己进行转换 3:qq之间的通信既能够通过udp也能够通过Tcp 尽管u ...

  8. hdu 3966 Aragorn&#39;s Story(树链剖分+树状数组)

    pid=3966" target="_blank" style="">题目链接:hdu 3966 Aragorn's Story 题目大意:给定 ...

  9. 禁用Visual Studio 2013的Browser Link功能

    禁用Visual Studio 2013的Browser Link功能 GET http://localhost:37478/7fd25f8af33f443494e765be19be6240/brow ...

  10. Sql缓存依赖--数据库缓存

    •依赖于文件内容CacheDependency cDep = new CacheDependency(filePath); •依赖于数据库内容(轮询机制/通知机制)一:轮询机制 1.在数据库新建版本表 ...