Java对象与对象引用变量的理解

来源:www.cnblogs.com 更新时间:2023-05-25 21:55

Java对象及对象引用

  首先定义一个简单的类:

  class User{

    int userId;

    String userName;

  }

  我们在创建对象时,通常会写:

     User user = new User();

  这个操作包含了四个动作。

  1)右边的"new User",是以User为模板,在堆(heap)中创建一个User类对象(也可以说User对象)。

  2)末尾的()意味着,对象创建后,立刻调用User类的构造函数,对刚生成的对象进行初始化。构造函数肯定是有的,如果你没有写,Java会给你补上默认的构造函数。

  3)左边"User user"创建了一个User类引用变量。User类引用就是以后可以用来指向User对象的对象引用。

  3)"="操作符使对象引用指向刚创建的那个User对象。

  为了更好的理解,拆分成两步:

  User user;

  user = new User();

  功能效果是一样的,这样就比较清楚了,有两个实体:一个是对象引用变量,一个是对象本身。

  一般引用是存放在栈(stack),对象存放在堆(heap)

  我们创建对象,为什么还要创建对象引用变量?

  因为创建的User对象是没有名字的,可以认为是User类名称(对象的创建模板)

  所以一个User类可以据此创建无数个对象,且这些对象不能全叫"User"。

  我们不能直接访问,只能通过对象引用来间接访问对象。

  理解到这里,拓展下这里的知识:

  For Example:

  User user_1 = new User();

  User user_2;

  user_2 = user_1;

  这里解释下,user_2没有指向对象,但是发生了复制行为,要说的是,对象没有被复制,被复制的只是对象引用。结果是,user_2也指向了user_1所指向的对象。

  以此类推:

  user_2 = new User();

  则表示user_2引用变量修改指向第二个User对象。

  得出结论:

  1)一个对象引用可以指向一个或多个对象

  2)一个对象可以有N个引用指向它

  再拓展下:

  user_1 = user_2;

  现在user_1也指向了第二个User对象,那么第一个User对象呐?因为没有被使用到,就会被Java垃圾回收处理机制回收了,至于什么时候回收,要看垃圾回收机制的策略或者心情了,就是等待JVM回收。

  以此类推,一些没有引用指向的对象,都会被丢弃,等待JVM回收

  For Example:

  new User();

  System.out.println("Hello World!");