JAVA 方法的入栈出栈问题
JAVA的方法入栈是把方法复制到栈内存里再执行还是有指向这个方法的地址去调用这个方法然后执行?之所以有这个疑问是因为:方法都存放在方法区里,而所有方法的执行都是在JVM栈...
JAVA 的方法入栈是把方法复制到栈内存里再执行 还是有指向这个方法的地址去调用这个方法然后执行?
之所以有这个疑问是因为:方法都存放在方法区里,而所有方法的执行都是在JVM栈中实现的,所以要把方法“入栈”,那么,入栈这个概念 到底是把所要用的方法复制到栈中执行, 还是栈中有个类似指针的引用地址指向方法区中的所用方法然后在方法区执行??
如果是在方法区执行的话,那入栈入到底入了什么 出栈又出了什么!? 展开
之所以有这个疑问是因为:方法都存放在方法区里,而所有方法的执行都是在JVM栈中实现的,所以要把方法“入栈”,那么,入栈这个概念 到底是把所要用的方法复制到栈中执行, 还是栈中有个类似指针的引用地址指向方法区中的所用方法然后在方法区执行??
如果是在方法区执行的话,那入栈入到底入了什么 出栈又出了什么!? 展开
展开全部
你得明白栈的定义。代码执行的时候是执行一个方法,执行完,返回方法的上一个代码块继续往下执行后面的内容。这样的话是不是就是一个栈结构了?先进后出。方法一边执行,一边往栈里面存数据,等执行完了就取出数据(取出的是返回值,是最后一个存进去的 栈结构是后进先出),然后执行外面的代码。这么说你可能不明白,我给你举个例子。
int sub(int a,int b){
return a+b;
}
int c = sub(2,3);//注意执行这条语句的时候是不是执行了一个方法?
//那么语句执行的时候是要从左往右执行的对吧,但是事实的逻辑却是先算出来sub(2,3)这个方
//法的返回值,然后再把返回值(5)赋值给 c ,那么这个怎么实现,肯定是一个栈的数据结构,编译的时候先把”int c = “入栈,然后再把 sub(2,3),入栈,执行的时候,从栈里面取,取的第一个肯定是sub(2,3)吧?于是就计算出等于5,继续取,取出了int c =,然后就和5对接上了,就把值赋给c了。这只是一个小例子。
道理是这样,但是具体的存取可不是这样的哦。具体的存取应该分的非常细腻,应该是按照java语法的最小单位来往栈里存取的。说白了一句话,程序运行的时候的先后顺序是跟人大脑想问题的顺序一样的,但是代码不是按照这样的顺序写的(从左到右),于是就用栈结构来达到这样的效果。
这么说,明白了吗?
int sub(int a,int b){
return a+b;
}
int c = sub(2,3);//注意执行这条语句的时候是不是执行了一个方法?
//那么语句执行的时候是要从左往右执行的对吧,但是事实的逻辑却是先算出来sub(2,3)这个方
//法的返回值,然后再把返回值(5)赋值给 c ,那么这个怎么实现,肯定是一个栈的数据结构,编译的时候先把”int c = “入栈,然后再把 sub(2,3),入栈,执行的时候,从栈里面取,取的第一个肯定是sub(2,3)吧?于是就计算出等于5,继续取,取出了int c =,然后就和5对接上了,就把值赋给c了。这只是一个小例子。
道理是这样,但是具体的存取可不是这样的哦。具体的存取应该分的非常细腻,应该是按照java语法的最小单位来往栈里存取的。说白了一句话,程序运行的时候的先后顺序是跟人大脑想问题的顺序一样的,但是代码不是按照这样的顺序写的(从左到右),于是就用栈结构来达到这样的效果。
这么说,明白了吗?
追问
你说的我看明白了 ,很详细,谢谢,不过还是有一个问题:在执行的时候,执行到了sub(2,3),他是怎么读取方法区中的那段sub的方法代码的?还有就是2+3这个计算的过程是发生在栈中内存吗?如果是,那么把 sub(2,3)入栈,入栈的内容是不是就是整个sub代码:int sub(int a,int b){
return a+b;
}也就是把这块代码的字节码复制到了栈内存中??
展开全部
和你说下 堆和栈 都属于内存中 当然java虚拟机内存里还有一部分static 静态常量存放的区域也属于内存中
你说的那些方法啊什么的 具体方法的代码都是储存在硬盘中的 只有当类加载的时候才把这个类存放在方法区里
Object obj=new Object()
栈
存放通常说的对象的引用 obj 就是存一个名字
堆
存放通常说的实体对象 即 栈中的引用指向堆中的一个具体对象new Object() 在堆中开辟内存 放对象内容
当然特殊的情况就是java 基础变量 int a=1 a 和 1 都存储在栈中
针对什么
入栈出栈
因为java虚拟机自己有回收垃圾的机制
什么是垃圾
就是栈中存放的一些引用 没有指到一个具体的实例对象
还有就是局部变量跑完了自己的方法体
被虚拟机干掉
你说的那些方法啊什么的 具体方法的代码都是储存在硬盘中的 只有当类加载的时候才把这个类存放在方法区里
Object obj=new Object()
栈
存放通常说的对象的引用 obj 就是存一个名字
堆
存放通常说的实体对象 即 栈中的引用指向堆中的一个具体对象new Object() 在堆中开辟内存 放对象内容
当然特殊的情况就是java 基础变量 int a=1 a 和 1 都存储在栈中
针对什么
入栈出栈
因为java虚拟机自己有回收垃圾的机制
什么是垃圾
就是栈中存放的一些引用 没有指到一个具体的实例对象
还有就是局部变量跑完了自己的方法体
被虚拟机干掉
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询