要运行一个 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. NET Core,Ubuntu运行

    NET Core,如何开发跨平台的应用并部署至Ubuntu运行 之前写了一篇博文宣布Rabbit Rpc跨平台了“拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc”,在过程中尝试了如 ...

  2. RESTClient 控件 从服务器获得数据集 REST

    用TRESTClient控件调用REST架构服务 RESTClient控件返回数据集 用到的控件 RESTClient RESTRequest RESTResponseDataSetAdapter p ...

  3. ThinkPHP 3.1.2 视图-1

    一.模板的使用 (重点) a.规则 模板文件夹下[TPL]/[分组文件夹/][模板主题文件夹/]和模块名同名的文件夹[Index]/和方法名同名的文件 [index].html(.tpl) 更换模板文 ...

  4. 全栈JavaScript之路(七)学习 Comment 类型节点.

    凝视 在DOM中,用 Comment 类型 节点表示, 构造器函数为:  function Comment(){[native code]}. comment 节点的特征: nodeType:8 no ...

  5. ps快速删除圆角图片旁白的白色区域方法

    简单实用5招的ps快速删除圆角图片旁白的白色区域方法 1.图像-模式-rgb颜色 2.双击背景取消图层锁定 3.用魔棒工具点击要删除的区域 4.delete删除 5.另存为png图片

  6. react的初涉入

    1.react并不是一个完整的MVC,MVVM框架 它只负责view层 2.react跟Web Components不冲突 3.react的特点是“轻” 4.react用组件的方式重新思考构建UI的过 ...

  7. ios7以上自定义导航栏标题的字体大小及颜色的方法

    自定义导航栏的字体和颜色,只需要自定义一个lable,然后将lable添加到导航栏的titleview中就可以了 代码如下 UILabel *label = [[UILabel alloc] init ...

  8. 使用uWSGI+nginx部署Django项目

    最近使用django写了一些项目,不过部署到服务器上碰到一些问题,还有静态文件什么的一堆问题,这里总结一下碰到的问题和解决方案,总体思路是按照官方文档走的. 原文地址:http://uwsgi-doc ...

  9. [置顶] cocos2d-x 植物大战僵尸(13)类似酷跑的【同一角色不同动画间的切换的实现】

          有几天没和大家分享博客了,原因很简单,就是我在运行第12章所写的代码时:(开始一切正常,不过没多久就出现了内存泄露!.可能求成心切吧,当时没多加考虑就把代码发上去了.我在此对看过第12章得 ...

  10. Nginx 之一:编译安装nginx 1.8.1 及配置

    一:基介绍 官网地址www.nginx.org,nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的,开发工作最早从2002年开始,第一次公开发布时间 ...