A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭俊 中级黑马   /  2013-7-23 17:07  /  1600 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 郭俊 于 2013-7-24 09:31 编辑

  一复习发现问题很多额,学了后面,又忘记前面的,啊啊,谁能就这个程序讲一下线程的运行啊运行不是先加载栈区吗,然后堆区,怎么走的啊,越详细越好
  1. package it.ihorse;
  2. public class Sample{
  3.         private int a;
  4.         public int method(){
  5.                 int b=0;a++;b=a; //主线程执行a++,然后在内存中怎么一个流程啊
  6.                 return b;
  7.         }
  8.         public static void main(String[] args){
  9.                 Sample s=null;int a=0;s=new Sample();
  10.                 a=s.method();
  11.                 System.out.println(a);
  12.         }
  13. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

4 个回复

倒序浏览
Sample s=null;
是先在栈中声明Sample的引用.
int a=0
在栈中又声明了一个int的变量a,初值是0
s=new Sample();
是在堆中创建一个Sample类的对象,并将地址赋给s;
a=s.method();
是method的方法进栈,
在method方法中,声明了一个int类型的变量b,初始是0.
a++将对象s中的a+1,a变为1;
b=a
将a的值赋值给了b(于是b=1),并返回了b的值
将b的值赋值给了main函数中的变量a,a=1
然后方法method()就弹栈了
然后输出a;a为1
接着main方法也弹栈了

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
/*
类首先加载,若程序中有静态代码块,那么静态代码块也跟着类的加载而加载。
接着main 函数压栈

Sample s=null;  //在栈中定义Sample类型的变量s,赋初值为null
int a=0;  //在栈中定义int类型的变量a,赋初值为0
s=new Sample();// 在堆内存中开辟空间,里面有 私有的成员变量 a,初始化值为0;
                                //在将堆内存的地址赋值给变量s
a=s.method();//method方法压栈,定义int类型的变量b,并赋初始值0; a++;是将a的值自增1  
                        //b=a; 将更新后的a的值赋值给b
return b;//返回b的值。 并赋给main方法中的变量a。

method 方法执行完后,就会将method方法弹出栈。

最后就是输出a的值了。

然后main方法也出栈。





*/

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
对象初始化
首先是加载类文件
然后通过new在堆内存开辟空间
然后对象中的属性默认初始化。
构造函数初始化
1.在构造函数中先到父类初始化
2.在构造函数中再进行显示初始化
3.在构造函数进行构造代码块初始化,
4.在构造函数中执行自定义的代码初始化
5.构造函数执行完,堆内存对象初始化完毕
接着就是执行主函数的内容。如果是new的话就会执行上面的new的流程,一般对象都在堆中,除了静态的会加载到类中的。如果是调入函数的话,就会按照栈的规律,加载进内存。运行完一个方法就弹出一个方法。
向下运行。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
本问题已解决,谢谢各位童鞋
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马