深入理解值传递和引用传递

妹子问我JS关于值传递还是引用传递的问题,之前对于Java中属于值传递问题已经有了深入了解,今天看JS的参数传递问题再次轰然大悟,其实值传递和引用传递只是个名词罢了,要想搞懂这两个区别,还是要理解其原理。

1.值传递

首先我们要对所传参数分情况,若是基本数据类型(Java中有8个基本数据类型:byte,char,short,int,float,double,long,boolean),则JVM会将copy一份,传递的参数是按值的拷贝传递。(值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。)

参考:http://blog.csdn.net/zzp_403184692/article/details/8184751

给出实例说明:

按值传递是什么

指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:

[java]  view plain  copy
  1. public class TempTest {  
  2. private void test1(int a){  
  3. //做点事情  
  4. }  
  5. public static void main(String[] args) {  
  6. TempTest t = new TempTest();  
  7. int a = 3;  
  8. t.test1(a);//这里传递的参数a就是按值传递  
  9. }  
  10. }  

按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。

示例如下:

[java]  view plain  copy
  1. public class TempTest {  
  2. private void test1(int a){  
  3. a = 5;  
  4. System.out.println("test1方法中的a="+a);  
  5. }  
  6. public static void main(String[] args) {  
  7. TempTest t = new TempTest();  
  8. int a = 3;  
  9. t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a  
  10. System.out.println(”main方法中的a=”+a);  
  11. }  
  12. }  

运行结果是:

[java]  view plain  copy
  1. test1方法中的a=5  
  2. main方法中的a=3  

2.引用传递

所谓的引用传递其实指的事传递的是引用的地址,所以说引用传递也可以理解为值传递,一般来说引用传递的情况就是传递是对象或者数组,因为Java中万物皆对象,除过基本的数据类型(其中java有自动拆装箱的功能,基本数据类型也会被封装成对应的对象),一切都是对象,不管是数组还是类的实例

注意:(1. 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

搜索 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
  3. String str=”kvill”;  String str=new String (“kvill”);的区别:  在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。  常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量

给出实例说明:

按引用传递是什么

指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。

示例如下:

[java]  view plain  copy
  1. public class TempTest {  
  2. private void test1(A a){  
  3. }  
  4. public static void main(String[] args) {  
  5. TempTest t = new TempTest();  
  6. A a = new A();  
  7. t.test1(a); //这里传递的参数a就是按引用传递  
  8. }  
  9. }  
  10. class A{  
  11. public int age = 0;  
  12. }  

按引用传递的重要特点

传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。

示例如下:


[java]  view plain  copy
  1. public class TempTest {  
  2. private void test1(A a){  
  3. a.age = 20;  
  4. System.out.println("test1方法中的age="+a.age);  
  5. }  
  6. public static void main(String[] args) {  
  7. TempTest t = new TempTest();  
  8. A a = new A();  
  9. a.age = 10;  
  10. t.test1(a);  
  11. System.out.println(”main方法中的age=”+a.age);  
  12. }  
  13. }  
  14. class A{  
  15. public int age = 0;  
  16. }  

运行结果如下:

[java]  view plain  copy
  1. test1方法中的age=20  
  2. main方法中的age=20  

3:说明

(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。

(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值