当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

酷酷杰伦

拥有积分:16
这家伙太懒,还没有签名!

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

java程序在内存中的运行过程

酷酷杰伦 发表于 2年前 (2014-08-12 20:06:36)  |  评论(0)  |  阅读次数(552)| 0 人收藏此文章,   我要收藏   
摘要 简介一个简单java程序在内存中的运行步骤

首先简单的对内存分布进行一个分析,如下图:

具体的用以下代码做分析,解析以下代码在内存中的运行情况。代码如下:

public class Point {
	double x,y,z;	
	
	public Point(double x, double y, double z){
		this.x = x;
		this.y = y;
		this.z = z;
	}
	
	
	
	public double getDistance(Point p){
		double juli = Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y)+(this.z-p.z)*(this.z-p.z));
		return juli;
	}
	
	
	public static void main(String[] args) {
		Point p = new Point(3,4,5);
		System.out.println(p.y);
		
		Point p2 = new Point(20,30,50);
		
		double  d = p.getDistance(p2);
		System.out.println(d);
		
	}
}


 

具体分析代码在内存中的运行情况如下:

第一步:内存加载Point类的信息,如下图:

第二部:程序寻找main方法入口。

  在栈中为main方法开辟一块区域,然后我们在来看代码,首先有一个变量p,通过new Point 调用Point构造方法,在堆中创造一个对象,假设它在内存中的地址是1001,里面的内容有x,y,z,初始值都是0,还有GetDistance()方法,其中GetDistance方法指向的是Point类中的GetDistance,如下图:

第三部:在栈中开始调用Point方。

执行以下代码:

this.x = x;
this.y = y;
this.z = z;

注意此时this指向的是之前创造的对象的地址即1001,

执行完的结果就是之前创造的对象中的x变为3,y变为4,z变为5.

直到此时第一次Point方法调用完毕出栈,内存变换过程如下图:

第四部:关于p2变量的操作。

  跟p变量操作一样,首先在栈中开辟一块区域用来执行Point()方法,然后通过new Point 第二次调用Point方法在堆中创建一个对象,我们假设它的地址就是1002,对象中包括初始值x=0,y=0,z=0,以及GetDistance()方法,等到栈中调用的方法执行完毕,返回给一个值给main函数,此时p2中存放了1002这个地址,最后执行出栈操作。注意:之前在栈中执行的方法已经出栈。内存变化如下图:

第五步:关于变量d的操作。

  首先d调用了p.GetDistance ,因此在栈中开辟一块区域存放p调用的GetDistance()方法,通过p.GetDistancd调用,而实际参数为p2,即1002中的数据,而当调用1001的时候默认传递一个this,this为调用方法所在的对象,即this为1001,接下来执行GetDistance()方法中的代码

double juli = Math.sqrt((this.x-p.x)*(this.x-p.x)+(this.y-p.y)*(this.y-p.y)+(this.z-p.z)*(this.z-p.z));
return juli;

根据之前的分析不难得出this.x为1001中的数据,p.x为1002中的数据,由此得出d的结果为54.

最后输出打印d为54,运行完出栈。内存变化如下图:



 

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183