java 引用、对象
2015-09-21 12:22
281 查看
在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这些变量,而是他们所指向的对象的内存。也就是图中方框里的对象所占的内存。
首先来看下一中最常见的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这些变量,而是他们所指向的对象的内存。也就是图中方框里的对象所占的内存。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序