随便写写留着自己看。

首先,Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!

当一个实例对象作为参数被传递到方法中时,参数的值就是该对象的引用的一个副本。指向同一个对象,对象的内容可以在被调用的方法内改变,但对象的引用(不是引用的副本) 是永远不会改变的。

下面几个例子帮助理解。

例1:

先看一段代码:

 public class Test2 {
String str = new String("good");
String str1 = "wtf";
int a = 10;
char[] ch = { 'a', 'b', 'c' }; public static void main(String[] args) {
Test2 test2 = new Test2();
test2.change(test2.str, test2.str1, test2.ch, test2.a);
System.out.println(test2.str);
System.out.println(test2.str1);
System.out.println(test2.a);
System.out.println(test2.ch);
} public void change(String str, String str1, char[] ch, int a) {
str = new String("change ok");
str1 = "change ok";
ch[0] = 'g';
a = 13;
}
}
 good
wtf
10
gbc

输出结果


分析:

可以看到String,int的值没有变,char[]数组中的值变了。为什么呢,简单画几个图来说明。

一、String

String是不可变类型,传递的是“good”在堆中的地址。

二、int

对于基本数据类型,传递的是值的一份拷贝,这份拷贝与原来的值没什么关系。

这个例子中,类变量a的值是10,没有改变,change方法中a的值由一开始的10变成了13。

三、char[]

类似于String中的before情况,不画了,传递的是堆中数组的引用(地址)。

指向的是同一个数组,所以ch[0]的值被改变了。


例2: 

 public class Test5 {

     public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1 = { 1, 2, 3, 4, 5 };
int[] arr2 = arr1;
arr2[1] = 16;
System.out.println("arr1=" + Arrays.toString(arr1));
System.out.println("arr2=" + Arrays.toString(arr2));
}
}
arr1=[1, 16, 3, 4, 5]
arr2=[1, 16, 3, 4, 5]

输出结果

同样arr1和arr2指向的是同一个数组,所以改变一个的值另一个的值也就变了。

如果想将数组复制一份,那么应该声明、创建并初始化一个新的数组,然后将原数组中的元素挨个复制到新数组。

面试题:Java中值传递和引用传递的问题的更多相关文章

  1. 在Java中字符串是通过引用传递的?

    这是一个经典的java问题.在stackoverflow上,许多类似的问题已经被问过了,但是许多回答是错误的或不完整的. 如果你不想深入思考的话,这个问题很简单.如果你想明白的更彻底,那么问题可能容易 ...

  2. 多图证明,Java到底是值传递还是引用传递?

    开篇先来曝答案,在 Java 语言中,本质只有值传递,而无引用传递,解释和证明详见正文. 说到值传递和引用传递我们不得不提到两个概念:值类型和引用类型. 1.值类型 通俗意义上来说,所谓的值类型指的就 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  10. java中参数传递--值传递,引用传递

    java中的参数传递——值传递.引用传递   参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用. ...

随机推荐

  1. LCD实验学习笔记(一):Makefile

    主Makefile总领全局的就这句—— lcd.bin: $(objs) 要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o seri ...

  2. js三层引号嵌套

    ··· 参考:https://blog.csdn.net/feiyangbaxia/article/details/49681131 第一层用双引号,第二层转义双引号,第三层单引号

  3. jqueryDateTable.js排序

    {% block js %} <script type="text/javascript"> $('#datatable').dataTable( { "or ...

  4. nginx重启失败

    参考: http://www.bubuko.com/infodetail-1742262.html Starting nginx: nginx: [emerg] bind() to 0.0.0.0:8 ...

  5. HDU1083(二分图最大匹配vector实现)

    Courses Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total S ...

  6. Django基本操作

    Django官网下载页面 安装(安装最新LTS版): pip3 install django==1.11.9 创建一个django项目: 下面的命令创建了一个名为"s8"的Djan ...

  7. 使用ShowDoc在线管理API接口文档

    ShowDoc是什么 每当接手一个他人开发好的模块或者项目,看着那些没有写注释的代码,我们都无比抓狂.文档呢?!文档呢?!Show me the doc !! ShowDoc就是一个非常适合IT团队的 ...

  8. win10下MongoDB安装

    下载 MongoDB 官网下载链接 如果被墙的话,请点击 mongodb-win32-x86_64-2008plus-ssl-3.4.1-signed.msi 下载 选择custom安装方式,手动切换 ...

  9. JavaScript防止重复提交表单

    往往有些用户网络慢或者其他问题,在提交表单的时候使劲点击保存提交按钮,在提交表单的时候加上下面的代码,即可以限制在一定时间内,只有一次点击是有效的. <script> var mypret ...

  10. CodeForces 348C Subset Sums(分块)(nsqrtn)

    C. Subset Sums time limit per test 3 seconds memory limit per test 256 megabytes input standard inpu ...