Java 值传递和引用传递

这是很久之前就一直想解决的问题 虽然一直没解决也没出现说明大问题 但是感觉一直是个隐患 因此今天就将其彻底解决。
首先有一句话说的很好 不要去纠结字面意思 否则就容易陷入:一切引用传递本质上都是值传递 这种狗屁不通的语句。

宏观来说 值传递和引用传递 属于函数调用参数时的求值策略。而值类型和引用类型是用于区分两种内存分配方式,值类型在调用栈上分配 引用类型在堆上分配。 因此不能说基础类型就是值传递 而引用类型都是引用传递。
那么 值传递的定义是什么呢?

  • 在方法被调用时 实参通过形参吧他的内容传入方法内部,此时形参接收到的内容时实参值的一个copy,因此在方法内对形参的任何操作 都只是对这个副本的操作 而不影响原始变量值的内容。
    引用变量的定义是什么呢?
  • 在方法调用时 实参的地址通过方法被传递给相应的形参 在方法体内,形参和实参指向同一块内存地址,对形参的操作会影响原始变量值的内容。

首先 我们要知道基本类型和引用类型的不同
基本类型中 值直接保存在变量中
引用类型 变量中保存的只是实际对象的地址,也就是说这个变量实际上是指向实际对象 因此这个变量称为引用。

其次 搞清楚‘=’的作用:
对于基本类型 赋值运算符会直接改变变量的值 原值被直接覆盖掉
对于引用类型变量 赋值预算符会改变掉引用变量中所保存的地址 新的地址会指向一个新的对象。但是原来的对象也不会改变 还是在原来的地址。而没有被任何引用变量所指向的对象都是垃圾 会被垃圾回收器回收。

再其次 搞清楚调用方法(函数)时发生了什么?
如果参数时基本类型变量 那么此变量就是被直接赋值
如果参数是引用类型 我们都知道 引用类型有很多可以调用的方法 如果我们在某一函数中调用了这些方法 那么这个函数就会改变这个引用变量所指向的对象到新的对象 如果在某一函数中从来没有调用过这些改变自身的方法 那么变量的指向对象就不会改变。

所以说了这么多 那么C java python到底是值传递还是引用传递呢?

Java:其方法(函数)中参数的传递方式是按值传递。
如果参数是基本类型 传递的是基本类型字面量值的拷贝
如果参数是引用类型 传递的是该参量所引用的对象在堆中地址值的拷贝。(还是没懂…)

我们要知道 JVM在程序运行时的内存分配有三个地方:堆 栈 静态方法区 常量区 ,所以有三种内存分配策略:堆式 栈式 静态。
而java有很多种数据类型(基本数据类型:局部变量(函数内部) 成员变量(类中变量) 静态变量。引用数据类型),下面分别来说其内存分配策略:

  • 局部变量直接储存在栈上
  • 成员变量都储存在堆中 其生命周期和类是一致的。
  • 静态变量储存在方法区的常量池中 随类加载而加载 随类消失而消失。
  • 引用类型 变量名存在栈中

https://juejin.im/post/5bce68226fb9a05ce46a0476

C:参数传递方式有两种 值传递和地址传递
http://c.biancheng.net/view/371.html

posted @ 2020-04-26 22:57  EvanMeetTheWorld  阅读(27)  评论(0)    收藏  举报