您的位置:首页 > 编程语言 > Java开发

几种JAVA创建对象时内存的分配情况

2011-06-23 22:06 99 查看

  今天在装VS2008,实在是太墨迹了,顺便看了下JAVA基础,想到了几种JAVA创建对象的方式,对于其中内存的分配方式感到疑惑,于是就百度了下,下面做下总结:
  a)首先,我们应该要知道,在创建一个对象的时候,JAVA会用到内存里面的3个东西,
          堆:存放所用new出来的对象
          栈:存放对象的引用(也就是地址),基本数据类型产生的变量
          常量池:(这个比较特殊)是用来存放String常量,如“abc”
    注意:堆比栈的速度要慢很多,
  b)下面,分析下下面几种创建对象的方式:
     String a = "123";
     这是声明一个字符串常量,首先在常量池(如果是int或者其他基本类型,则是在堆中)
     中查找有没有这个“abcdef”,如果没有,在池中产生一个“123”,然后把引用赋值给栈中的a 

    String a = new String("123");
    因为有new,调用了String类的构造,在堆中产生了一个对象,值为“abcdef”,然后
     在栈中声明一个引用a,把产生的对象的引用赋值给a

  c)还有一个疑问:

     SomeClass a=new SomeClass();
     a=new SomeClass();
     new SomeClass();
     他们三者之间有什么区别和联系呢?

     SomeClass a=new SomeClass();
          1,SomeClass:栈中产生一个a对象,

          2,new SomeClass() 堆中产生一个对象

          3."="将new出来的对象地址赋给a 

     a=new SomeClass();

          1.new SomeClass();重新开辟一个对象

          2,“=”,将新对象地址赋给a

     new SomeClass();

     直接在堆中产生一个对象,但是没有传给栈中的一个引用(根据JAVA的垃圾回收机制,长时间不用,JVM会调用      

     System.gc()方法析构掉这个对象)。

很多都是网上拜读出来的,感觉很有用,就发出来了

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: