精华内容
下载资源
问答
  • c++ 对象作为参数,指针作为参数,引用作为参数

    千次阅读 多人点赞 2018-10-14 22:53:44
    c++ 对象作为参数,指针作为参数,引用作为参数

    c++ 参数传递方式有三种,分别为:传对象,传引用和传指针,那这三种传递方式之间到底有什么区别呢?

    传对象:是将实参对象的值传递给形参对象,是单项传递,在函数中修改形参的值时,不会影响到原来实参的值

    传引用:把实参对象名传给形参对象名,形参对象名就成为实参对象名的别名,实参和形参代表同一个对象,所以改变形参,就是改变实参对象的值.

    传指针:将指向对象的指针作为函数的参数,形参是对象的指针,实参是对象的地址值, 通过改变形参的值来改变实参的地址指向,形参传递的就是实参本身,所以当在函数中改变形参的值时,改变的就是原来实参的值.

    引用和指针有什么区别?
    引用和指针有形式之处,都会对内存地址上存在的变量进行修改,但它不占用新的地址,从未节省开销.

    展开全文
  • JS处理函数将对象作为参数传递

    千次阅读 2018-12-01 15:52:58
    做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天...

    做项目的时候遇到一个不是很常见的问题,就是js函数传递参数的时候,我们一般是传递一个数字或者是一个字符串,但是当你的需求满足不了的时候,就需要将对象或者数组作为一个参数传递过去,这个时候怎么做呢,今天简单的说有一下:

    先说一下我出现这个问题的环境,我在处理订单信息的时候,接口给的参数是所有的数据,所以这个时候我需要的是将所有的数据遍历出来,数据结构大概是这样的:

     这个是典型的三层的json结构,所以遍历的难度是不大的,就是很容就遍历出错,我的需求当然不是说仅仅将这些数据遍历出来就可以了,我需要做的是将最里层的data拿到,作为对象传递过去,因为这是每一个订单的具体内容,也就是详情,所以需要明确的将data作为一个参数传递过去,废话不说了,看代码;

    success: function(data) {
    				var odata = data.model_list;
    				for(var i = 0; i < odata.length; i++) {
    					detalData = JSON.parse(odata[i].data);
    					//console.info(typeof detalData);
    					var str = '<a onclick="detal_info(' +                         
                        JSON.stringify(detalData).replace(/\"/g, "'") + ')">' +
                        '</a>'
    					$('#order-detail').append(str);
    }

    这里简单的解释一下,首先拿到了成功的返回数据,这个时候我们看上面的数据结构,最外层的是model_list包括的,所以直接取出来,拿到以后呢将我们需要的data拿到,转为json格式的,这个时候我们下面需要用到里面数据的时候就比较容易拿到,下一步就是怎么将对象data作为一个参数传递过去,我们需要这样处理一下:

    JSON.stringify(detalData).replace(/\"/g, "'")

    将我们拿到的json对象转为string的字符串,然后用正则表达式将里面所有的''转为"",这样下面接收的时候才是可以的。、

    这篇文章没有别的什么技术含量,只是编码过程中一个坑而已,毕竟我写的时候确实是查了资料,才明白,还是觉得应该记录一下,下次遇到了,还是希望可以直接拿来使用。

    谢谢阅读!

    展开全文
  • Java编程中,当对象作为参数传递给方法时候,是按引用传递的,但是有的人会说这实质上是按值传递的。其实两者说的都不错,只是理解的方式不一样罢了,二者的原理其实是一样的。

    一、

    Java编程中,当对象作为参数传递给方法时候,是按引用传递的,但是有的人会说这实质上是按值传递的。其实两者说的都不错,只是理解的方式不一样罢了,二者的原理其实是一样的。


    二、

    下面通过一个例子来详细说明Java对象作为方法参数的时候会出现的情况:

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 测试java的引用传值
     *
     * Created by Xuyh at 2017/01/05 上午 10:27.
     */
    public class SetParamTest {
    	public static void main(String... args) {
    		// 集合对象,列表[a, b, c]
    		List<String> testParam = new ArrayList<String>();
    		testParam.add("a");
    		testParam.add("b");
    		testParam.add("c");
    		System.out.println("Old: " + testParam.toString() + "\r\n");
    
    		// 引用(地址)传值,并直接修改testParam指向对象的值
    		change(testParam);
    		System.out.println("Change1: " + testParam.toString() + "\r\n");
    
    		testParam.add("a");
    
    		// 引用(地址)传值,修改指向对象之后再将地址返回
    		testParam = change2(testParam);
    		System.out.println("Change2: " + testParam.toString() + "\r\n");
    
    		// 集合对象变为[b, c, d, e]
    		testParam.add("d");
    		testParam.add("e");
    
    		// 引用(地址)传值,方法内部new新集合对象并将地址赋给方法局部参数,
    		// 并不改变testParam的值,testParam仍然指向原地址
    		sort(testParam);
    		System.out.println("sort1: " + testParam.toString() + "\r\n");
    		// 引用(地址)传值,方法内部new新集合对象并将地址赋给方法局部参数,
    		// 并将新地址返回,再赋值给testParam,因此testParam指向的对象发生改变
    		testParam = sort2(testParam);
    		System.out.println("sort2: " + testParam.toString() + "\r\n");
    	}
    
    	public static void change(List<String> param) {
    		if (param.contains("a"))
    			param.remove("a");
    	}
    
    	public static List<String> change2(List<String> param) {
    		if (param.contains("a"))
    			param.remove("a");
    		return param;
    	}
    
    	public static void sort(List<String> param) {
    		List<String> newParam = new ArrayList<String>();
    		for (int i = param.size() - 1; i >= 0; i--) {
    			newParam.add(param.get(i));
    		}
    		param = newParam;
    	}
    
    	public static List<String> sort2(List<String> param) {
    		List<String> newParam = new ArrayList<String>();
    		for (int i = param.size() - 1; i >= 0; i--) {
    			newParam.add(param.get(i));
    		}
    		return newParam;
    	}
    }
    

    上面的例子简单的说就是一个列表,[a, b, c],首先通过两个方法把其中的字符”a”去除,然后通过两个方法对列表[b, c, d, e]进行倒序排序。同时在操作的过程中不断将main方法中的testParam输出出来。


    接着请看程序运行的结果:

    Old: [a, b, c]
    
    Change1: [b, c]
    
    Change2: [b, c]
    
    sort1: [b, c, d, e]
    
    sort2: [e, d, c, b]

    由结果可以看到,两个change方法都将原来的testParam改变了,而sort方法只有一个改变了testParam的值,这个有趣的现象接下来要好好说说了。下面从四个比较典型的方法来介绍不同情况下对象作为值传入方法时候内存中的情况,以便我们更好理解java的方法传值原理。


    三、

    change方法

    public static void change(List<String> param) {
    	if (param.contains("a"))
    		param.remove("a");
    }

    testParam作为参数传递给param时候,内存内是这样的:


    testParam的地址值复制给了change方法局部变量param,于是param指向了与testParam相同的一个对象。注意这时候param的引用(地址)值是testParam的一份拷贝。

     

    Change方法中将列表的”a”元素去除时候的情况是这样的:


    此时testParamparam指向的对象(同一个)发生了改变,所以方法执行完毕之后输出testParam是发生改变的。



    change2方法

    public static List<String> change2(List<String> param) {
    	if (param.contains("a"))
    		param.remove("a");
    	return param;
    }

    change方法类似,当对象在方法中发生改变时候,内存中的情况是这样的:


    testParam = change2(testParam);

    方法执行到最后,param会返回,也就是param的引用(地址)值会返回,然后又拷贝给testParam(其实是多此一举,二者的地址值完全相同)。所以方法执行完成之后输出的testParam是发生改变的。



    sort方法

    public static void sort(List<String> param) {
    	List<String> newParam = new ArrayList<String>();
    	for (int i = param.size() - 1; i >= 0; i--) {
    		newParam.add(param.get(i));
    	}
    	param = newParam;
    }

    调用方法时候内存中是这样的


    接着,方法中new了一个新的对象,并在处理排序之后将新对象的引用(地址)赋值给param,这时候内存中的情况是这样的:


    可以看到,testParamparam指向的已经不是同一个地址了,并且testParam指向的对象仍然没有发生改变。因此方法执行完毕之后输出的结果看来,sort方法是没有用的。



    sort2方法

    public static List<String> sort2(List<String> param) {
    	List<String> newParam = new ArrayList<String>();
    	for (int i = param.size() - 1; i >= 0; i--) {
    		newParam.add(param.get(i));
    	}
    	return newParam;
    }

    sort方法类似,执行sort2方法前内存中是这样的:


    新对象排序完成后是这样的:


    这时候testParamparam都是指向原来的对象

    方法的最后把newParam返回,即将newParam的引用(地址)值返回,在main方法中将其赋值给testParam

    testParam = sort2(testParam);

    然后内存中就是这样的了:



    因此经过返回后的sort2方法是有作用的。



    四、

    小结:

    通过以上的分析可以得出,Java中对象作为方法参数传递的是对象引用(地址)值的拷贝,通俗的讲,就是拷贝了一把钥匙,main方法中的钥匙跟被调用方法中参数的钥匙对应能打开的房间是相同的,但是是不同的钥匙。如果在被调用方法中,参数钥匙被修改了(new了一个新对象并赋值给参数钥匙),不会影响main方法钥匙指向的房间。这点是值得注意的。

     

    因此如果想要在被调用方法中不修改参数指向的对象,可以通过new一个新的对象来实现,但是如果想要new一个新的对象并使main方法该对象变成这个新的对象,就要将其作为返回值返回并赋值给旧对象变量了。




























    展开全文
  • java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? pdd:所谓java只有按值传递:基本类型 值传递;引用类型,地址值传递,所以叫值传递。  当主函数的变量,对象(主本)传递到副函数时,传递的...

    看完绝对清晰~

    java中对象作为参数传递给一个方法,到底是值传递,还是引用传递?

    pdd:所谓java只有按值传递:基本类型  值传递;引用类型,地址值传递,所以叫值传递。

        当主函数的变量,对象(主本)传递到副函数时,传递的变量、对象(方法中的形参)其实都是副本,而副本的改变不会影响主  本。

    基本类型:传递的是值的拷贝,也就是说传递后就互不相关了,也就是说,不过副函数的副本如何变化,主本永远不会被影响。

    引用类型:传递的是引用地址值,有可能会被影响。

    string:具有不可变。是特殊的引用类型,其作用跟基本类型一样,传递后不相关。

     

    原作者:

    String和int参数传递是按值传递还是引用传递?

    一道面试题目,String的传递:

    1

    2

    3

    4

    5

    6

    7

    8

    9

    public String change(String s){

         s = "222";

         return s; 

    }

    public static void main(Stirng[] args){

        String s = "111"

        change(s);

        sout(s);

    }

    我看到题目愣了一下,本来不假思考的结果是111,但仔细想,String是对象类型的,对象传递的是地址,那么地址传递到方法里面后,将指向修改成222,那么结果应该是222才对。实际恰恰相反。

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

    java传递参数都是值,如果是对象的话,就是将引用的值复制一份给方法当参数。如果是根据引用把堆里的对象修改了,那么对象真被修改了,不过不是被创建赋值给的那个引用修改的,是方法里的一个复制的引用副本给修改的。换句话说,施瓦星格的媳被施瓦星格的克隆人亲了下。

    用实例去理解,其实这个理解也就是根据jdk的结果告诉我自己记住规则是这样的,以后要记住。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

      public String change(String s, int i, StringBuffer sb, Person p){

            s="123";

            i=3;

            sb.append("woshi");

            p.setAge(100);

            sb = new StringBuffer("sbsb");

            p = new Person("bb",44);

            return s;

        }

     

        @Test

        public void testChange(){

            StringBuffer sb = new StringBuffer("buff");

            String s = "aaa";

            int i = 1;

            Person p = new Person("aa",12);

            i=2;

            change(s,i,sb,p);

    //        s="222";

            System.out.println(s);

            System.out.println(i);

            System.out.println(sb.toString());

            System.out.println(p);

        }

    这里一共测试了String,int,一个对象StringBuffer,一个对象people。让我们来仔细看看这些传递都发生了什么。我想有很大一部分人都猜不出打印结果。

    1

    2

    3

    4

    aaa

    2

    buffwoshi

    Person{id=0, name='aa', age=100, Country=null, hashcode=638783031}

    我们来一个个分析。

    首先是String。

    1

    String s = "aaa";

    这里,jvm创建一个变量引用s,在堆中创建一个对象aaa,将aaa放进常量池。s指向aaa。

    然后就到了change方法里。这里这样理解:将s引用的一个拷贝传给方法change。这样change有一个变量s,这个s也是指向aaa的。那么我们来通过debug来看后来发生了什么。

    1.s指向aaa的时候:

    2.s运行到change方法里的时候

    然后看s再次赋值的时候:

    然后我们运行结束change方法后到主方法里:

    到这里s就结束了。那么如果我们按照传递的是s这个变量的引用,即String s="aaa"中这个s本身,那么,s这个本身是个变量,s指向aaa,在方法change里s又指向了123,回到主方法后s变量的指向被改变了?错!显然s仍旧是aaa,那么只能这样理解:s传递到方法里的时候,复制了s指向的地址给change,change里的s是另一个s,s指向aaa(@718),然后在change中s又指向了123(@731),由于String是不可变类(final and Immutable),这里只是把副本s的指向修改成731,原地址718里的对象没有发生改变因为String不可变。那么,回到主方法的时候,s变量本身没有任何改变,s仍旧指向地址718,718的内容是aaa。所以最终打印aaa。

    然后是StringBuffer

    int是基本类型,所以int只是将值复制一份给别的方法用,这个大家都知道,就不去测试了。现在看StringBuffer发生的改变。

    1.初始化:

    2.到change方法中:

    3.发生append

    4.指向新对象

    这里就要说一下了,副本指向了新对象。就好比,施瓦星格的克隆人找了另一个女的当老婆,而真正的施瓦星格老婆没有变。

    5.回到主方法:

     

    到这里,StringBuffer就结束了。我们必须知道,虽然我们没有去研究源码是怎样实现的,change方法得到是一个sb的副本,只不过这个副本指向708,在change里对708的对象追加,708的对象就真的改变了。然后又把sb副本指向新地址737。这只是把副本指向的地址修改了,如果你在这里打印sb.toString(),打印的就是737里的内容。当跳出change,回到主方法的时候,原sb仍旧还是指向708的,最终就是打印708的结果。和String不同的是,StringBuffer的结果发生了变量,因为StringBuffer是可变的,可以append。而String是不可变的,在change中s=123就是发生两个行为,一个是查找常量池中是否有123,如果没有就在堆中创建123,一个是将s指向123.也就是说这时候是创建了一个新的String对象,而不是把原来的String对象s内容修改。这样,回到主方法的时候,s仍旧是aaa。

    同理,看自己创建的对象people

     

    1.初始化:

    2.p传递到change里的时候

    3.p副本设置age

    4.p副本重新赋值

     这里仍旧要说一下,p副本修改了自己指向,并不影响主方法里的p的指向。主方法里的p的指向没有发生变化,依旧应该还是720.

    5.回到主方法

    总结:

    通过上面对String,StringBuffer,People的研究,应该明白一个道理,重要的话说三遍,重要的规则我都演示了三遍。如果跟着步骤一步步走的,肯定牢记住了:

    java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!java所有的参数传递都是传递的副本,变量所代表的值的副本!

    这里必须记住的就是副本概念。在方法里,运行的时候到这里的线程都会把传过来的参数拷贝副本带自己的工作区中,在工作区中对这个副本的值发生一些改变。最终改变的是副本,如果通过副本的指向修改了指向中的内容,那么那个指向的地址里的内容确实改变了。如果修改了副本的指向,即给副本重新赋值,那么关原来的变量何事?元变量仍旧指向最初的地址。

    那么,String传递过去的是副本,修改了副本的指向,打印元string是不会改变的,因为副本没有能力修改final的String类。

     

    出处:http://blog.csdn.net/zzp_403184692/article/details/8184751

    展开全文
  • java中把对象作为参数传递的理解

    万次阅读 2017-12-29 14:24:12
    只不过,当把对象作为参数传递时,可以通过该副本引用改变该对象的的属性。 而我上面程序在方法里 issuePublishDate = null; 这里已经对变量重新赋值了。此时的变量 issuePublishDate 已经不再是参数传进来的那个...
  • JAVA在方法中对象作为参数传递

    千次阅读 2018-02-23 17:42:35
    但是在java中,将方法A中的某个对象传递到方法B中进行修改后,再返回到A中,我们会发现对象在B中的修改在A中也有效。示例代码如下:有一个bean类:public class DemoBean { private String id; pu...
  • 关于Java对象作为参数传递是传值还是传引用的问题

    万次阅读 多人点赞 2016-09-06 22:37:20
    前言 在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参的一个副本,函数对形参的操作并不会对实参产生影响;若传的是引用,...
  • js对象作为参数传参与后台接收参数

    千次阅读 2018-07-03 13:23:52
    方式一:序列化js对象 *** js对象的每个属性名需跟后台对象属性名一一对应,否侧不能封装 var params = new Object(); params.status= status; params.id=centerId; params.appointmenttime=appointmentTime; ...
  • Python之函数对象作为参数

    千次阅读 2016-04-11 16:11:32
    作为对象,它还可以赋值给其它对象名,或者作为参数传递。函数作为参数传递函数可以作为一个对象,进行参数传递。函数名(比如func)即该对象。比如说:def test(f, a, b): print 'test' print f(a, b)test(func, 3, ...
  • Java中接口对象作为参数传递

    千次阅读 2016-05-23 18:56:14
    Java中接口对象作为参数传递(小例子)
  • * 把json对象拆成url参数格式的方法 * @data 需要处理的json对象 */ function getParam(data){ let url = ''; for(var k in data){ let value = data[k] !==undefined ? data[k] : ''; url += `&$...
  • R语言-引用函数对象作为参数

    千次阅读 2017-03-17 17:41:22
    问题描述如何在在R的函数中通过字符串调用别的函数。 以下面为例子:testFun (Fun){ x Fun(x) }解法这个问题没什么其实很笨,就是想记录一下。#1. 直接调用 testFun (Fun){ x ...testFun(Fun =
  • java中String对象作为参数传递问题

    千次阅读 2020-06-03 15:24:04
    java中将对象作为参数传递究竟是值传递还是引用传递? 1、基本类型作为参数传递时,是传递值的拷贝,无论你怎么改变这个拷贝,原值是不会改变的。 2、对象作为参数传递时,是把对象在内存中的地址拷贝了一份传给了...
  • 方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。 下面举例说明...
  • 将JSON对象作为参数的方法

    千次阅读 2018-12-11 09:06:55
    这里一定要注意单引号和双引号的用法,否则就不能正确传递。原因是json内包含双引号。 return "&lt;div&gt;&...button class='btn btn-xs btn-warning btnEditSupervisorDuty ' onclick='...
  • c++类的对象作为方法参数(即函数参数

    万次阅读 多人点赞 2019-09-12 17:13:03
    c++类的对象作为参数传递时,有三种传递方式 #include <iostream> using namespace std; //求圆的面积 class Mycircle{ public: double r; double s; public: double getR(){ return r; } void setR...
  • Json对象作为参数的传递和接收

    千次阅读 2019-08-17 10:06:52
    var user = encodeURL(JSON.stringify(data[i])); data[i]为json对象 var temp = JSON.parse(decodeURL(obj)); 接收编码后的数据并转为JSON对象
  • 一、对象作为参数传递到函数中,在函数内部对此对象的参数会影响到外部传递进来的对象。 二、对象作为参数传递到函数中,在函数内部指向其它的对象后,再对此参数对象进行操作时,不影响外部传递进来的对象。 如下...
  • 面试题: 在调用方法的时候,若要使方法改变参数的值,...用对象作为参数 C.以上都对 D.以上都不对 public class Test { public static void main(String[] args) { int a = 5; int[] arr = {1, 2, 3}; ...
  • C#函数 把 对象作为参数传递

    千次阅读 2013-01-29 23:13:22
    private void btnGetPrintingName_Click(object sender, EventArgs e) { string strRegText=this.textBoxRegText.Text; ... Regex reg = new Regex(strRegText...对象 要用new 创建,才是"值"传递.;string是例外
  • 我们知道方法参数如果是引用类型的话,则方法调用时,将把实例对象的地址传递给方法参数,这样在被调用方法中就可以通过实例对象的地址来操作实例对象的数据。故在SetInstanceNull方法中我们能将children实例中inter...
  • 对象作为函数参数

    千次阅读 2017-02-21 21:02:14
    网上看见一段代码,是关于类对象作为函数的参数,其中有几点知识,贴出来大家一起学习。 直接来看代码: #include #include using namespace std; class people { private: char *name; int age; public: ...
  • 新建maven工程项目,关于feign的项目...自己百度去,下面只说调用服务提供者如何将对象作为参数?(1)导包,如图:(2)在配置文件中添加(3)在service接口中添加(4)在服务提供者中添加至此,完毕!!!!!! ...
  • 大家可能有听说过springmvc的POJO,简单来说,就是提交一个表单数据,然后springmvc帮我们把提交过来的参数,一一对应地填充到对象中去。 这样有什么好处呢。假设我们现在提交一个表单,表单里有100个input,如果...
  • 使用java对象'Book'作为表名来查自然是不对的。只需将Book替换为表名book。 @Query(value = "select * from book b where b.name=?1", nativeQuery = true) List<Book> findByName(String name);     ...
  • Delphi 中将对象作为参数传递的使用

    千次阅读 2010-04-19 08:06:00
    Delphi 中将对象作为参数传递的使用 举例分析2009-07-24 13:40 下面的单击事件,将要调用一个以对象为参数的方法,并将结果显示出来。procedure TForm1.btn1Click(Sender: TObject);varlStrings: TStrings;...
  • 在C++中对象作为函数参数进行传递时同样有以上三种方式。 今天在学习过程中,发现在C++使用对象作为函数参数进行传递时,实参向形参采用传值的方法进行传递,但是在函数中使用this指针,分别指向对象的数据成员,在...
  • c#中对象作为方法参数传递引用传递,值传递这本是一个很简单的知识点,但是我们在实际开发过程中还是蛮容易踩到这个 坑,尤其是在维护他人代码。逻辑比较复杂的时候,容易出错,哈哈,警醒一下。 如图所示,对象...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,819,787
精华内容 727,914
关键字:

对象作为参数

友情链接: sp_for_cmpp.rar