博主这几天在复习 javaSE 部分的内容时,遇到了关于参数传值的问题,但是始终不知道原因,上网上一查才知道钻牛角尖了,把C语言的参数传值转移到java中了。

相信很多在学习java之前,有接触过C/C++的同学,会按照之前固有的观念认为,java中的参数传递分为 值传递引用传递 。这样想的同鞋都已经掉进了大坑了。请记住一点:在java中,一切的参数传递都是值传递。

什么是值传递?是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改操作,都不会影响到实际参数。

java中的参数传递的区别就是参数数据类型的不同。根据参数的类型可分为 基本数据类型 和 引用数据类型。

基本数据类型:

当方法中的参数类型是基本数据类型时,传递的是数据值。因为是值传递,所以传递的数据值,是复制实参所得到的。

分析下列代码:

 public class TestDemo02 {
public static void main(String[] args) { int a = 3,b = 4;
change(a,b);
System.out.println(a);
System.out.println(b);
} private static void change(int a, int b) {
a = a + a;
b = a + b; }
}

结果如下:

分析:这种情况下,change方法中的两个参数的值和主函数的值无关,在change方法中的修改,只是对该方法中的两个局部变量进行,方法结束后,变量就消失了,所以不会对主函数造成影响。

引用数据类型:

当方法的参数是引用数据类型时,传递的是地址值。这种情况下,会先将地址进行拷贝,将拷贝后的地址进行值传递。

分析下列代码:

public class TestDemo02 {
public static void main(String[] args) { int[] arr = {1,2,3};
change(arr);
System.out.println(arr[0]);
} public static void change(int[] arr){
arr[0] = 4;
exchange(arr);
}
public static void exchange(int[] arr){
int[] arr1 = {5,6,7};
arr = arr1;
} }

结果如下:

在分析这个程序前,我们需要知道java中的内存分配。

在java中的内存分为:

  • 寄存器(给CPU使用)
  • 本地方法区(和系统相关)
  • 方法区
  • 栈内存(存储局部变量)
  • 堆内存(存储 new 出来的东西)

这里我们主要讲一下栈内存和堆内存。

栈内存的特点:

  1. 存储的都是局部变量
  2. 变量所属的作用域一旦结束,该变量就会自动释放

堆内存的特点:

  1. 存储的都是new出来的实体,对象。每个对象都有首地址值。
  2. 堆内存中的变量都有默认初始化值。整型是0,浮点型是0.0f,boolean型是false,char型是‘\u0000’,引用类型为null。
  3. 有垃圾回收机制,会自动回收堆内存中的垃圾数据。

我们在方法中建立数组的时候,数组左边的,例如:int[ ] arr 会存放在栈内存中。而右边的 new 出来的数据,会在堆中自动开辟一个空间,进行存放数据,该数组会自动获取一个首地址值。栈内存中的 arr 存的就是堆内存中的new 出来的数组的地址。

分析:在change方法中,参数拥有的是和主函数的数组相同的地址。在执行arr[0]=4时,改变了该地址的指向,使得堆内存中的数组地址不在指向原来的的数据,而是指向 4 ,因为在堆内存中发生改变,所以主函数中打印数组元素时,就是 4 了。而在exchange方法中,arr1 将自己存储的地址赋给了该方法中的局部变量 arr ,所以这个 arr 指向了 567数组。在进行操作,就是对这个数组进行修改,不会影响 123数组。等到方法结束后,arr是局部变量,自动消失。main方法中的数组变量 arr中存储的地址还是 堆内存中的 123 数组,所以仍然打印 123数组的值。不懂的童鞋可以看图解啊,博主没有艺术细胞,画的不好看,还请原谅啊,哈哈哈。

change方法的图解:

exchange方法的图解:

arr = arr1 后:

通过以上两个例子,我们可以知道 java中进行值传递的时候,参数类型为基本数据类型和引用数据类型的区别。注意:数组中改变的永远是地址的指向

java都是值传递,没有引用传递的更多相关文章

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

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

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

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

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

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

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

    昨天博主在对于值传递和引用传递这里栽了一个大坑啊,导致一下午时间都浪费在这里,我们先说下值传递和引用传递java官方解释: 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对 ...

  5. java 对象传递 是 值传递 还是 引用传递?

    这个问题说实话我感觉没有太大的意义. 按第一印象和c++的一些思想去理解的话对象传递是引用传递,因为传递过去的对象的值能被改变. 但是又有很多人,不知道从哪里扣出来一句,java中只有值传递,没有引用 ...

  6. java参数传递时到底是值传递还是引用传递

    java参数传递时到底是值传递还是引用传递(baidu搜集) 问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其中有一道题让我很费解. 原题是:当一 ...

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

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

  8. Java值传递和引用传递

    Java总是在讨论是传递还是引用传递,Java没有像C语言那样拥有指针,在看到引用传递和值传递很多的解释之后,更相信引用传递和值传递归根到底都是值传递,只不过引用传递的时候看上去很高大上,其实是把变量 ...

  9. 理解java值传递与引用传递

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

随机推荐

  1. 多线程学习三:Thread API,ThreadLocal,synchronized,volatile和Condition

    一.Thread API: setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 首先要了解什么是Thread. ...

  2. 查找发布地图的 REST URL并查询相关信息

    1.登录ArcGIS Server Manager 2.登录后,里面是以前自己发布的地图服务 3.点击自己发布的地图,然后按下功能选项,再点击箭头来找到URL 4.点击进去,分别能从红圈中找到相关的信 ...

  3. Python通用函数实现数组计算

    一.数组的运算 数组的运算可以进行加减乘除,同时也可以将这些算数运算符进行任意的组合已达到效果. >>> x=np.arange() >>> x array([, ...

  4. python从入门到放弃之线程篇

    一,什么是多线程? 1.多线程的概念? 说起多线程,那么就不得不说什么是线程,而说起线程,又不得不说什么是进程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分 ...

  5. Java面试题-基础篇二(干货)

    11.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用 ...

  6. 开发JQuery插件标准结构

    1. 定义作用域 定义一个JQuery插件,首先要把这个插件的代码放在一个不受外界干扰的地方.如果用专业些的话来说就是要为这个插件定义私有作用域.外部的代码不能直接访问插件内部的代码.插件内部的代码不 ...

  7. jQ的select事件和trigger方法的小冲突

    方法和事件都不难理解,分开用也都没问题,但是一起用就有些小问题出现. 直接上结论:使用trigger方法触发一个文本类型的 input 元素的select事件时,chrome浏览器会错误的触发三次,f ...

  8. 剑指Offer-3.从尾到头打印链表(C++/Java)

    题目: 输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 分析: 很简单的一道题,其实也就是从尾到头打印链表,题目要求返回ArrayList,其实也就是一个数组. 可以将链表中的元素全部 ...

  9. [PHP] 再续 Laravel 5.5 接口 跨域问题 【终极暴力解决办法】

    上文中提到 Laravel5.5 使用 laravel-cors 实现 Laravel 的跨域配置 用插件来跨域 此方法能解决一部分api 请求问题 但我碰到的是 接口 请求size 超过10k,导致 ...

  10. tsar使用说明

    常用命令    tsar --nginx --live -i 1  查询1秒的状态每秒采样一次 系统模块 cpu 字段含义 user: 表示CPU执行用户进程的时间,通常期望用户空间CPU越高越好. ...