首先,Java没有 引用传递 这么一说。

Java仅仅有值传递。传递的都是值,基本数据类型传递的是值。引用类型传递的是地址值。

我来理一下这当中宛如米线跟米面绞在一起了,再跟粉丝混在一起的关系。

好的,我们来看第一个样例:

public static void main(String[] args) {
int a = 1;
int b = 4;
System.out.println("Before : a=" + a + "," + "b=" + b);
swap(a, b);
System.out.println("After : a=" + a + "," + "b=" + b); } private static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}

结果:

Before : a=1,b=4
After : a=1,b=4

这没什么好说的,main函数内的a和b 与 swap()函数中的a,b半毛线关系都没有,交换的仅仅是swap函数中的局部变量,并不会影响到main函数中的a和b.

2,第二个:

public static void main(String[] args) {
Integer a = new Integer(3);
Integer b = new Integer(4);
System.out.println("Before : a = " + a + " b = " + b);
swap(a, b);
System.out.println("After : a = " + a + " b = " + b);
}
public static void swap(Integer a1, Integer b1) {
Integer temp = a1;
a1 = b1;
b1 = temp;
}

结果:

Before : a = 3   b = 4
After : a = 3 b = 4

非常多人可能会吃惊。为什么会介个样子的呢?为什么 还是木有交换呢。

1。a将引用值传给a1,b将引用值传给b1,此时a1和a都指向3的空间。b1和b都指向4的空间

2。在swap函数中。a1和b1的引用值发生了交换,注意是引用值!

此时a1指向4,b1指向3

3,再看看打印语句:

System.out.println("After  : a = " + a + "   b = " + b);

打印的是a 和 b 的值,跟a1,b1又有什么关系呢?交换的仅仅是a1和b1的引用值,说白了a1,b1就是a,b的引用副本。这里有四个引用指向了2个地址空间。交换了当中的两个。并不影响其它两个引用的值。

好,说完了上面这么多。我们再来看一个样例:

首先自己定义一个类:

public class Person {

	private int age;

	public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} }
public static void main(String[] args) {
Person p = new Person();
System.out.println("Before : "+p.getAge());
changePersonAge(p);
System.out.println("After : " + p.getAge());
} public static void changePersonAge(Person p) {
p.setAge(10);
}

结果:

Before : 0
After : 10

是不是非常奇妙,这里居然又能够改变值啦。

注意:这里p将引用副本传递给changePersonAge()函数,相同此时存在两个引用指向堆空间中的Person对象。那么在changePersonAge()方法中调用setAge()函数,实质改变的也就是Person对象中age的值,这里改变的是对象,而不是单纯的引用值的传递。

我们再来看一个样例:

public static void main(String[] args) {
String str = "test";
System.out.println("Before = "+str);
changeStr(str);
System.out.println("After = " + str);
}
public static void changeStr(String str) {
str += "haha";
}

结果:

Before = test
After = test

哎哟我去,咋又不能改变了呢?

在main方法里str首先指向常量池中的“test”,而后将引用副本传递给changeStr方法中的str。相同这里存在两个引用,可是在changeStr方法里做出了,str+="haha";的操作。注意。此时changeStr中的str不再指向“test”,而是指向了“testhaha”,两个引用指向了不同的空间,打印出来当然没有改变值咯。

最后。我们再来看一个小样例,稳固一下。

public static void main(String[] args) {
StringBuffer sb = new StringBuffer("test2");
System.out.println("Before = " + sb);
changeStr(sb);
System.out.println("After = " + sb);
}
private static void changeStr(StringBuffer sb) {
sb.append("haha");
}

结果:

Before   = test2
After = test2haha

这里改变了值,已经引起不了大家的大惊小怪了。实质上跟上面的Person对象样例是类似的。

sb将引用副本传递给changeStr方法。再在changeStr方法中调用append方法。实质上是在改变两个引用共同指向的空间的值。不是引用传递也不是引用指向了别的空间。

最后吐槽一下,好热啊。

Java中的值传递与“引用传递”的更多相关文章

  1. Does Java pass by reference or pass by value?(Java是值传递还是引用传递) - 总结

    这个话题一直是Java程序员的一个热议话题,争论不断,但是不论是你百度搜也好还是去看官方的文档中所标明的也好,得到的都只有一个结论:Java只有值传递. 在这里就不贴代码细致解释了,让我们来看看一些论 ...

  2. Java中值传递和引用传递的概念

    很多书中都提到了在Java中只存在值传递,但是今天在一个NanoHTTPD的源码中看到这样一段: if (qmi >= 0) { decodeParms(uri.substring(qmi + ...

  3. Java中引用类型变量,对象,值类型,值传递,引用传递 区别与定义

    一.Java中什么叫做引用类型变量?引用:就是按内存地址查询       比如:String s = new String();这个其实是在栈内存里分配一块内存空间为s,在堆内存里new了一个Stri ...

  4. java中值传递和引用传递

    最近工作中使用到了值传递和引用传递,但是有点懵,现在看了下面的文章后清晰多了.一下是文章(网摘) 1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递.示例如下: public clas ...

  5. Java中的值传递和引用传递

    这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里 ...

  6. java中方法的参数传递机制(值传递还是引用传递)

    看到一个java面试题: 问:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?  答:是值传递.Java 编程语言只有值传递参 ...

  7. Java中传参的值传递和引用传递问题(转)

    今天遇到了一个java程序,需要用参数来返回值(虽然最后用另一种方法实现了),在网上看到这样一篇文章,很受启发. 本文章来自于http://hi.baidu.com/xzhilie/blog/item ...

  8. 一道笔试题来理顺Java中的值传递和引用传递

      题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = ...

  9. java中的值传递和引用传递有什么区别呀?

    值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参 ...

  10. Java中的值传递与引用传递

    1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型 ...

随机推荐

  1. 用java实现word转html

    由于项目需要,要完成将上传的word文件转成html文件的功能.在网上搜了一下,大致有3种方法:1.用jacob实现 2.用poi实现 3.用openoffice实现. 从网上来看好像jacob用的人 ...

  2. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  3. docker从零开始网络(二)桥接网络

    使用桥接网络 在网络方面,桥接网络是链路层设备,它在网络段之间转发流量.桥接网络可以是硬件设备或在主机内核中运行的软件设备. 就Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接 ...

  4. poj 1654(利用叉积求面积)

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 17937   Accepted: 4957 Description ...

  5. LPD Office插件使用指南

    LPD Office插件已经发布至Azure上,您可以在本机Outlook和Office Online使用该插件 一:在Outlook中使用 LPD Office插件 打开Outlook应用,并点击“ ...

  6. python socket 连续send,出现粘包问题

    使用网上socket代码实现ssh功能,如下: server.py #服务端Linux系统下:处理命令并返回import socketimport os#声明类型,生成socket链接对象server ...

  7. 让IE6/IE7/IE8支持CSS3属性的8种方法介绍

    我们都知道,IE浏览器暂不支持CSS3的一些属性.国外的工程师们,不安于此现状,他们总是尽量使用一些手段使IE浏览器也能支持CSS3属性,我觉得这些都是很有意义,很有价值的工作,可以推动整个技术领域的 ...

  8. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  9. mysql对表的操作

    创建表 简单的方式 CREATE TABLE person ( number INT(11), name VARCHAR(255), birthday DATE ); 或者是 CREATE TABLE ...

  10. 【最短路】【最大流】bzoj3931 [CQOI2015]网络吞吐量

    跑出最短路图,然后把结点拆点跑最大流. #include<cstdio> #include<queue> #include<cstring> #include< ...