java 引用、对象

来源:互联网 发布:平板炒股软件 编辑:程序博客网 时间:2024/06/07 19:37

在java中有一个比较容易混淆的概念就是关于对象和对象的引用。在这里就谈谈本人自己对这部分内容的理解。

首先来看下一中最常见的java创建对象的方式:Person zhangsan = new Person();,这里的Person 是自己定义个一个类。

上面的一行语句可以分为3部分理解:

  1,等号的右边,也就是 new Person();这里通过new关键字创建了一个Person类的对象,并在堆内存中为其分配内存。

2,等号左边,也就是Person zhangsan;这里声明了一个变量,变量的类型为Person。这个时候zhangsan这个变量是没有任何值的,也就是说不能通过zhangsan这个变量去引用Person类中的方法。

3,=号,=号的作用就是将1中创建的对象在内存中存放的地址交给了2中创建的变量zhangsan,也就是说变量zhangsan持有了一个1中创建Person对象的引用、通过引用就可以控制2中的对象的值。

将上面的过程用图来表示就是


接下来再看下引用的赋值:

Person lisi = zhangsan;通过这句把zhangsan赋值给变量lisi。前面说过zhangsan这个变量中存贮的是一个Person对象在内存中的地址,这里把这个值也赋给lisi,那么lisi这个变量也就指向了zhangsan指向的对象。也就是


这样,zhangsan和lisi是两个不同的变量,但是他们都指向同一个对象,即他们是这个对象的两个引用。上面说过,对象里存储的值是通过引用来访问和改变的,那么现在zhangsan和lisi都指向同一个对象,那么就意味着改变lisi的值,zhangsan的值也会跟着变。

这里我们假设Person类中有一个int age的变量,并且有相应的get和set方法。如果 lisi.age = 5;。那么zhangsan.getAge()返回的也是5。同理,通过zhangsan.setAge(8),那么通过lisi.getAge()得到的值也为8。


对引用为null的理解。

还是引用前面的例子,如果zhangsan = null;那么这时lisi会为null吗?这里当然是不会的。因为这里的zhangsan = null,并不是把zhangsan这个引用所指向的对象变为null,而是将zhangsan这个变量与之前的引用断开,也就是说zhangsan这个变量不在指向一个对象了。但这里不会影响lisi继续指向之前的变量。也就是



对垃圾回收的理解。

java带有垃圾回收机制,就是一个对象在没有什么引用的情况下,系统会将其占用的内存回收调。在上面的例子中就是如果 Person对象没有引用的话,就会等待垃圾回收机制回收它所占用的内存。这里回收的不是zhangsan、lisi这些变量,而是他们所指向的对象的内存。也就是图中方框里的对象所占的内存。

0 0
原创粉丝点击