精华内容
参与话题
问答
  • java中的参数传递(只有值传递没有引用传递)

    万次阅读 多人点赞 2019-07-31 19:25:14
    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。 java中的数据类型 Java中...

    Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递)。所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答。

    java中的数据类型

    Java中数据类型分为两大类:基本类型和引用类型。相应的,变量也分这两种类型:基本类型和引用类型。

    基本类型的变量保存原始值,即它代表的值就是数值本身;

    而引用类型的变量保存的值是引用值,"引用值"指向内存空间的地址,代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。

    基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress。

    引用类型包括:类、接口类型和数组。

    java中只有值传递

    在日常编码中,会经常看到如下现象:

    1、对于基本类型参数,在方法体内对参数进行重新赋值,不会改变原有变量的值。

    2、对于引用类型参数,在方法体内对参数进行重新赋予引用,不会改变原有变量所持有的引用。

    3、方法体内对参数进行运算,不会改变原有变量的值。

    4、对于引用类型参数,方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。

    举个例子:

    public class Main {
    
        private static void getMiddleOne(boolean b, Boolean boo, Boolean[] arr){
    
            b = true;
    
            boo = new Boolean(true);
    
            arr[0] = true;
    
        }
    
           //测试
    
        public static void main(String[] args) {
    
            boolean b = false;
    
            Boolean boo = new Boolean(false);
    
            Boolean[] arr = new Boolean[]{false};
    
            getMiddleOne(b, boo, arr);
    
            System.out.println(b);
    
            System.out.println(boo.toString());
    
            System.out.println(arr[0]);
    
            /**
    
            * output:
    
            * false
    
            * false
    
            * true
    
            */
    
        }
    
    }

    我们只要了解了下面两点就可以解答上面的现象了:

    1、基本数据类型的值就是数值本身,所以示例中的b的值就是false;包装类因为会自动装箱拆箱,所以可以和基本类型一样处理,所以示例中boo的值就是false;数组是引用类型,所以arr的值就是指向该Boolean[]的引用。

    2、java中只有值传递没有引用传递,所以传入getMiddleOne方法的三个参数分别是b的值拷贝, boo的值拷贝, arr的值拷贝。

    通过上面两点就可以清楚了,getMiddleOne方法中执行的 b=true 和 boo = new Boolean(true) 都是把新值赋给了他们的拷贝,所以不改变原变量的值;同样,arr[0] = true 是把true复制给了arr的拷贝所指向的数组的第一个元素,arr的值和arr的拷贝的值都是该数组的引用,所以arr的拷贝所指向的数组和arr所指向的数组是同一个,所以改变arr的拷贝的数组的元素会同样影响到原变量arr。

    总结

    java中只有值传递,基本类型传递的是值的副本,引用类型传递的是引用的副本。

     

    展开全文
  • jQuery前端参数传递方案

    万次阅读 2020-09-28 08:24:23
    前端参数传递方案 需求 在页面之间进行传值的时候,如果遇到参数长度非常大的时候,我们直接url传值会400错误, 参数太长。我们当然可以把参数经过post后台传递,但是请求产生的网络开销呢?下面介绍几种方式好...

    前端参数传递方案

    需求

     在页面之间进行传值的时候,如果遇到参数长度非常大的时候,我们直接url传值会400错误,
     参数太长。我们当然可以把参数经过post后台传递,但是请求产生的网络开销呢?下面介绍几种方式好不好
     
    

    cookie

    将需要传递的参数   
    
    参数传递起始页面:setCookie(key,value);
    参数接受页面:getCookie(key);
    
    代码如下:
    
    function setCookie(name,value)
    {
      var Days = 30; //此 cookie 将被保存 30 天
      var exp  = new Date();    //new Date("December 31, 9998");
      exp.setTime(exp.getTime() + Days*24*60*60*1000);
      document.cookie = name + "="+ escape(value) +";expires="+ exp.toGMTString();
    }
    function getCookie(name)
    {
      var arr = document.cookie.match(new RegExp("(^| )"+name+"=([^;]*)(;|$)"));
      if(arr != null) return unescape(arr[2]); return null;
    }
    
    
    但是这样做的问题就是,用户假如禁用了cookie,那么这些方法将无效
    
    

    LocalStorage

    1、localStorage拓展了cookie的4K限制2、localStorage会可以将第一次请求的数据直接存储到本地,这个相当于一个5M大小的针对于前端页面的数据库,相比于cookie可以节约带宽,但是这个却是只有在高版本的浏览器中才支持的localStorage的局限1、浏览器的大小不统一,并且在IE8以上的IE版本才支持localStorage这个属性
    2、目前所有的浏览器中都会把localStorage的值类型限定为string类型,这个在对我们日常比较常见的JSON对象类型需要一些转换
    3、localStorage在浏览器的隐私模式下面是不可读取的
    4、localStorage本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡
    5、localStorage不能被爬虫抓取到localStorage与sessionStorage的唯一一点区别就是localStorage属于永久性存储,而sessionStorage属于当会话结束的时候,sessionStorage中的键值对会被清空
    
    语法:
    获取键值:localStorage.getItem(“key”)
    设置键值:localStorage.setItem(“key”,”value”)
    清除键值:localStorage.removeItem(“key”)
    清除所有键值:localStorage.clear()
    获取键值2:localStorage.keyName
    设置键值2:localStorage.keyName = “value”
    
    

    js生成唯一的key

    function generateUUID() {
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = (d + Math.random()*16)%16 | 0; d = Math.floor(d/16); return (c=='x' ? r : (r&0x3|0x8)).toString(16); });
    return uuid;
    }; //碰撞率:1/2^^122
    
    
    function generateUUID() {
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
        return v.toString(16);
      });
    }
    
    
    function generateUUID() {
      function S4() {
        return (((1+Math.random())*0x10000)|0).toString(16).substring(1);
      }
      return (S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4());
    }
    
    
    function generateUUID(len, radix) {
      var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');
      var uuid = [], i;
      radix = radix || chars.length;
     
      if (len) {
       // Compact form
       for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix];
      } else {
       // rfc4122, version 4 form
       var r;
     
       // rfc4122 requires these characters
       uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-';
       uuid[14] = '4';
     
       // Fill in random data. At i==19 set the high bits of clock sequence as
       // per rfc4122, sec. 4.1.5
       for (i = 0; i < 36; i++) {
        if (!uuid[i]) {
         r = 0 | Math.random()*16;
         uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r];
        }
       }
      }
     
      return uuid.join('');
    }
    
    
    
    function generateUUID() {
      var s = [];
      var hexDigits = "0123456789abcdef";
      for (var i = 0; i < 36; i++) {
        s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
      }
      s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
      s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
      s[8] = s[13] = s[18] = s[23] = "-";
     
      var uuid = s.join("");
      return uuid;
    }
    
    
    展开全文
  • websocket之参数传递和依赖注入

    万次阅读 2017-03-14 10:39:00
    我在通过websocket实现这个功能的过程中遇到了2个问题:websocket建立连接时需要传递参数(例如服务器ip,项目名称,日志文件位置等)进去;需要注入service 层的类,以便在onOpen()方法中进行数据查询和业务处理...

    背景

     

          WebSocket协议是一种基于TCP的新协议。不同于http仅能实现单向通信,它实现了浏览器与服务器的全双工通信,因此可以被应用在bs架构的聊天系统、远程日志查看等系统中。websocket在建立连线时仅需要进行一次“握手”就能建立“长连接”,也就是浏览器发出websocket连线请求,然后服务器发出回应即可。目前chrome、firefox和IE10+等主流浏览器都支持Websocket. 

     问题

             由于项目需要,最近在做一个如下的自主上线系统。为了便于尽早发现上线过程中的问题,该系统中有一个在web页面上实时显示服务日志的功能,我在通过websocket实现这个功能的过程中遇到了2个问题:websocket建立连接时需要传递参数(例如服务器ip,项目名称,日志文件位置等)进去;需要注入service 层的类,以便在onOpen()方法中进行数据查询和业务处理。百度谷歌一顿搜索后,发现这两个问题还挺有共性的,很多人都在问,但是靠谱的答案却比较少见。通过查看源码和各种折腾,最后还是解决了这些问题,做个总结。
     
          
     

    解决方案

    先上解决方案:
            @ServerEndpoint("/websocket/{moduleName}/{serverIp}")
    	public class LogSocket {
    	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
    	private Session session;
    	private Process process;
    	private InputStream inputStream;
    	private static Logger logger = Logger.getLogger(LogSocket.class);
    	private final int DEFAULT_SSH_PORT = 22;
    	//websocket中不能使用注解进行依赖注入
    	//Resource
    	//private OnlineService onlineService;
    	private OnlineService onlineService = (OnlineService) ContextLoader.getCurrentWebApplicationContext().getBean("onlineService");
    
    	/**
    	 * 连接建立成功调用的方法
    	 * 
    	 * @param session
    	 *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
    	 */
    	@OnOpen
    	public void onOpen(@PathParam("moduleName") String moduleName,
    			@PathParam("serverIp") String serverIp, Session session) {
    		this.session = session;
    		webSocketSet.add(this); // 加入set中
    		logger.info("日志开始");
    		logger.info("websocket:" + moduleName);
    		System.out.println("websocket:" + moduleName);
    
    		String command = "tail -100f " + onlineService.getLogpathByModuleName(
    				moduleName.trim(), serverIp.trim());  @ServerEndpoint("/websocket/{moduleName}/{serverIp}")
    	public class LogSocket {
    	// 与某个客户端的连接会话,需要通过它来给客户端发送数据
    	private Session session;
    	private Process process;
    	private InputStream inputStream;
    	private static Logger logger = Logger.getLogger(LogSocket.class);
    	private final int DEFAULT_SSH_PORT = 22;
    	//websocket中不能使用注解进行依赖注入
    	//Resource
    	//private OnlineService onlineService;
    	private OnlineService onlineService = (OnlineService) ContextLoader.getCurrentWebApplicationContext().getBean("onlineService");
    
    	/**
    	 * 连接建立成功调用的方法
    	 * 
    	 * @param session
    	 *            可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
    	 */
    	@OnOpen
    	public void onOpen(@PathParam("moduleName") String moduleName,
    			@PathParam("serverIp") String serverIp, Session session) {
    		this.session = session;
    		webSocketSet.add(this); // 加入set中
    		logger.info("日志开始");
    		logger.info("websocket:" + moduleName);
    		System.out.println("websocket:" + moduleName);
    
    		String command = "tail -100f " + onlineService.getLogpathByModuleName(
    				moduleName.trim(), serverIp.trim());

     

    参数传递

    其实这个问题不难,主要是websocket的应用比较少,自己平时也少有看源码的习惯。先来看看websocket的OnOpen注解的源码,突破点已用粗体标出了。

     

    package javax.websocket;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    /**
     * This method level annotation can be used to decorate a Java method that wishes to be called when a new
     * web socket session is open.
     *
     * <p>The method may only take the following parameters:-
     * <ul>
     * <li>optional {@link Session} parameter</li>
     * <li>optional {@link EndpointConfig} parameter</li>
     * <li>Zero to n String parameters annotated with the {@link javax.websocket.server.PathParam} annotation.</li>
     * </ul>
     *
     * <p>The parameters may appear in any order.
     *
     * @author dannycoward
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface OnOpen {
    
    }Zero to n String parameters annotated with the {@link javax.websocket.server.PathParam} annotation.</li>
     * </ul>
     *
     * <p>The parameters may appear in any order.
     *
     * @author dannycoward
     */
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface OnOpen {
    
    }

     

     

    使用@ServerEndpoint注解将参数拼接在建立连接的url上(@ServerEndpoint("/websocket/{moduleName}/{serverIp}")),使用@PathParam 注解进行参数获取( onOpen(@PathParam("moduleName") String moduleName,@PathParam("serverIp") String serverIp, Session session))。
     

     

    依赖注入

    起初是通过注解的方式注入的依赖,运行时报空指针,没有注入进去。一番折腾之后,发现虽然使用注解无法注入,但是使用显示的方式加载bean(ContextLoader.getCurrentWebApplicationContext().getBean)还是可以的。显示加载时,同时需要在spring的配置文件中显示地配置ben: <bean id="onlineService" class="com.wangyin.ebl.service.impl.OnlineServiceImpl"></bean>  。问题总算是解决了,但是还是没搞明白原因,等过段时间有空了再慢慢思考吧。

     

     

     

    展开全文
  • Golang学习笔记 22.函数作为参数传递

    万次阅读 2020-09-28 09:29:47
    函数作为参数传递 目录 高阶函数 函数作为参数 type定义函数类型 总结 视频地址:https://www.bilibili.com/video/BV14a4y177XG?p=23 高阶函数 啥是高阶函数(Higher-order function)?如果一个函数接收另一个...

    函数作为参数传递

    目录

    视频地址https://www.bilibili.com/video/BV14a4y177XG?p=23

    高阶函数

    啥是高阶函数(Higher-order function)?如果一个函数接收另一个函数作为参数,这种函数就称之为高阶函数

    在Go语言中,函数是一等公民,当然是可以将函数作为参数传递的。

    啥又是一等公民(first class)? 在编程语言中,支持以下操作的都为其语言的一等公民:

    1. 支持作为函数参数传递
    2. 支持作为函数返回值
    3. 支持赋值给变量

    下面先讲第一点,第两、三点,下次再讲~

    函数作为参数

    在开始讲函数作为参数传递前,不妨先看看函数的类型长啥样:

    import "fmt"
    
    // 下面定义了三个迥异的函数
    func test1(i int) int{return i}
    func test2(a int, b float64) (int, float64){return a, b}
    func test3(a, b int)(ra, rb int){return a, b}
    
    fmt.Printf("test1类型: %T\n", test1) // test1类型: func(int) int
    fmt.Printf("test2类型: %T\n", test2) // test2类型: func(int, float64) (int, float64)
    fmt.Printf("test3类型: %T\n", test3) // test3类型: func(int, int) (int, int)

    根据上面的输出,可以看出,函数的类型有两个组成部份:

    1. 函数的参数
    2. 函数的返回值

    函数的类型与函数参数名并无关系

    知道了函数的类型长啥样后,我们就可以实现一个高阶函数:

    func multiply2(i int) int{return i*2}
    func multiply3(i int) int{return i*3}
    /* 
    apply是一个高阶函数
    它接受一个数组和一个函数,并将函数作用于数组的每一个元素上
    */
    func apply(arr [3]int, f func(int)int) [3]int{
        for index := range arr{
            arr[index] = f(arr[index])
        }
        return arr
    }
    arr := [3]int{1, 2, 3}
    fmt.Println(apply(arr, multiply2)) // [2 4 6]
    fmt.Println(apply(arr, multiply3)) // [3 6 9]

    type定义函数类型

    在上面,apply函数的定义太太太长了...有没有什么办法进行简化?

    有,利用关键词type就行:

    // 定义一个新类型,名fnc
    type fnc func(int)int
    // 给[3]int起一个别名,叫ai3
    type ai3 = [3]int
    
    // 所以可以简化成这样
    func apply(arr ai3, f fnc) ai3{...} // 函数体还是跟上面一样, 所以省略...

    总结

    1. 函数是Go语言的一等公民
    2. 函数可以作为函数的参数进行传递
    3. 可以利用type关键词定义函数类型
    展开全文
  • Fragment详解之五——Fragment间参数传递

    万次阅读 多人点赞 2015-04-09 22:36:28
    前言:依然没有前言…… 相关文章: 1、《Fragment详解之一——概述》 2、《Fragment详解之二——基本...5、《Fragment详解之五——Fragment间参数传递》6、《Fragment详解之六——如何监听fragment中的回退...
  • C语言二维数组作为函数参数传递

    万次阅读 多人点赞 2018-06-07 21:43:37
    二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小,也可以省略以为大小的说明。例如: void find(char a[3][10]); void find (char a[ ][10]); 也可以使用数组...
  • shell中脚本参数传递的两种方式

    万次阅读 多人点赞 2018-02-09 11:37:22
    等方式获取脚本命令行传入的参数,值得注意的是,$0获取到的是脚本路径以及脚本名,后面按顺序获取参数,当参数超过10个时(包括10个),需要使用${10},${11}....才能获取到参数,但是一般很少会超过10个参数的情况。 ...
  • angularjs实现页面跳转并进行参数传递 Angular页面传参有多种办法,我在此列举4种最常见的: 1.基于ui-router的页面跳转传参 (1)在AngularJS的app.js中用ui-router定义路由,比如现在有两个页面,一个页面(producers...
  • 参数传递之指针传递

    万次阅读 2006-03-20 18:24:00
    (1)基础知识C课本上的一个程序:void swap(int *p1,int *p2){ int t=*p1; *p1=*p2;... ...}a,b的值交换了是因为a,b的地址被传递给了函数swap,使得p1=&a,p2=&b。为了看得更清楚些,更改一些:void swap
  • $('#requirementCaseTable').bootstrapTable({ cache: false, pageList: [10,15,20,30,50], pagination: true, sidePagination: 'server', //sidePag...
  • Quartz-JobDataMap 参数传递

    万次阅读 2017-11-12 22:07:49
    概述概述我们在Quartz-Job 详解中,讲解了纯Quartz的参数传递,这里我们将通过与Spring结合的方式再次讲解一下Quartz中的参数传递
  • Matlab的函数调用和参数传递

    万次阅读 2016-07-03 20:32:27
    [输出参数 1,输出参数 2,…] = 函数名字(输入参数 1,输入参数 2,输入参数 3,…)注意事项: 1. 函数调用的时候,参数顺序应该与定义的时候一样。 2. 函数可以嵌套 3. 函数可以自己调用自己,实现递归例如:...
  • SoapUI参数传递

    万次阅读 2016-12-03 16:12:13
    SoapUI参数传递--接口测试时经常需要首先获取一个sessionid或令牌,根据获取的sessionid或令牌才可进行其他接口的请求,并且sessionid或令牌是随机生成的,还有特定的有效时长,如果每次测试都需要手动重新去修改该...
  • JS参数传递(值传递和引用传递)

    万次阅读 多人点赞 2018-06-07 15:11:01
    书P66 一个加粗框中写到:ECMAScript中所有参数传递都是值,不可能通过引用传递参数当时看过没有怎么仔细想过,一知半解吧,今天理解的更加深一些。当然也是昨天做了个题目就因为这个掉坑里一时没爬出来!访问变量有...
  • 1.python中的位置传递:先用形式参数定义,然后在调用时对应位置使用实参(具体的数值)调用 def sum(a, b):  return a + b sum(5, 6)
  • 字符串赋值:strcpy_s(pstu->name, "张三"); 需要引入头文件:#include <string.h> #include <stdio.h> #include <string.h> struct Student { int age;...void InputStud...
  • 有点坑爹的是参数的格式组装的问题,看图 原生ajax请求服务器 &amp;amp;lt;script&amp;amp;gt; function success(weiXinConfig) { console.log(&amp;quot;这是微信getConfig回调函数&amp;quot...
  • 【C++ - 18】C++函数参数传递三种方式

    万次阅读 2014-05-28 10:04:52
    当进行函数调用的时候,要填入与函数形式参数个数相同的实际参数,在程序运行的过程中,实参会将参数值传递给形参,C++函数参数传递有以下三种方式。 一. 值传递 1. 利用值传递方式,实际上是把实参的内容复制到...
  • Android中Message参数传递

    万次阅读 2016-11-03 10:30:48
    public class MainActivity extends Activity { final static int CANSHU = 1; public Handler mHandler=new Handler(){ public void handleMessage(Message msg) { ...
  • 1.单参数传递 2.多参数传递 1 默认处理多参数传递传递 只传这四个参数,传其他的会报错找不到参数!!! 2 封装pojo类创建一个构造方法 一、 先为pojo类创建一个构造方法 二、 mapper接口中创建相应的方法,...
  • 转自:http://www.mianfeidianhua.net/threading.html 先来看这段代码: import threading import time def worker(): print “worker” time.sleep(1) return ... t = threading.Thr...
  • uniapp页面参数传递

    万次阅读 2019-05-23 10:59:50
    uniapp页面参数传递 admin2019-04-09【Uni-App】1299人已围观 简介uniapp传递参数,和获取参数。 首先 链接传递 或者事件传递 1、要传递参数的页面 <navigator:url="'./nav?index='+navData">...
  • Mybatis使用之参数传递

    千次阅读 2015-05-20 16:41:24
    摘要: 主要记录Mybatis是如何映射传递的参数的。分四种来记录:1、java基本类型的传递、2、Java对象形式传递 3、多参数传递4、集合类型参数传递
  • Mybatis介绍之参数传递

    万次阅读 2017-05-03 17:08:49
    Mybatis介绍之参数传递 9.1 使用Mapper接口时参数传递方式  Mybatis在使用Mapper接口进行编程时,其实底层是采用了动态代理机制,表面上是调用的Mapper接口,而实际上是通过动态代理调用的SqlSession的对应方法...
  • C# 多线程参数传递

    千次阅读 2015-05-23 15:42:10
    1、通过实体类来传递(可以传递多个参数与获取返回值),demo如下: 需要在线程中调用的函数: namespace ThreadParameterDemo { public class FunctionClass { public static string TestFunction(string name, ...
  • 本篇文章主要讲的是JavaScript中最正常不过的现象——函数参数传递,本篇文章篇幅不长,但一定能引发属于你自己的思考!
  • C#方法参数传递-输出参数out关键字

    千次阅读 2010-11-22 15:07:00
    out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化,out关键字不要求调用代码前对传递参数进行初始化,也可以实现引用传递。若要使用 out 参数...
  • 就是没有onclick,onchange的情况下,怎么把参数传给函数,用onload事件可以吗,我想根据id动态生成二维码[img=https://img-bbs.csdn.net/upload/202010/04/1601742987_111654.png][/img]
  • 那么在脚本内部相当于把 test.sh param1 param2 看成三个参数出入,所以参数0为$0 (test.sh),参数1为$1 (parm1),参数2为$2 (parm2),也就是把脚本自己的名称看成参数0,参数个数$#还是2,而不是3,这个要注意。

空空如也

1 2 3 4 5 ... 20
收藏数 144,213
精华内容 57,685
关键字:

参数传递