先看看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. web相关基础知识2

    2017-12-14 17:14:22 块元素 典型代表,Div,h1-h6,p,ul,li 特点: ★独占一行 ★可以设置宽高  ★ 嵌套(包含)下,子块元素宽度(没有定义情况下)和父块元素宽度默认 ...

  2. 【工具学习】——Maven的安装与配置

    [含义] 什么是构建? 构建,英文build.构建包括编译.运行.生成文档.打包.部署等等工作内容,如果我们每天手工去干这些事情,那会浪费很多的时间.因此,构建管理工具应运而生. maven,作为项目 ...

  3. storm-kafka版本不匹配的问题

    storm集群是1.0.0版本,kafka的集群版本是0.10.0,所以想当然的使用了kafka_2.10-0.10.0.1.jar作为storm-kafka-1.0.0.jar的依赖使用, 没想到导 ...

  4. ES mapping field修改过程

    Elasticsearch 的坑爹事--记录一次mapping field修改过程 http://www.cnblogs.com/Creator/p/3722408.html Elasticsearc ...

  5. 【bzoj1391】[Ceoi2008]order 网络流最小割

    原文地址:http://www.cnblogs.com/GXZlegend/p/6796937.html 题目描述 有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序 ...

  6. BZOJ4563 HAOI2016放棋子(高精度)

    没看清题还以为是要求数最大匹配数量……注意到任意障碍不在同一行同一列,且恰好有n个障碍,不妨通过交换列使得第i行第i列均有障碍.那么就是个错排了.居然wa了一发简直没救. #include<io ...

  7. P4109 [HEOI2015]定价

    题目描述 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别,但是在心理学上会让人感觉便宜很多,因此也是商 ...

  8. MFC 相关类、函数

    timeSetEvent()函数 CRectTracker类的使用 SetLocalTime设置本地时间 AdjustTokenPrivileges启用权限

  9. webpack 3.8 使用 extract-text-webpack-plugin 3.0 抽取css失败:You may need an appropriate loader to handle this file type.

    webpack 3.8.1 使用 extract-text-webpack-plugin 3.0.2 抽取css时失败,报错: ERROR in ./src/static/style/localTim ...

  10. php getimagesize()函数获取图片宽度高度

    //php自带函数 getimagesize() $img_info = getimagesize('tomener.jpg'); echo '<pre>'; print_r($img_i ...