精华内容
下载资源
问答
  • java中参数的传递,字符串做参数的传递情况

    万次阅读 多人点赞 2018-08-23 14:13:50
    java中参数的传递,字符串做参数的传递情况 首先明确的一点就是在java中只有值传递!只有值传递!理论依据来自《think in java》。接下来就是具体说明为何java只有值传递。 因为java中有基本类型和引用类型两种...

    java中参数的传递,字符串做参数的传递情况

    首先明确的一点就是在java中只有值传递!只有值传递!理论依据来自《think in java》。接下来就是具体说明为何java只有值传递。
    因为java中有基本类型和引用类型两种数据类型,再加上String这个特殊的类型,所以主要从三个方面就行解释。

    1.基本数据类型
    先看代码

    public class Test01 {
    
        public void change( int a){
            System.out.println("副本a 的初始值"+a);
            a= 20;
            System.out.println("副本a 的新值值"+a);
        }
        public static void main(String[] args) {
            int a = 10;
            Test01 t = new Test01();
            t.change(a);
            System.out.println("方法执行后的值"+a);
    
        }
    
    }

    在java中基本数据类型遵循值传递,所以在t 在调用change()方法时,
    只是将原数据a的副本传给方法中的参数,第一时间原本和副本a的值都是10,
    在执行到a=20后,副本a的值变成了20。所以运行结果为:

    这里写图片描述

    这里写图片描述

    2.引用数据类型

    public class Test02 {
    
        char[] ch = { 'a' , 'b' , 'c' };
        public static void main(String[] args) {
             Test02  ex = new Test02();
             ex.change(ex.ch);
             System.out.println(ex.ch);
        }
        public void change(char ch[]){
             System.out.println("方法中ch[0]的初始值:"+ch[0]);
                ch[0] = 'g';
             System.out.println("方法中ch[0]执行后的新值:"+ch[0]);
        }
    
    }

    在引用类型作为参数进行传递时,也属于值传递,此时传递的是地址值副本,但是这两个地址指向同一个地方。在副本地址没有进行更改指向时,对副本地址指向的数据进行操作会影响到原始数据的值。方法中ch[] 数组和原始ch[]数组指向同一个数据,所以初始阶段ch[0]都指向’a’;接着对副本中的ch[0]进行新的赋值变为‘g’。
    所以运行结果为:

    这里写图片描述

    这里写图片描述

    3.字符串的参数传递

    public class Test {
    
        public static void main(String[] args) {
    
            String s = new String("aaa");
            System.out.println("原始字符串s的hashcode值:"+ s.hashCode());
            Test t = new Test();
            t.change(s);
            System.out.println("方法调用后s的值"+s);
        }
        public void change(String s1){
             System.out.println("方法中s1初始值"+s1);
             System.out.println("方法中s1初始hashcode值"+s1.hashCode());
             s1 ="bbb";
             System.out.println("方法中s1赋值后:"+s1);
             System.out.println("方法中s1赋值后hashcode值:"+s1.hashCode());
    
        }
    
    }

    字符串是一个特殊的数据类型,它的底层是一个final 型的ch[]数组,属于无法更改,所以字符串在作为参数传递时,可以当做一个特殊的数组进行操作,同样的它也是将复制一份原本的对象引用给了副本,此时副本对象的引用和原本对象的引用都指向原始字符串的位置,也就是s1和在刚开始初始化时它指向的地址和原对象s指向的位置一致,即s1的初始hashcode值和原对象s的hashcode值一样,s1经过s1=“bbb”操作后,由于字符串的不可变性,此时会s1一个新的对象引用,即此时s1指向“bbb”的位置。s1的hashcode值会变化,但是原本s它的对象引用没有发生改变,并且“aaa”也未发生改变,所以s任然指向”aaa”。运行结果如下:

    这里写图片描述

    接下来看一个更具体的字符串例子:

    public class Base {
    
        public static void main(String[] args) {
            StringBuffer s = new StringBuffer("hello");
            StringBuffer s2 = new StringBuffer("hi");
            test(s, s2);
            System.out.println("方法調用后s的值:"+s);
            System.out.println("方法調用后s2的值:"+s2);
        }
        static void test(StringBuffer s3, StringBuffer s4) {
            System.out.println("方法初始化時s3的值"+s3);
            System.out.println("方法初始化時s4的值"+s4);
            s4 = s3;
            s3 = new StringBuffer("new");
            System.out.println("第一步变化后s3的值"+s3);
            System.out.println("第一步变化后s4的值"+s4);
            s3.append("boy");
            s4.append("gril");
            System.out.println("第二步变化后s3的值"+s3);
            System.out.println("第二步变化后s4的值"+s4);
    
        }
    
    }

    这次先看结果:
    这里写图片描述

    然后进行分析。在未执行方法之前,字符串s1和s2指向的位置分别是“hello”和“hi”,这个毋容置疑,
    (1)接着进入方法内部,方法中参数s3和s4初始化时和上面例子相同,此时它们和s1s2指向同一个位置,或者说s1s2将对象引用副本给了s3s4,此时s3s4的值为“hello”和“hi”,
    (2)接着执行s4=s3,这个操作就是将s3的对象引用给了s4,此时s4为“hello”;s3=new StringBuffer(”new”);这个操作要注意,此时相当于给了s3一个新的对象引用,s3指向一个字符串为“new”的位置,所以此时s3=“new”,s4=“hello”。
    (3)然后s3.append(“boy”);s4.append(“gril”);在StringBuffer中的append方法要注意,它的操作不会为s3s4指向一个新的对象引用,是在原来的基础上进行操作,因此操作完之后s3=“newboy”,s4=“hellogrill”。
    (4)此时方法调用完,回头捋一下s3s4在此过程中的对s1s2的影响。
    ——- A . 首先是s3和s1一样刚开始指向“hello”,接着给s3创建一个新的对象引用“new”,此时s3和s1再无半毛钱关系,s3进行append(boy)后,s3=“newboy”;
    ——– B . s4刚开始和s2都指向“hi”,接着s3将自己初始值(也就是s1的副本)给了s4,此时s4指向“hello”(这会s4和s1有了关系),s4执行append(grill)操作,因为它和s1指向相同位置,所以它们的共同指向的对象会变化,s4=s1=“hellogrill”。
    ——- C .然后就清楚了,s2指向的对象“hi”并未变化,s1指向的“hello”在append(“grill”)操作下变成了“hellogril”。

    最后总结一下,
    1).当使用基本数据类型作为方法的形参时,在方法体中对形参的修改不会影响到实参的数值
    2).当使用引用数据类型作为方法的形参时,若在方法体中修改形参指向的数据内容,会 对实参变量的数值产生影响,因为形参变量和实参变量共享同一块堆区;
    3).当使用引用数据类型作为方法的形参时,若在方法体中改变了形参变量的指向,此时不会 对实参变量的数值产生影响,因此形参变量和实参变量分别指向不同的堆区;最后一个例子就是最形象的解释。
    4)关于字符串做参数,也是看它的参数变量指向是否发生了变化,因为String的底层为final类型的char[]原因,当你在String s = “aaa”还是String s = new String(“aaa”)时,都会为s创建一个新的对象引用。但是调用了append()方法时,是不会指向新的对象,会在原来的指向的对象上发生改变,与它共享的对象引用也会发生变化。
    5)最后重复的是java中没有引用传递,只有值传递,引用类型属于特殊值传递(是将它的地址副本给了参数,但是它与基本数据类型不同,如果地址指向的对象发生了变化,因为共享原因,原始对象也会改变)。

    这是自己第一次写博客,写的不好轻喷,可以留言讨论。

    展开全文
  • python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析 先看第一个问题,在python中函数参数的定义主要有四种方式: 1.F...

    python中函数参数的传递是通过赋值来传递的。函数参数的使用又有俩个方面值得注意:1.函数参数是如何定义的 2.在调用函数的过程中参数是如何被解析

    先看第一个问题,在python中函数参数的定义主要有四种方式:
    1.F(arg1,arg2,...)
    这是最常见的定义方式,一个函数可以定义任意个参数,每个参数间用逗号分割,用这种方式定义的函数在调用的的时候也必须在函数名后的小括号里提供个数相等的 值(实际参数),而且顺序必须相同,也就是说在这种调用方式中,形参和实参的个数必须一致,而且必须一一对应,也就是说第一个形参对应这第一个实参。例 如:
    def a(x,y):
    print x,y
    调用该函数,a(1,2)则x取1,y取2,形参与实参相对应,如果a(1)或者a(1,2,3)则会报错。


    2.F(arg1,arg2=value2,...)
    这种方式就是第一种的改进版,提供了默认值
    def a(x,y=3):
    print x,y
    调用该函数,a(1,2)同样还是x取1,y取2,但是如果a(1),则不会报错了,这个时候x还是1,y则为默认的3。上面这俩种方式,还可以更换参数位置,比如a(y=8,x=3)用这种形式也是可以的。


    3.F(*arg1)
    上面俩个方式是有多少个形参,就传进去多少个实参,但有时候会不确定有多少个参数,则此时第三种方式就比较有用,它以一个*加上形参名的方式来表示这个函数的实参个数不定,可能为0个也可能为n个。注意一点是,不管有多少个,在函数内部都被存放在以形参名为标识符的tuple中。
    >>> def a(*x):
    if len(x)==0:
    print 'None'
    else:
    print x
    >>> a(1)
    (1,)        #存放在元组中
    >>> a()
    None
    >>> a(1,2,3)
    (1, 2, 3)
    >>> a(m=1,y=2,z=3)

    Traceback (most recent call last):
    File "<pyshell#16>", line 1, in -toplevel-
    a(m=1,y=2,z=3)
    TypeError: a() got an unexpected keyword argument 'm'


    4.F(**arg1)
    形参名前加俩个*表示,参数在函数内部将被存放在以形参名为标识符的dictionary中,这时调用函数的方法则需要采用arg1=value1,arg2=value2这样的形式。
    >>> def a(**x):
    if len(x)==0:
    print 'None'
    else:
    print x  
    >>> a()
    None
    >>> a(x=1,y=2)
    {'y': 2, 'x': 1}      #存放在字典中
    >>> a(1,2)            #这种调用则报错

    Traceback (most recent call last):
    File "<pyshell#25>", line 1, in -toplevel-
    a(1,2)
    TypeError: a() takes exactly 0 arguments (2 given)


    上面介绍了四种定义方式,接下来看函数参数在调用过程中是怎么被解析的,其实只要记住上面这四种方法优先级依次降低,先1,后2,再3,最后4,也就是先把方式1中的arg解析,然后解析方式2中的arg=value,再解析方式3,即是把多出来的arg这种形式的实参组成个tuple传进去,最后把剩下的key=value这种形式的实参组成一个dictionary传给带俩个星号的形参,也就方式4
    >>> def test(x,y=1,*a,**b):
    print x,y,a,b


    >>> test(1)
    1 1 () {}
    >>> test(1,2)
    1 2 () {}
    >>> test(1,2,3)
    1 2 (3,) {}
    >>> test(1,2,3,4)
    1 2 (3, 4) {}
    >>> test(x=1,y=2)
    1 2 () {}
    >>> test(1,a=2)
    1 1 () {'a': 2}
    >>> test(1,2,3,a=4)
    1 2 (3,) {'a': 4}
    >>> test(1,2,3,y=4)

    Traceback (most recent call last):
    File "<pyshell#52>", line 1, in -toplevel-
    test(1,2,3,y=4)
    TypeError: test() got multiple values for keyword argument 'y'

    展开全文
  • 前边的初始化包括额外参数的传递实现还是比较方便,但是后端接收数据费了一段时间,特此记录一下,方便之后使用。下面是初始化时候的代码: $("#uploadfile").fileinput({//初始化uploadf...

    直接进入正题,bootstrap fileinput的使用可以使文件上传时的界面更美观,想要一起传递的参数可以在初始化的时候通过uploadExtraData一起传递到后台。前边的初始化包括额外参数的传递实现还是比较方便,但是后端接收数据费了一段时间,特此记录一下,方便之后使用。

    下面是初始化时候的代码:

            $("#uploadfile").fileinput({//初始化uploadfile控件
            language:'zh',
            uploadUrl:'/IntelligentMirrors/apkUpload',//初始化url参数能否重新赋值
            allowedFileExtensions:['txt'],
            uploadAsync:true,//默认异步上传
            showUpload:true,//是否显示上传按钮
            showRemove:true,//显示移除按钮
            showPreview:true,//是否显示预览
            showCaption:false,
            browseClass:"btn btn-primary",//按钮样式
            dropZoneEnable:true,//是否显示拖拽区域
            maxFileCount:1,//允许同时上传的最大文件数
            enctype:'multipart/form-data',
            validateInitialCount:true,
           
                    uploadExtraData:function(){//向后台传递参数
                var data={
                    apkName:$("#apkName").val(),
                      versionNum:$("#versionNum").val(),
                    description:$("#description").val() 
                    };
                    return data; 
                    },

            });

    其中uploadExtraData的书写方式,由于要同时携带多个参数,所以参考了别人的博客,在此表示感谢,(没有记清楚博客地址,以后一定多加注意)。初始化过程中还需要注意的是enctype:'multipart/form-data'这个也是必须要有的。

    后端除了文件之外还要接收apkName、versionNum、description三个参数,将他们存储到数据库中。

    在后台处理的时候寻找这三个参数在哪儿费了挺大劲,可能也是自己个儿对整个过程的认识不太熟悉吧,于是我想到还是debug吧,好好找一下看看到底在什么地方,下边贴一下后端处理的代码吧:

    MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
    MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);

    在这之前一直在request里边寻找这几个参数的踪迹,但是不知道为啥都没有发现,因此转换为MultipartHttpServletRequest 来接收bootstrap fileinput传递过来的文件信息,我在MultipartHttpServletRequest 处打了一个断点,开始debug,还是像之前一样开始先看它的对象multipartRequest里边是不是有什么好玩的东西。当我看到下边图片里的东西的时候高兴坏了,哈哈哈


    从multipartRequest里边的multipartParameters里边我看到了我想要的参数,能看到size是4,这是因为里边还有一个file_id字段,剩下的就好说了,但还是有地方需要注意一下:

    使用multipartRequest.getParameterMap()来获取那些参数信息,如下:

    Map<String, String[]> map = multipartRequest.getParameterMap();

    返回值是Map<String,String[]>类型,也就是说通过get方法获取到的是一个字符数组,直接打印或者使用toString()方法可能会有问题,因此我用了一个比较笨的方法,就是把value值放到了一个ArrayList里边,然后在从list里边取出需要传递到service层的参数。简单记录一下吧:

    Map<String, String[]> map = multipartRequest.getParameterMap();
    Set<Entry<String, String[]>> set = map.entrySet();
    Iterator<Entry<String, String[]>> iter = set.iterator();
    List<String> list = new ArrayList<String>();
    while(iter.hasNext()){
    Entry<String,String[]> entry = iter.next();//获取到entry
    String[] value = entry.getValue();
    list.add(value[0].toString());

    }

    这样之后,参数就可以在获取以后正确的向后传递了。方法比较愚钝,主要是想要与大家分享一下这个过程,大家共同进步。向参考的博客表示感谢,以后一定注意列出链接,感谢大家,希望大家多批评指正,谢谢。

    展开全文
  • JS 页面跳转,参数的传递

    千次阅读 2018-12-26 14:36:22
    当我们通过location.replace()进行页面的跳转时,我们想进行参数的传递,当时学习的时候,以前在网上找过获取方法,已经忘记出处在哪里了。获取方法大概是这样的: 1.将参数通过拼接的方式拼接到页面的后面。 2....

    当我们通过location.replace()进行页面的跳转时,我们想进行参数的传递,当时学习的时候,以前在网上找过获取方法,已经忘记出处在哪里了。获取方法大概是这样的:

    1.将参数通过拼接的方式拼接到页面的后面。

    2.页面跳转后,解析url,根据关键字符'?',区别是页面还是后面的参数

    3.根据关键字符'=',区分是参数名还是参数值

     

    直接将代码复制过来。大致看下就会看懂。

    1.js页面跳转

    location.replace('EditItem.html?itemId='+row.id);

    2.在EditItem.html的js中解析参数。

    //获得传过来的login与在数据库中对应的表单
    var paras = location.search;			//search获得地址中的参数,内容为'?itemId=12'
    var result = paras.match(/[^\?&]*=[^&]*/g); 	//match是字符串中符合的字段一个一个取出来,result中的值为['login=xx','table=admin']
    paras = {};					//让paras变成没有内容的json对象
    for(i in result){
    	var temp = result[i].split('=');	//split()将一个字符串分解成一个数组,两次遍历result中的值分别为['itemId','xx']
    	paras[temp[0]] = temp[1];
    }
    var itemId = paras.itemId;     //根据参数名"itemId",获取参数值
    console.log(itemId);

     

    展开全文
  • C++ string作为参数的传递(string类型的引用 ) 在传递参数的时候,如果参数是string类型,可以用string类型的引用,减少内存的拷贝。 例如: void func(const string&amp; para){} int main(int agrc, char **...
  • 两个Fragment之间参数的传递

    万次阅读 多人点赞 2012-05-11 15:04:28
    使用Fragment的时候可能需要在两个Fragment之间进行参数的传递,开始想着可以使用SharedPreferences进行处理,想想这些简单的参数没有必要使用这么麻烦的方式去实现,翻了一下Fragment的API,找到一个方法就能实现像...
  • php post json参数的传递和接收处理

    万次阅读 2017-04-27 12:51:39
    http php post json参数的传递和接收处理
  • JNI编程之如何传递参数(一)——String参数的传递

    万次阅读 多人点赞 2012-08-19 16:11:00
    String参数的传递 Java的String和C++的string是不能对等起来的,所以处理起来比较麻烦。先看一个例子, class Prompt { // native method that prints a prompt and reads a line private native String getLine...
  • 近段时间,有几个刚刚开始学习C#语言的爱好者问我:C#中的函数,其参数的传递,按值传递和按引用传递有什么区别。针对这一问题,我简单写了个示例程序,用以讲解,希望我没有把他们绕晕。因为,常听别人说起:“你不...
  • web页面中参数的传递方法

    千次阅读 热门讨论 2015-07-05 20:00:13
    在web页面中参数的传递方法多样,主要有以下几种: Viewstate,Querystring,Session, Application,Cookie,Cache。
  • Android的intent之间复杂参数的传递

    万次阅读 2012-04-13 09:01:34
    Android的intent之间复杂参数的传递 ——Object、List、List和全局变量 张伟 1101211074  老师在《Lecture03_应用程序框架及关键组件_1》课上有介绍了Intent是Activity与Activity之间,Activity与Service...
  • Java程序利用main函数中args参数实现参数的传递

    万次阅读 多人点赞 2013-09-10 11:12:58
    Java程序利用main函数中args参数实现参数的传递 1.运行Java程序的同时,可以通过输入参数给main函数中的接收参数数组args[],供程序内部使用!即当你在Java命令行后面带上参数,Java虚拟机就直接把它们存放到了main...
  • Ireport子报表的实现以及参数的传递

    万次阅读 2014-08-28 09:11:59
    Ireport子报表的实现以及参数的传递 1. 打开ireport后,首先设置数据源,这里对数据源进行命名为JDBCCONN,设置好之后点击test可以测试连接是否正确,若是不正确可能有以下几种原因, Ø  url地址错误 Ø ...
  • php --- get参数的传递和接收

    千次阅读 2016-06-29 15:58:04
    ThinkPHP 20151012 ---- 5.2 get参数的传递和接收 pathinfo路由解析方式传递get参数信息格式: http:网址/index.php/分组/控制器/操作方法/名称/值/名称/值 控制器操作方法接收get参数: 并不是直接使用$_GET...
  • 参数的传递方式

    千次阅读 2011-05-11 16:04:00
        java中参数传递传递:   方法调用(call by)是一个标准计算机科学术语。方法调用根据参数传递的情况又分为值调用(call by reference )和引用调用(call by value )。江湖上有很多...
  • (三)Java中利用利用main函数中的参数实现参数的传递 1、主要功能 是在Java程序运行的时候,可以通过输入参数给main函数中的接收参数数组,然后使用out方法在控制台输出; 2、代码如下 public class ...
  • 引用类型的形式参数解析普通类:需要的是该类的对象抽象类:需要的是该抽象的类子类对象抽象类作为形式参数的传递接口作为形式参数的传递abstract class Person { public abstract void study(); }class PersonDemo { ...
  • 最近一直有事儿,所以博客没有更新,但是学习reactnative的脚步不能停止!所谓日积跬步,可跨千里。好啦,多余的话就不多说了,今天主要是讲解一下,android与rn之间初始化参数的传递
  • 5.4.2 变长参数的传递 上一节讲述了如何创建具有变长参数的函数和如何读取变长参数,其操作都在函数内完成,本节将讲述把变长参数列表整体作为参数传递给其他函数的方法。 变长参数传递的函数族如下:   ...
  • web项目中界面(jsp或者js)之间参数的传递
  • require方法接受以下几种参数的传递: http、fs、path等,原生模块。./mod或../mod,相对路径的文件模块。/pathtomodule/mod,绝对路径的文件模块。mod,非原生模块的文件模块。
  • 在做 Flutter 开发时候所有页面以及页面上元素都变成了 Widget ,创建一个页面或者视图直接 new 一个新 widget 就可以,相关的参数我们可以直接通过构造函数直接传递。 我们做 Android 开发人员都知道 ...
  • Jenkins参数化构建过程中参数的传递

    千次阅读 2017-02-13 10:45:12
    设置完参数化构建过程后面板如下: 将参数传递到Python脚本中: P4_Version = os.environ["P4_Version"]; #P4版本号 P4_Version = P4_Version.strip(); DevelopmentBuild = os.environ["Development...
  • C#语言函数参数的传递

    千次阅读 2005-10-27 17:26:00
    C#语言函数参数的传递 就像C语言众多的后世子孙一样,C#的函数参数是非常讲究的。首先,参数必须写在函数名后面的括号里,这里我们有必要称其为形参。参数必须有一个参数名称和明确的类型声明。该参数名称只在函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,328
精华内容 63,331
关键字:

参数的传递