先看看Java中如何使用new关键字创建一个对象的。

[java] view
plain
 copy

  1. public class Student {
  2. public String name;
  3. public int id;
  4. public static void main(String[] args) {
  5. Student s = new Student();//看这句话
  6. }
  7. }

语句Student s = new Student();可以拆成两句话:

语句1:Student s;在 栈 中创建一块空间,该空间的名字是s,变量s类型是Student指针类型看,值为空(不是null)。

语句2:s = new Student();首先在 堆 中创建一块空间,该空间存储的是Student类对象的成员变量;然后用s指向这块内存。

这两句话对应的内存变化如下图:

所以s中存储的s所指向的对象在堆内存中地址。

理解了new关键字创建对象的过程,再来看看引用传参。Java中的引用一共有三种,数组、类对象、接口,下面着重看看数组和类对象的传参过程。

[java] view
plain
 copy

  1. public class Test {
  2. public static void main(String args[]){
  3. int a[] = new int[3];
  4. a[0] = 1;
  5. a[1] = 2;
  6. a[2] = 3;
  7. int b[] = new int[3];
  8. b[0] = 4;
  9. b[1] = 5;
  10. b[2] = 6;
  11. b = a;
  12. b[0] = 7;
  13. b[1] = 8;
  14. b[2] = 9;
  15. System.out.println(a[0]+" "+a[1]+" "+a[2]);
  16. }
  17. }

语句 b =a; 之前的内存如图所示:

b = a执行之后,a的值(即第一个数组的首地址)被赋给b,则b也指向了第一个数组,内存如下图:

[java] view
plain
 copy

  1. b[0] = 7;
  2. b[1] = 8;
  3. b[2] = 9;

这三条语句修改了第一个数组中的值,内存如下:

输出结果如下:

下面来看类对象的情况(跟数组是类似的)

例2:

[java] view
plain
 copy

  1. public class Student {
  2. public String name;
  3. public int id;
  4. public Student(String name,int id){
  5. this.name = name;
  6. this.id = id;
  7. }
  8. public static void main(String[] args) {
  9. Student s1 = new Student("Tom",18);
  10. Student s2 = new Student("Sally",19);
  11. s2 = s1;
  12. s2.name = "Mark";
  13. s2.id = 20;
  14. System.out.println(s1.name+" "+s2.id);
  15. }
  16. }

语句s2 = s1;执行之前的内存状态如下图:

s2 = s1执行之后,内存状态改变为:

[java] view
plain
 copy

  1. s2.name = "Mark";
  2. s2.id = 20;

这两句话,修改了s1指向的对象的值,如下图:

输出结果如下:

最后看一下,s2原来指向的那块内存,现在没有引用指向它了,所以这块内存以及里面存的值都不能用了,Java存在"垃圾回收"机制,会定时清理没有引用指向的内存,所以这块内存会被回收,这与C++不同,在C++中,需要手动delete删除一个用new关键字创建的对象。

最新文章

  1. Linux下更新时间
  2. Android学习笔记(五)——活动的生命周期
  3. MySql查询数据库的大小
  4. MySql批量更新方法
  5. maven 编译报错 “找不到符号”
  6. 海康威视摄像头SDK-网页版(NetVideoActiveX23.cab安装)
  7. 教程 打造OS X Mavericks原版 EFI Clover 引导安装
  8. iOS学习,需要懂的一些基础
  9. SQL Server 触发器2
  10. R.layout.main connot be resolved 和R.java消失
  11. HDU - 1045 Fire Net(二分匹配)
  12. RabbitMQ学习3----运行和管理RabbitMQ
  13. 深入理解Java虚拟机--下
  14. Spring 链接数据库
  15. select中option的onclick事件失效
  16. python之模块hashlib(提供了常见的摘要算法,如MD5,SHA1等等)
  17. animation过渡效果
  18. Loadrunner解决启动浏览器后页面显示空白
  19. Disconf 学习系列之全网最详细的最新稳定Disconf 搭建部署(基于Ubuntu14.04 / 16.04)(图文详解)
  20. 发布.NET Core到IIS

热门文章

  1. Android Studio的初体验
  2. angular2采用自定义指令(Directive)方式加载jquery插件
  3. java连接mysql底层封装
  4. 算法(10)Subarray Sum Equals K
  5. IO调度
  6. text-overflow使用文字超多div的宽度或超过在table中<td>
  7. hdu 3496 Watch The Movie (二维背包)
  8. [luoguP3644] [APIO2015]八邻旁之桥(权值线段树)
  9. C语言一些常用的功能
  10. wyh的天鹅~vector的使用