一般我们会说Java基本类型采用值传递,对象以及数组采用引用传递。但事实上这只是表面上的现象。实质上,Java都是按值传递引用。(Java中“引用”的概念相当于C++中的指针,可以不断改变值)

一,对象

对象与变量(实例)的区别

对象保存在heap,而变量保存在stack;对象的入口地址是不可预知的,所以程序只能通过变量来访问对象,变量是对象的一个引用。

例1:

class Word {
String word;
public Word(String word){
this.word = word;
}
public void print(){
System.out.println(word);
}
} Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2 = new Word("Every Night!");
o1.print();

结果是Every Day。

第一句o1 = new Word("Every Day");

首先创建一个Word实例,即对象,然后把引用赋值给o1。

第二句o2 = o1;

o1把对象的引用赋值给o2,注意赋的值是对象的引用而不是o1自身的引用。

所以,在第三句o2 = new Word("Every Night!");

就是又创建一个新对象,再把新对象的引用赋值给o2。

因为o1和 o2之间是值传,所以,对o2的改变丝毫不会影响到o1。

例2:

我们为Word类增加了一个新方法

public void setWord(String word){
this.word = word;
} Word o1, o2;
o1 = new Word("Every Day");
o2 = o1;
o2.set Word("Every Night!");
o1.print();

这时的结果是"Every Night!"。

这个并不是变量的改变,因为o1只是保存对象的引用,执行之后,o1还是持有该对象的引用。所以,o1没变,变的是o1所引用的对象。

二,基本类型

栈的数据存储

存在栈中的数据可以共享。如:int a = 3; int b = 3;

编译器会先处理int a = 3,首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3,也是先创建b的引用,之后因为在栈中已经有3这个值,便将b直接指向3。这时如果令a = 4; 那么编译器会重新搜索栈中是否有4,如果没有,将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a的改变不会影响到b的值。

由此可见,Java的基本类型也是按值传递的。

例3:

public class Test
{
public static void main(String[] args)
{
String str = new String ("World");
char ch[] = {'H', 'e', 'l', 'l', 'o'};
change(str,ch);
System.out.print(str+"and");
System.out.println(ch);
}
public static void change (String str, char ch[])
{
str = "Change";
ch[0] = 'C';
}
}

结果是World and Cello

分析:Java中的String是一个特殊的包装类数据,可以用以下两种形式来创建

1)String str = new String ("abc"); 存放在heap

2)String str = "abc"; 存储在stack

比较类里面的数值是否相等时,用equals()方法;测试两个类的引用是否指向同一个对象时,用==。所以,

String str1 = "abc";
String str2 = "abc";
System.out.println(str1== str2); //true
String str1 = new String ("abc");
String str2 = new String ("abc");
System.out.println(str1 == str2); //false

Java按值传递、按引用传递的更多相关文章

  1. 转------深入理解--Java按值传递和按引用传递

    引言 最近刷牛客网上的题目时碰到不少有关Java按值传递和按引用传递的问题,这种题目就是坑呀,在做错了n次之后,查找了多方资料进行总结既可以让自己在总结中得到提高,又可以让其他人少走弯路.何乐而不为? ...

  2. 你真的理解Java的按引用传递吗?

    首先我们来看下面这段代码: public class Test1 { String a = "123"; public static void change(Test1 test) ...

  3. JavaScript 按值传递 & 按引用传递

    (1)值的比较--引用的比较 首先,原始值的比较是值的比较:只有在它们值相等的时候它们才相等 比如简单的 var a1 = 10; var a2 = 10; console.log(a1 === a2 ...

  4. 【转载】解析 java 按值传递还是按引用传递

    原文链接  说明: (1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递. (2):在Java里面只有基本类型和 ...

  5. java学习——java按值传递和按址传递

    先复制一个面试/笔试的题: 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递? 答案: 是值传递.Java语言的方法调用只支持参 ...

  6. java按值传递理解

    Java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: public class Test { public static void main(String[] ar ...

  7. java按值传递相关理解

    Java没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 1. public class Test {     public static void main(String[] args ...

  8. java按值传递理解(转)

    ava没有引用传递只有按值传递,没有引用传递只有按值传递,值传递. 通过下面代码解释: 1 public class Test { 2 public static void main(String[] ...

  9. java按值传递?

    原文链接:https://blog.csdn.net/scholar_man/article/details/80900212 在Java中,参数都是按值传递的.被传递到方法中的拷贝值,要不就是一个引 ...

随机推荐

  1. python 笔记 2017

    26.反斜杠用处,断言一些字符包含特殊字符的 if "<h3 class=\"entH 22222setH\">刷新成功</h3>" i ...

  2. 关于模板该不该用css强制编辑器文本开头空两格

    关于模板该不该用css强制编辑器文本开头空两格这个问题,我很早之前就想说了,写惯了qq日志的童鞋都知道,qq空间的编辑器没有任何css控制,行头空两格是由用户自己控制,我写起日志又像流水账,长长的一篇 ...

  3. 终端直接执行py文件,不需要python命令

    然后给脚本文件运行权限,方法(1)chmod +x ./*.py方法(2)chmod 755 ./*.py (777也无所谓啦) 这个命令不去调整,会出现permission denied的错误终端直 ...

  4. git clone的时候filename too long解决办法

    在git bash中,运行下列命令: git config --global core.longpaths true

  5. 关于cookie的一些事

    关于cookie的一些事转自:http://blog.csdn.net/yunnysunny/article/details/7748106 cookie是实现web中用户状态维护的基础.我们常见的s ...

  6. uva-10098

    所有的排列,但是要不重复 #include<stdio.h> #include<iostream> #include<sstream> #include<qu ...

  7. UVA-712-满二叉树

    一个策略树(S-tree)是一组变量Xn={x1,x2...xn}的表现形式,它代表一个布尔函数f:{0,1}n->{0,1},策略树每条路径从根结点开始由n+1个结点组成,策略树的每一个结点都 ...

  8. OpenACC 与 CUDA 的相互调用

    ▶ 按照书上的代码完成了 OpenACC 与CUDA 的相互调用,以及 OpenACC 调用 cuBLAS.便于过程遇到了很多问题,注入 CUDA 版本,代码版本,计算能力指定等,先放在这里,以后填坑 ...

  9. 1_Utilities__bandwidthTest

    使用三种模式(QUICK_MODE,RANGE_MODE,SHMOO_MODE),测试三种拷贝情况下的显存带宽(HostToDevice,DeviceToHost,DeviceToDevice) ▶ ...

  10. python正则表达式re库(自用)

    经典例子: 1.由26个字母组成的字符串 ^[A-Za-z]+$ 2. 中国境内邮政编码 [1-9]\d{5} 3.IP地址 0-99:[1-9]?\d 100-199:1\d{2} 200-249: ...