论坛首页 Java版 OO

java:对象创建和初始化过程以及局部变量内存分配问题

浏览 190 次
精华帖 (4) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-04-26 关键字: 变量内存分配
在网上查了很多资料,对象的创建的大致过程如下
1.首先为对象分配内存空间,并把成员变量和方法初始化。包括变量和方法,都被复制到属于此数据类型的一个新的实例

2.然后执行显示初始化,即执行在类成员声明时带有的简单赋值表达式
3.执行构造方法,进行对象初始化。

但都没有提到关于方法里局部变量是何时创建和分配内存的

Single.java
  public class Single {
	public static Single single;
	private Single(){
	}
   public static Single getInstance(){
	   if(single==null)
	   {
		   single=new Single();
	   }
	   return single;
   }
   public void test(){
	   for(int i=1;i<=10;i++){
		   if(i%2==0){
			   for(int k=1;k<=100;k++)
			   System.out.print("0");
		   }
		   System.out.println(""+i);		   
	   }
   }
}

TestTread.java
public class TestThread extends Thread{
  public void run(){
	  Single.getInstance().test();
  }
  public static void main(String arg[]){
	  Thread t1=new TestThread();
	  Thread t2=new TestThread();
	  t1.start();
	  t2.start();
  }
}



这里t1和t2两个线程调用的是同一个对象同一个方法,stack中的引用和heap中实际的对象都是一致的。但test()里面的i变量是互不关系的,即t1的线程i改变不会影响t2线程的i。如果说局部变量有多个副本,那么它是如何确定哪个变量是属于哪个线程的?
   
时间:2008-04-28
建议看看JVM相关的资料,
首先,方法的局部变量的初始化和对象的初始化无关;
其次,某个线程调用方法时,jvm创建新的帧并压入堆栈,方法的本地变量会保存到这个帧里,不同的线程当然帧也是不同的。
   
0 请登录后投票
论坛首页 Java版 OO

跳转论坛:
JavaEye推荐
    快速回复 引用上一条消息 (Alt+S)