要运行一个 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. LintCode-删除元素

    题目描述: 给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 样例 给出一个数组 [0,4,4,0,0,2,4,4],和值 4 返回 ...

  2. Spring RESTful服务接收和返回JSON最佳实践

    http://blog.csdn.net/prince_hua/article/details/12103501

  3. 两种解决Qt5显示中文乱码的方法(使用QStringLiteral和#pragma execution_character_set("utf-8")两种方法)

    升级到Qt5.X之后,原先解决的Qt显示中文乱码的方法突然不适用了,找了很多方式来解决这个问题第一种:在公司代码里看到的方法,先将对应的cpp文件用windows自带的记事本打开,另存为UTF-8格式 ...

  4. DataTabe对象的例子

    前: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="DataTable对象 ...

  5. 如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

     如果某企业在 Windows Azure 上托管某个应用程序,该应用程序会在某个特定时间暴露到 Internet,以用于商业用途.公共 Internet 带来 客户的同时也带来了攻击者. Tim ...

  6. Sicily-1443

    一.      题意: 模拟队列的操作,按优先级pop.如果有元素pop,则其他在队列里面的元素的时间都要加1.如果队头的元素因为优先级不够高而要push回队列的时候,所有元素的时间都不用改变. 二. ...

  7. [Django实战] 第8篇 - 分页列表

    当用户登录成功后,首先看到的是他自己之前提交的任务列表,本篇将实现该页面. 视图(views.py)里定义如下: from django.core.paginator import Paginator ...

  8. Oracle语句优化规则(二)

    21.       用EXISTS替换DISTINCT 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换  例如: ...

  9. codeforces 464B Restore Cube

    题目链接 给8个点, 判断这8个点能否组成一个正方体, 如果能, 输出这8个点. 同一个点的x, y, z可以交换. 每一个点有6种排列方式, 一个8个点, 暴力枚举出所有排列方式然后判断能否组成正方 ...

  10. U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统

    <一>支持网卡芯片DM9000 在driver下,有网卡驱动DM9000x.c 和 DM9000x.h DM9000接在BANK4,位宽16 在include/configs/TX2440 ...