先看看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关键字创建的对象。

Java中的new关键字和引用传参的更多相关文章

  1. java中的 final 关键字 修饰引用时的问题

    final使得被修饰的变量”不变”,但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变. 引用本身的不变: final StringBuffer a= ...

  2. java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

    java中使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 是引用对象的地址值不能变,引用变量所指向的对象的内容是可以改变. final变量永远指向这个对象,是一个常量指针,而 ...

  3. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  4. 深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  5. 浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  6. (转)深入理解Java中的final关键字

    转自:http://www.importnew.com/7553.html Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方 ...

  7. [转载]浅析Java中的final关键字

    浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来 ...

  8. 转载:浅析Java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

  9. java中的final关键字

    谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字.另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法.下 ...

随机推荐

  1. windows服务那些事

    前一段时间由于项目需求,写了一个windows服务.下面总结如下: windows服务其实就是一些后台程序,和其他程序的主要区别是它运行于系统后台.微软公司为了方便我们自己定制我们的服务,提供了很多借 ...

  2. Java中break和continue的区别

    continue,继续下一个循环的运算, break,跳出循环

  3. mac --snip 滚动截屏

    1.snip 下载配置:https://jingyan.baidu.com/article/fec4bce2458d03f2618d8b8e.html 2.mac的火狐浏览器好像不支持,必须在sofa ...

  4. Java Web开发之路(一)——环境配置

    1. 下载JDK(Java Development Kit)工具包.其中包括运行Java程序所必须的JRE环境及开发过程中常用的库文件. (JDK与JRE的关系: JDK是Java的开发环境,在编写J ...

  5. 【BZOJ 2503】相框 图论+讨论

    这道题目就是考验了一下图论基本知识与对可爱的代码实现的应对能力. 我们先分析题干信息.我们要形成相框,那么所有的点的度为2(参与的点),那么所有度大于2的点都需要熔断,而且一次完成所有关于这个点的熔断 ...

  6. HDU3605:Escape(状态压缩+最大流)

    Escape Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  7. ionic安装遇到的一些问题

    ionic = Cordova + Angular + ionic CSS // 安装(失败的话 Mac 尝试使用 sudo,Windows 尝试管理员身份运行 cmd)$ npm install - ...

  8. barba 页面渲染

    a.css html, body { padding:; margin: 0 } ol.menu { width: 100%; text-align: left; padding: 0 !import ...

  9. MyBatis的SQL语句映射文件详解(三)----多参数传递的几种方式

    1.单一基本类型参数(String,int等) 单一的基本类型参数,将对应语句中的parameterType的值与参数的类型相同.然后直接 用“#{参数名}” 来获取 java代码 //String类 ...

  10. Web应用程序开发,基于Ajax技术的JavaScript树形控件

    感谢http://www.cnblogs.com/dgrew/p/3181769.html#undefined 在Web应用程序开发领域,基于Ajax技术的JavaScript树形控件已经被广泛使用, ...