先看看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. lincode-58-四数之和

    58-四数之和 给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d). 注意事项 四元组(a, b, c, d)中,需要满足a <= b &l ...

  2. lintcode-101-删除排序数组中的重复数字 II

    101-删除排序数组中的重复数字 II 跟进"删除重复数字": 如果可以允许出现两次重复将如何处理? 样例 标签 数组 两根指针 脸书 思路 参照上一篇博客lintcode-100 ...

  3. 入口文件-npm run dev

    如果你是用vue.js官网提供的脚手架工具并沿用默认配置的话,你执行npm run dev的时候会出来页面,是因为你根目录下的package.json文件里script配置了"dev&quo ...

  4. NotifyIcon控件

    NotifyIcon就是系统托盘控件.通知区域中的图标是一些进程的快捷方式,这些进程在计算机后台运行,如防病毒程序或音量控制.这些进程不会具有自己的用户界面.NotifyIcon 类提供了编写此功能的 ...

  5. [NOIP2016]换教室 期望dp

    先弗洛伊德,然后把状态拆分遗传 #include<iostream> #include<cstdio> #include<cstring> #include< ...

  6. Mybatis LIKE模糊查询

    1.在代码中拼接好字符串后传入进来 2.使用CONCAT在xml中拼接字符串: <if test="queryParam.keyword != null"> AND b ...

  7. angular js 自定义添加依赖

    代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  8. ibeacon UUID

    import sys; import uuid; s=uuid.uuid4().hex #s="f6bc15e0939046679be1866ec8a199dc" sys.stdo ...

  9. 使用jQuery发送POST,Ajax请求返回JSON格式数据

    问题: 使用jQuery POST提交数据到PHP文件, PHP返回的json_encode后的数组数据,但jQuery接收到的数据不能解析为JSON对象,而是字符串{"code" ...

  10. Android推送使用--文章集锦

    Android之基于百度云推送IM Android实现推送方式解决方案 Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线 采用XMPP协议实现Android推送 ...