Main方法的执行过程(转)

要运行一个 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

时间: 2024-07-30 20:41:40

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

方法的执行过程

方法的执行过程 先看如下代码: public static void main(String[] args){ int i = 1024; m1(i); System.out.println("monkey1024"); } public static void m1(int i){ m2(i); } public static void m2(int i){ m3(i); } public static void m3(int i){ System.out.println("

让一个东西在main方法之后执行

让一段程序在main方法之前之前我们都知道很简单,用static静态块就可以 但是要让一个东西在main结束之后执行(不考虑新开启一个线程的情况...) 这里要从java的回收机制出发,因为如果只有main这一个线程的话,在main结束之后就意味着整个程序结束了 那就得考虑让程序结束之后还可以干点事 或者是说成是 我的程序"结束"之后,给java虚拟机留点事情 实现方案 自己写一个类Demo 复写一下finalize()方法,在里面打印一条消息 (这个方法在对象被java回收机制 回收

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

1.新建一个java请求执行加法类 public class TestDemo { public int Tdemo(int a,int b){ int sum = 0; sum = a+b; return sum; } } 2.再建一个jmeter的java请求类 import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;

Linux中Main函数的执行过程

1. 问题:Linux如何执行main函数. 本文使用一个简单的C程序(simple.c)作为例子讲解.代码如下, int main() { return(0); } 2.  编译 -#gcc -o simple simple.c 3. 查看可执行文件的基本信息 -#objdump -f simple simple: file format elf32-i386 architecture: i386, flags 0x00000112: EXEC_P, HAS_SYMS, D_PAGED sta

Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题.以下是本文的目录大纲: 一.static关键字的用途 二.static关键字的误区 三.常见的笔试面试题 若有不正之处,希望谅解并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnb

电脑从开机加电到操作系统main函数之前执行的过程

总的来说在操作系统加电启动之后到main函数执行之前操作系统经历了以下3个大步骤 1.启动BIOS.这个时候位于实模式下,加载中断向量和中断服务程序 2.加载操作系统内核并为保护模式做准备.这个时候操作系统一共加载了3部分代码:引导程序bootsect,内核代码setup,内核代码system模块 3.从实模式转换为32位保护模式.这个过程要做大量重建工作,并且持续工作到操作系统main函数的执行过程.细说的话,主要包括打开32位寻址空间,打开保护模式,建立保护模式下的中断相应机制与保护模式配套

【转载】Java中System.loadLibrary() 的执行过程

最近复习JNI,通过AndroidStudio导入源码一点点的跟踪分析so库的加载过程. 在网上发现有其他同学做了同样的工作,对比文章看起来更加轻松.感谢他们的工作!下面是其中比较好的一篇的转载. 原文链接:http://my.oschina.net/wolfcs/blog/129696 未经许可转载,如有侵权,请联系我删除. 目录[-] 系统的library path Native 层load library的过程 System.loadLibrary()是我们在使用Java的JNI机制时,会

Java中JIN机制及System.loadLibrary() 的执行过程

Android平台Native开发与JNI机制详解 http://mysuperbaby.iteye.com/blog/915425 个人认为下面这篇转载的文章写的很清晰很不错. 注意Android平台上的JNI机制使用包括Java代码中调用Native模块以及Native代码中调用Java模块. http://www.ophonesdn.com/article/show/263(misybing:很遗憾该站已经挂掉) 众所周知,OPhone平台上的应用开发主要基于Java语言,但平台完全支持且

JAVA的main方法

在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方 法有很大的不同,比如方法的名字必须是main,方法必须是public static void 类型的,方法必须接收一个字符串数组的参数等等. 在看Java中的main()方法之前,先看一个最简单的Java应用程序HelloWorld,我将通过这个例子说明Java类中main()方法的奥秘,程序的代码如下: public class HelloWorld