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

    妹子问我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私塾”;


    展开全文
  • 个人理解:JAVA语言总是按照值传递调用的,基本上所有的函数调用参数传递都是值传递。其实参数为对象的传递也是值传递,只是对象本身也是对堆区真实对象的引用,所以对象参数传递的结果是对象的引用的值拷贝(可以...

    个人理解:JAVA语言总是按照值传递调用的,基本上所有的函数调用参数传递都是值传递。其实参数为对象的传递也是值传递,只是对象本身也是对堆区真实对象的引用,所以对象参数传递的结果是对象的引用的值拷贝(可以参照C++的指针去理解)。

    (以上是我截至到目前我对JAVA值传递和引用传递的理解)。

    下面做一系列测试验证我的理解:
    首先我定义一个要测试的类,考虑到深度拷贝,加上了clone的接口:
    public class CloneClass implements Cloneable{
    
    	private int a;
    	private int b;
    	
    	public CloneClass(){
    		this.a=10;
    		this.b=5;
    	}
    	public int getA() {
    		return a;
    	}
    
    	public void setA(int a) {
    		this.a = a;
    	}
    
    	public int getB() {
    		return b;
    	}
    
    	public void setB(int b) {
    		this.b = b;
    	}
    
    	@Override
    	protected Object clone() throws CloneNotSupportedException {
    		// TODO Auto-generated method stub
    		return super.clone();
    	}
    	
    }


    1.基本数据类型作为参数的传递

    测试代码:
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		
    		
    		/**
    		 * 1.测试值传递,JAVA中方法调用值,除了基本的数据类型int,char,boolean,long等为值传递调用,其余的对象传递其实也是值传递,只是对象的值是一个引用
    		 */
    		
    		CloneClass c1=new CloneClass();
    		System.out.println("c1:b的值为:"+c1.getB());
    		TestClone.testZhiChuan(c1.getB());
    		System.out.println("c1: b的值为:"+c1.getB());
    	}
    
    	//测试基本类型的值传递
    	public static void testZhiChuan(int b){
    		b=100;
    	}
    结果:
    上面代码可以看出c1中的b的值并没有改变,所以基本数据类型是值传递

    2.对象作为参数的传递

    测试代码:
    	public static void main(String[] args){
    
    		/**
    		 * 2.对象的传递
    		 */
    		CloneClass c2=new CloneClass();
    		System.out.println("c2:a的值为:"+c2.getA());
    		TestClone.testYinyong(c2);
    		System.out.println("c2: a的值为:"+c2.getA());
    	}
    
    
    	//测试对象的值传递:拷贝的值为一个引用
    	public static void testYinyong(CloneClass cloneClass){
    		cloneClass.setA(20);
    	}
    结果:

    在这里我们看到的结果的的确确变成了类似于引用传递的效果,好多JAVA开发成员也把这种传递叫引用传递,实际上这种也是一种值传递。




    3.对象克隆(深拷贝)

    如何解决对象传参修改属性值的问题?
    使用对象克隆!!

    	/**
    	 * @param args
    	 */
    	public static void main(String[] args)  throws CloneNotSupportedException{
    		// TODO Auto-generated method stub
    
    		/**
    		 * 3.对象克隆解决修改对象值问题
    		 */
    		CloneClass c3=new CloneClass();
    		System.out.println(c3);
    		System.out.println("c3:a的值为:"+c3.getA());
    		TestClone.testClone(c3);
    		System.out.println("c3: a的值为:"+c3.getA());
    	}
    	
    	//测试对象的深度拷贝,克隆的使用
    	public static void testClone(CloneClass cloneClass) throws CloneNotSupportedException{
    		System.out.println(cloneClass);
    		CloneClass testClone=(CloneClass)cloneClass.clone();
    		System.out.println(testClone);
    		testClone.setA(20);
    		System.out.println("testClone a:"+testClone.getA());
    	}

    结果:

    写法建CloneClass类

    展开全文
  • Java:按值传递还是按引用传递详细解说 下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考:1:按值传递是什么 指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下: [java] ...

    Java:按值传递还是按引用传递详细解说
    下面是我在网上看到的一个帖子,解释的感觉挺全面,就转过来,以供以后学习参考:

    1:按值传递是什么
    指的是在方法调用时,传递的参数是按值的拷贝传递。示例如下:
    [java] view plain copy
    public class TempTest {
    private void test1(int a){
    //做点事情
    }
    public static void main(String[] args) {
    TempTest t = new TempTest();
    int a = 3;
    t.test1(a);//这里传递的参数a就是按值传递
    }
    }

    按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
    示例如下:
    [java] view plain copy
    public class TempTest {
    private void test1(int a){
    a = 5;
    System.out.println(“test1方法中的a=”+a);
    }
    public static void main(String[] args) {
    TempTest t = new TempTest();
    int a = 3;
    t.test1(a);//传递后,test1方法对变量值的改变不影响这里的a
    System.out.println(”main方法中的a=”+a);
    }
    }
    运行结果是:
    [java] view plain copy
    test1方法中的a=5
    main方法中的a=3

    2:按引用传递是什么
    指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
    示例如下:
    [java] view plain copy
    public class TempTest {
    private void test1(A a){
    }
    public static void main(String[] args) {
    TempTest t = new TempTest();
    A a = new A();
    t.test1(a); //这里传递的参数a就是按引用传递
    }
    }
    class A{
    public int age = 0;
    }

    3:按引用传递的重要特点
    传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
    示例如下:

    [java] view plain copy
    public class TempTest {
    private void test1(A a){
    a.age = 20;
    System.out.println(“test1方法中的age=”+a.age);
    }
    public static void main(String[] args) {
    TempTest t = new TempTest();
    A a = new A();
    a.age = 10;
    t.test1(a);
    System.out.println(”main方法中的age=”+a.age);
    }
    }
    class A{
    public int age = 0;
    }
    运行结果如下:
    [java] view plain copy
    test1方法中的age=20
    main方法中的age=20

    4:理解按引用传递的过程——内存分配示意图
    要想正确理解按引用传递的过程,就必须学会理解内存分配的过程,内存分配示意图可以辅助我们去理解这个过程。
    用上面的例子来进行分析:
    (1):运行开始,运行第8行,创建了一个A的实例,内存分配示意如下:

    (2):运行第9行,是修改A实例里面的age的值,运行后内存分配示意如下:

    (3):运行第10行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
    内存分配示意如下:

    由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:

    也就是说:是两个变量都指向同一个空间。
    (4):运行第3行,为test1方法中的变量a指向的A实例的age进行赋值,完成后形成的新的内存示意图如下:

    此时A实例的age值的变化是由test1方法引起的
    (5):运行第4行,根据此时的内存示意图,输出test1方法中的age=20
    (6):运行第11行,根据此时的内存示意图,输出main方法中的age=20

    5:对上述例子的改变
    理解了上面的例子,可能有人会问,那么能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
    方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
    [java] view plain copy
    public class TempTest {
    private void test1(A a){
    a = new A();//新加的一行
    a.age = 20;
    System.out.println(“test1方法中的age=”+a.age);
    }
    public static void main(String[] args) {
    TempTest t = new TempTest();
    A a = new A();
    a.age = 10;
    t.test1(a);
    System.out.println(”main方法中的age=”+a.age);
    }
    }
    class A{
    public int age = 0;
    }
    运行结果为:
    [java] view plain copy
    test1方法中的age=20
    main方法中的age=10
    为什么这次的运行结果和前面的例子不一样呢,还是使用内存示意图来理解一下
    6:再次理解按引用传递
    (1):运行开始,运行第9行,创建了一个A的实例,内存分配示意如下:

    (2):运行第10行,是修改A实例里面的age的值,运行后内存分配示意如下:

    (3):运行第11行,是把main方法中的变量a所引用的内存空间地址,按引用传递给test1方法中的a变量。请注意:这两个a变量是完全不同的,不要被名称相同所蒙蔽。
    内存分配示意如下:

    由于是按引用传递,也就是传递的是内存空间的地址,所以传递完成后形成的新的内存示意图如下:

    也就是说:是两个变量都指向同一个空间。
    (4):运行第3行,为test1方法中的变量a重新生成了新的A实例的,完成后形成的新的内存示意图如下:

    (5):运行第4行,为test1方法中的变量a指向的新的A实例的age进行赋值,完成后形成的新的内存示意图如下:

    注意:这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的。
    (6):运行第5行,根据此时的内存示意图,输出test1方法中的age=20
    (7):运行第12行,根据此时的内存示意图,输出main方法中的age=10
    7:说明
    (1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
    (2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java殿堂”;

    展开全文
  • 传递闭包的通俗理解

    万次阅读 多人点赞 2019-03-18 16:25:01
    传递闭包显示的是传递关系,如a不能直接到c,却可以通过a到b到d再到c,因此a到c为1。 另外矩阵A进行自乘即得到的矩阵中,为1的值表示走最多两步可以到达。矩阵中为1的值表示,最多走三步可以到达。 ...

    邻接矩阵是显示两点的直接关系,如a直接能到b,就为1。而传递闭包显示的是传递关系,如a不能直接到c,却可以通过a到b到d再到c,因此a到c为1。

    另外矩阵A进行自乘即A^{2}得到的矩阵中,为1的值表示走最多两步可以到达。A^{3}矩阵中为1的值表示,最多走三步可以到达。

    展开全文
  • 系统传递函数的理解

    千次阅读 2020-12-19 16:20:37
    通常有理化系统传递函数可以拆分为多个一阶系统传递函数、二阶系统传递函数的组合,因此研究一阶系统传递函数和二阶系统传递函数很有意义。 一阶系统传递函数的单位冲击响应为,因此为了使系统稳定,那么使单位冲激...
  • Golang中引用传递理解

    千次阅读 2019-03-27 19:12:43
    函数传参中值传递、指针传递与引用传递到底有什么不一样? 为什么说slice、map、channel是引用类型? Go中slice在传入函数时到底是不是引用传递?如果不是,在函数内为什么能修改其值? In a function call, the ...
  • JavaScript 值传递和引用传递
  • 传递闭包的简单理解

    千次阅读 2020-01-31 21:05:18
    传递闭包:通俗的讲就是如果a->b, b->c,那么我们就建立一条a->c的边。将所有能间接相连的点直接相连。 Floyd能在O(n3) 求出一个图的传递闭包。 ...
  • 初学,,,, SimpleCat::SimpleCat(SimpleCat&) [color=#FF0000]之前学的引用符 & 是在前面的,请问这个在前面跟后面的意思跟意义是什么能给小弟说说吗?[/color][size=18px][/size]
  • Java中值传递及内存分配的理解

    千次阅读 2014-04-11 14:54:15
    理解Java中的值传递,首先得牢记一句话: Java参数,不管是原始类型还是引用类型,传递的都是副本。
  • 基本类型按值传递function addTen(num) { num += 10; return num; } var count = 20; var result = addTen(count); alert(count); //20,没有变化 alert(result); //30在执行addTen(count)时,将20这个值复制一份...
  • 在我的理解中,之所以用引用传递,是因为函数可以修改传递的参数。而不是像值传递那样,只创建参数的副本,无法修改参数。但是加上const,又表示不能修改该参数。那这const引用传递有啥用呢? 先不讨论引用传递和值...
  • php中引用传递理解

    2015-05-13 11:52:23
    下面这个链接讲的很详细了,慢慢研究吧 点击打开链接
  • java中的参数传递——值传递、引用传递 参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。 在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用...
  • 传递函数是用来表达系统动态特征的一种表达方式,通过分析它的特征根,就可以知道系统的动态特征。 线性系统的传递函数求法是,用系统输出的拉氏变换除以输入的拉氏变换。它只能用来分析定常系统,不定常系统是无法...
  • 关于View事件传递机制的理解,整理
  • 深入理解 View 的事件传递机制

    千次阅读 2015-04-18 08:54:56
    引言:现在 GitHub 上酷炫的 Android 控件越来越多,一方面我们可以让 App 各美观,...Demo源码废话不多说,进入正题:一、概述 View 事件传递机制用户通过点击、滑动屏幕与 App 产生交互是移动互联网时代的交互基础,
  • Java 是值传递还是引用传递

    万次阅读 多人点赞 2019-03-20 02:40:16
    最近整理面试题,整理到值传递、引用传递,到网上搜了一圈,争议很大。带着一脸蒙圈,线上线下查了好多资料。最终有所收获,所以分享给大家,希望能对你有所帮助。 首先说下我的感受,这个题目出的很好,但是在 ...
  • Lua函数传递self的深入理解

    千次阅读 2019-02-19 17:33:54
    2、执行second:funcA()这段代码时传递的self却是second(意思在模块second.lua中函数funcA ( )中的self是second),生成了self.secondNum(就是second.secondNum)这个数据,所以second.secondNum打印出5。...
  • 从API开始理解QNX -- 消息传递

    千次阅读 2012-08-28 13:01:01
    这章就是具体介绐最底层的消息传递API的。消息传递是通过内核进行的,所以所谓的API,实际也就是最底层的内核调用了。需要指出的是,真正在QNX上写程序的时候,很少会直接用到这些API,而是利用更高层的A
  • 关于构造函数传递参数的理解

    千次阅读 2017-03-02 11:18:34
    在此谈谈传递引用类型参数的理解。  1、类 类型:在定义一个类A时,创建类A的带有类类型参数的构造方法,在类B中实例化类A,传递类B的引用。例如: A aa = new A(this);    2、数组类型:将数组看做一...
  • 基本的参数传递机制有两种:值传递和引用传递。值传递:被调用的函数的形式参数作为被调函数局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本,不会影响主调...
  • 梯度反向传递(BackPropogate)的理解

    千次阅读 2019-02-19 15:15:34
    **注意:当使用loss3.backward()时,由于loss3经过A网络和B网络传递得到,因此A网络和B网络的梯度都会计算,使用optimizer_a.step()只跟新A网络的梯度。如果想要传递后的后向拓扑图保存,使用loss.backward(retain_...
  • 根本:数组不能拷贝,所以函数、返回值传递数组变量只能通过数组的指针或者是引用 一、函数返回值问题:指针(注:函数的返回值不能是数组,只能是数组的指针或是引用)1、函数返回指针(包含动态数组)声明:int *...
  • C/C++语言中值传递、指针传递和引用传递

    万次阅读 多人点赞 2018-01-06 00:09:00
    在C语言中值传递、指针传递和引用传递这三种函数参数传递方式是比较基本的知识,用的比较普遍,但不仔细分析其实质的话,时间长容易记混了。网上的资料也较多但多数都不系统,本文力求用最白话的表达和简单的示例把...
  • 传递,地址传递和引用传递

    千次阅读 多人点赞 2014-08-27 20:51:32
    什么是值传递,地址传递和引用传递
  • 函数传递不定参数理解-c语言

    千次阅读 2013-11-17 16:57:01
    2)、ap += sizeof(type):意思是更具类型移动相应的位置; [如果type是int型那么ap向后移4个地址] 3)、(type *)(指针地址)[-1]:整体含义就是回到ap上一个地址位置; (type *)(指针地址):指向ap下一个...
  • 你真的理解Java的按引用传递吗?

    万次阅读 多人点赞 2015-11-02 10:42:31
    学过C/C++的人理解起来可能会容易一点,在一个函数里面修改一个变量的值就要传递该变量的地址。也就是说通过指针来修改(改变指针变量的值要通过二级指针)。 在Java里面传递引用到底是什么意思?实质上就是将该...
  • C++ 值传递、指针传递、引用传递详解 收藏人:学海无涯GL C++中引用返回和标准返回的区别 举个例子: int &f(int &x) { return x; } int main() { int a = 10; int b = f(a); return 0; } 所谓引用传递...
  • Java值传递和引用传递

    2017-02-10 16:31:55
    关于Java值传递和引用传递,可耻的借用某位大神总结的口诀: 1.= 是赋值操作(任何包含=的如+=、-=、 /=等等,都内含了赋值操作)。不再是你以前理解的数学含义了,而+ - * /和 = 在java中更不是一个级别,换句话说...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 188,950
精华内容 75,580
关键字:

怎样理解传递的意思