Java中只有按值传递,没有按引用传递!

方法参数共有两种类型:

  • 基本数据类型
  • 对象引用

一:基本数据类型

首先看一个小例子:

 package chuandi;

 public class Test1 {
public static void main(String[] args) {
int x=8;
change(x);
System.out.println(x);
}
public static void change(int b){
b=b*2;
}
}

如果按引用传递,那么得到的值应该是:16 ,但是答案却是

可以看到x的值并没有发生变化;

过程是这样的:

  1. b被初始化为x值的一个拷贝,即8
  2. b乘以2后等于16。但是x没有变化,依然是8
  3. change执行完后,参数变量不再使用

x作为参数传递给change()方法时,是将内存空间中x所指向的那个存储单元中存放的值,即"8",传送给了change()方法中的b变量,而这个b变量也在内存空间中分配了一个存储单元,这个时候,就把x的值8传送给了这个存储单元中。此后,在change()方法中对b的一切操作都是针对b所指向的这个存储单元,与x所指向的那个存储单元没有关系了!

自然,在函数调用之后,x所指向的存储单元的值还是没有发生变化,这就是所谓的“值传递”!值传递的精髓是:传递的是存储单元中的内容,而非地址或者引用!

 

 二:对象引用

 package chuandi;

 public class Test2 {
public static String name = "hello";
public void change(Test2 t){
t.name="hi";
} public static void main(String[] args) {
Test2 t=new Test2();
System.out.println(t.name);
t.change(t);
System.out.println(t.name);
}
}

那么既然是按值传递,为什么还能改变对象里面的值???请看下面;

运行流程:

  首先在main方法中我们新建了Test的对象,(理解堆栈了后面是容易理解的),实际Test对象被创建在堆中,在栈中又创建Test类型的t,这是一个句柄,里面存放的是Test对象在堆中的实际位置;然后运行到change()方法,我们将t这个参数传进方法,t里面存放的是实际Test的位置,也就是Test存储单元,也就是说在change()方法中对t的一切操作都是针对t所指向的这个存储单元;(t所指向的那个存储单元中的内容是实体对象的地址,使得t也指向了该实体对象,所以才能改变对象内部的属性!这也是我们大多数人会误以为是“引用传递”的终极原因!!!)回顾一下上面的一个值传递的例子,值传递,就是将存储单元中的内容传给调用函数中的那个参数,这里是不是异曲同工,是所谓“值传递”,而非“引用传递”!!!

JAVA中的按值传递的更多相关文章

  1. Java中只有按值传递,没有按引用传递!

      今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java ...

  2. 【转】Java中只有按值传递,没有按引用传递!

    原文链接:http://guhanjie.iteye.com/blog/1683637 今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底 ...

  3. Java 中的按值传递

    Java 中只有按值传递 "Java 中只有按值传递",初看到这几个字有点不敢相信,无数次通过函数改变过对象,无数次跟同事说 Java 在传对象的时候是按引用传递.后来细细想想,之 ...

  4. Java中只有按值传递,没有按引用传递!(两种参数情况下都是值传递)

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  5. java中数据的传递方式到底是怎样的!

    今天早上我了一道有关java的题.主要考点是考java中值得传递方式. 之前我在javaoo里总结的是:基本数据类型中保存的是实际的值,引用数据类型保存的是被引用的内存地址,那么基本数据类型就是按值传 ...

  6. JAVA中只有值传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  7. Java中不得不谈的值传递和地址传递

    个人的一些认识,希望能对初学Java的你,或者困惑于方法参数传递的你祈祷一丝帮助! 下面是一些作者的个人观点,如果有错,欢迎各位大牛指出错误,灰常感谢您的观看与支持... -------------- ...

  8. 你真的理解Java中的try/catch/finally吗?

    看几个例子,回顾一下执行顺序 例子1 无异常,finally中的return会导致提前返回 public static String test() {    try {        System.o ...

  9. java中的参数传递是按引用传递还是按值传递

    最近去面试,有一个面试官问到java中参数传递的问题,感觉自己对于这一块还是理解的不够深.今天我们就一起来学习一下Java中的接口和抽象类.下面是本文的目录大纲: 一 . 什么是按值传递,什么是按引用 ...

随机推荐

  1. Android使用gradle不同配置多项目打包

    //build.gradle该配置文件里路径均是相对路径 apply plugin: 'com.android.application' android { def suffix = "su ...

  2. C语言可变參函数的实现

    1 C语言中函数调用的原理 函数是大多数编程语言都实现的编程要素.调用函数的实现原理就是:运行跳转+參数传递.对于运行跳转,全部的CPU都直接提供跳转指令:对于參数传递,CPU会提供多种方式.最常见的 ...

  3. 抓包工具 fiddler

    1. 抓包软件 TCP 外挂: 1. 解包工具  2.抓包工具 HTTP 1.前后端交互过程 2.学习的作用 3.模拟网络情况 2 http client server 没有加密 https 证书 非 ...

  4. day02-多线程之线程安全

    /** * 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的. * synchronized:可以在任意对象及方法上加锁, ...

  5. C#读取XML文件的五个步骤

    //1.创建XmlDocument对象 XmlDocument  xmlDoc=new XmlDocument(); //2.加载源文件 xmlDoc.Load("文件名.xml" ...

  6. python每天进步一点点

    1. apply, 可以调用函数和参数,如apply(Fun,(xxx,xxx)) 2. Format, 很好处理字符串的对齐命名,其他进制,打印等. 3. input(),接受输入 4. str() ...

  7. iOS自定义文字高度添加行间距

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000 } span.s1 { } span.s2 { c ...

  8. JavaWeb框架_Struts2_(五)----->Struts2的标签库

    1.  Struts2的标签库 1.1 Struts2标签库概述 Struts2的标签库可以分为以下3类:用户界面标签.非用户界面标签.AJAX标签; 2.1.1 Struts2标签库的分类和使用 1 ...

  9. 10本Java书籍推荐

    1. <深入理解Java虚拟机>是近年来国内出版的唯一一本与Java虚拟机相关的专著,也是唯一一本同时从核心理论和实际运用这两个角度去探讨Java虚拟机的著作,不仅理论分析得透彻,而且书中 ...

  10. bzoj 3143: [Hnoi2013]游走

    Description 一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点, ...