java语言取消了指针的概念,不管其他人怎么想,对于我来说可是好事情,学习c++的时候可是让指针把我害苦了。但是接触了java一段时间发现自己经常忽略对象和引用的区别。因此找了些资料从新学习了一下。 


 c和c++都是通过指针操作对象。java里 一切都是对象,虽然这么说,其实真正操作对象的是引用。要使想用对象首先要将类实例化成对象,通常是使用“new”操作符,这样就在内存中分配一块空间给对象。想要对对象进行操作就要用到引用,通过“new”操作符实例化的对象是放在“堆“(一种通用的内存池,用于存放所有的java对象。编译器不需要知道该分配多少存储区域,也不必知道存储的数据在堆里存活多少时间)里面,而引用是被放在”栈“(位于通用RAM中,编译器需要知道存储在这里的所有数据的确切大小以及生命周期,因此某些java数据存储和对象引用存储在里面)里面的。


java 对象放集合的引用过程 java中的对象和引用_存储

java 对象放集合的引用过程 java中的对象和引用_存储_02

public 
    
  class 
   TestObj  
  ... 
  {
    public int sum(int x,int y) ...{
        int z=x+y;
        return z;
    }

    public void message(String str) ...{
        System.out.println(str);
    }
} 
  

 
  public 
    
  class 
   Test  
  ... 
  {
    public static void main(String[] args) ...{
        TestObj obj=new TestObj();
        System.out.println(obj.sum(1,9));
        obj.message("hello");
    }
}

这里obj就是一个引用,它指向一个Obj的对象。在这里obj是一个存放引用的变量,它有生存期,生存期结束即销毁,但是它原来操作的对象还保留在内存当中不会被销毁,只有Java的垃圾收集器才能决定在适当的时候回收对象占用的内存。 

  形象的说,引用和对象的关系相当与一个勺子,有勺头和勺把,将一个类实例化成一个对象后会在内存中相应的地方为引用和对象分别分配空间,要想使用勺子没有勺把是不行的,就像要操作对象就要有引用一样,对引用操作实际就是操作对象,即使勺把(引用)坏了,扔掉了但是勺子(对象)仍在,如果有新的勺把(引用)按在勺子上,勺子依旧可以使用,没有了勺把的勺子就不能用了,要等待垃圾收集器回收了!