Java中方法参数的总结

方法参数方法得到的都是所有参数值的拷贝,方法不能修改传递给它的任何参数变量的内容。参数共有两种类型: 基本数据类型对象引用除了基本数据类型的都是对象引用,包括数组等等。 很容易得知,一个方法不可能改变一个基本数据类型的参数,下面讨论参数的对象的情况。下面这个方法可以将一个雇员的薪金提高两倍 public static void tripleSalary(Employee x){ x.raiseSalary(200);}当调用 harry = new Employee(...);tripleSalary(harry);时,执行过程如下: x被初始化为harry值的拷贝,x是对象的引用。x和harry同时指向相同的对象。raiseSalary方法应用于这个对象引用。x和harry同时引用的那个Employee对象的薪金提高了200%。方法结束之后,x不再使用。harry继续引用那个增长了薪金的对象Java中都是值传递,而不是引用传递下面这个方法用来交换两个雇员对象(其实做不到): public static void swap(Employee x, Emploee y)//doesn't work{ Employee temp = x; x = y; y = temp;}如果Java对对象采用的是按引用(地址)调用那么这个方法可以实现两个对象交换数据的效果。 Employee a = new Employee("Alice",...);Employee b = new Employee("Bob",...);swap(a,b);但是执行完该方法后,a和b所引用的对象并没有改变。x和y在方法执行过程中所引用的对象改变了,但是a和b引用的对象并没有改变,因为x和y只是“复制品”。这个过程说明,对象引用也是按值传递的。

July 5, 2019 · 1 min · jiezi

编程语言Python-的参数传递返回值浅拷贝深拷贝

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~ 1. Python 的参数传递Python的参数传递,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。 def fun1(n): print(n) # n在没修改前,指向的地址和main函数中n指向的地址相同 n = 20 # n在修改后,指向的地址发生改变,相当于新建了一个值为20的参数ndef fun2(l): print(l) # l在没修改前,指向的地址和main函数中l指向的地址相同 l = [5,6,7,8,9] # l在修改后,指向的地址和main函数中l指向的地址仍相同,此时main函数中l的值也会改变if __name__=="__main__": n = 10 l = [1,2,3,4,5] fun1(n) fun2(l) print(n) # n的值还是10 print(l) # l的值在fun2()中已经被改变2. Python 的返回值Python的返回值,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。 str1 = 'hi'l1 = [1,2,3,4,5]def fun1(): return str1def fun2(): return l1str2 = fun1() # 此时,str1 和 str2 的指向地址是相同的str2 = 'hello' # 修改后,str2 指向的地址发生改变,相当于新建了一个值为`hello`的变量l2 = fun2() # 此时,l1 和 l2 的指向地址是相同的l2 = [6,7,8,9] # 修改后,l2 指向的地址仍相同,修改 l2 会影响到 l13. Python 的浅拷贝和深拷贝对于不可变对象(数字、字符、元组等),直接赋值的结果和深拷贝一致;对于可变对象(列表、字典等),直接赋值、浅拷贝、深拷贝结果不同。 ...

June 23, 2019 · 1 min · jiezi

每日一面——仿写reverse方法

引言今天小K问了我一个面试题,怎么实现一个实reverse方法,在实现的过程中我还是犯了一些错,实现完以后,对一些知识点的理解又加深了。错误的写法最开始我是这么写的var arr = [1,2,3,4,5] var reverse1 = function (arr) { let newArr = [] while (arr.length>0){ newArr.push(arr.pop()) } console.log(arr,newArr) // [],[5,4,3,2,1] arr = newArr //让arr等于反转后的新数组 console.log(arr) // [5,4,3,2,1] return arr } reverse1(arr)结果有点打脸console.log(arr) // []函数参数的传递方式上面的现象显示:我将arr当参数传入reverse1里面,我可以改变arr里面的内容但是我却无法改变arr(arr由[1,2,3,4,5]pop()五次变成[ ],但是随后的赋值操作却没有成功)为什么会出现这个问题,我们得从函数的参数传递方式说起函数的参数都是值传递怎么理解这句话,按照高程的说法,如果这里是引用传递,那么我在代码第8行已经让arr变成了[5,4,3,2,1],那么外面的arr也应该变,但是现在外面arr却是[ ],所以函数的参数的传递方法都是值传递如果你觉得这么说还是比较抽象,你可以听听鄙人陋见,我们完全可以把js里面数组名当成一个指针变量,储存的是实际的数组对象的地址。指针意味着我们通过它可以访问它指向的对象。变量意味者我可以改变这个变量。在函数参数里面当我们传入一个arr的时候,实际传递的是一个形参address1,储存arr这个对象在内存里的地址,address1=xxxx xxxxx xxxx xxx1。通过address1可以对arr进行任何操作,一旦现在我为address1赋上新的地址值,也就是address1=xxxx xxxxx xxxx xxx2。address1就和arr失去了联系。此时arr还是在xxxx xxxxx xxxx xxx1上,并且至少在当前的reverse1方法中不会再被改变了,因为没有哪个指针能指向它了。正确的写法ok说了这么多,实际想说的是,你在方法中可以通过索引,通过原生方法操作一个当参数传进来的数组,但是绝对不允许对数组名直接进行赋值那么这个题目我们就可以尝试使用原生方法来操作传进来的数组,这里提供一种思路var arr = [1,2,3,4,5]var reverse1 = function () { for(var i = 0; i < arr.length; i ++){ arr.splice(i,0,arr.pop()) } }reverse1(arr)console.log(arr) // [5,4,3,2,1]但是我们可以看到上面的方法还是不是很好,这是因为这个reverse1貌似只能对arr进行操作,耦合性太强,我们需要解耦,让reverse1对所有的数组都适用,这里适用this和原型方面的知识//一个完美的写法:Array.prototype.reverse1 = function () { for(var i = 0; i < this.length; i ++){ //this 解耦 this.splice(i,0,this.pop()) } return this }总结今天介绍了一下reverse的实现思路,this解耦,以及函数参数是值传递这么一个概念,建议在方法中通过索引,通过原生方法改变一个当参数传进来的数组,但是绝对不允许对数组名直接进行赋值希望对大家有所帮助。 ...

April 19, 2019 · 1 min · jiezi

SpingMvc复杂参数传收总结

上一篇文章[javaWeb传收参数方式总结]总结了简单传收参数,这一篇讲如何传收复杂参数,比如Long[] 、User(bean里面包含List)、User[]、List<User><user style=“margin: 0px; padding: 0px; max-width: 100%; overflow-wrap: break-word !important; box-sizing: border-box;">、List<Map<String,Object>等几种复杂参数</user>。一.简单数组集合类比如Long[],String[],List<User><long style=“margin: 0px; padding: 0px; max-width: 100%; overflow-wrap: break-word !important; box-sizing: border-box;">等</long>前端:1.重复单个参数//(1)普通http://localhost:8080/ajaxGet?id=1&id=2&id=3//(2)Ajaxget方式 发送请求时等于(1)方式 $.ajax({ type: “GET”, url: “http://localhost:8080/ajaxGet?id=1&id=2&id=3” });//(3)Form表单GET方式 发送请求时等于(1)方式<form id=“fromGet” action=“fromGet” method=“GET”> <input type=“text"name=“id” value=“1”> <input type=“text"name=“id” value=“2”> <input type=“text"name=“id” value=“3”></form>//(4)Form表单POST方式 //发送请求参数会被拼接成 id=1&id=2&id=3 存储在请求体中<form id=“fromGet” action=“fromGet” method=“POST”> <input type=“text"name=“id” value=“1”> <input type=“text"name=“id” value=“2”> <input type=“text"name=“id” value=“3”></form>后端SpringMvc://数组public void ajaxGet(Long[] id){}//List集合public void ajaxGet(@RequestParam(“id”) List<Long> id){}2.数组参数前端://(1)普通urlhttp://localhost:8080/ajaxGet?id[]=1&id[]=2&id[]=3//2.Form GET方式(Ajax异步表单提交) 发送请求时等于(1)方式$.ajax({ type: “GET”, url: “http://localhost:8080/ajaxGet”, data: {“id”:[1,2,3]}, contentType:‘application/x-www-form-urlencoded’ });//(3)Form POST方式(Ajax异步表单提交)//发送请求参数会被拼接成 id[]=1&id[]=2&id[]=3 存储在请求体中$.ajax({ type: “POST”, url: “http://localhost:8080/ajaxPost”, data: {“id”:[1,2,3]}, contentType:‘application/x-www-form-urlencoded’ });后端SpringMvc://数组public void ajaxGet(@RequestParam(“id[]”) Long[] id){}//List集合public void ajaxGet(@RequestParam(“id[]”) List<Long> id){}其实以上两种都是一个道理,主要是看发送请求时 参数是id还是id,来决定后端使不使用@RequestParam(“id[]")进行数据绑定二.复杂实体类与集合比如User(bean里面包含List)、User[]、List<User><user style=“margin: 0px; padding: 0px; max-width: 100%; overflow-wrap: break-word !important; box-sizing: border-box;">、List<Map<String,Object>等,此种类型均使用Json提交</user>1.复杂实体类UserUser实体类//User实体类public class User { private String name; private String pwd; private List<User> customers;//属于用户的客户群 //省略getter/setter } 前端://用户var user = {};user.name = “李刚”;user.pwd = “888”;//客户var customerArray = new Array();customerArray.push({name: “李四”,pwd: “123”});customerArray.push({name: “张三”,pwd: “332”});user. customers = customerArray; $.ajax({ type: “POST”, url: “http://localhost:8080/ajaxPost”, data: JSON.stringify(user), contentType:‘application/json;charset=utf-8’ });后端SpringMvc: public void ajaxPost(@ResponBody User user){ }前端://用户var userList = new Array(); userList.push({name: “李四”,pwd: “123”}); userList.push({name: “张三”,pwd: “332”}); $.ajax({ type: “POST”, url: “http://localhost:8080/ajaxPost”, data: JSON.stringify(userList), contentType:‘application/json;charset=utf-8’ });后端SpringMvc: public void ajaxPost(@ResponBody User[] user){ } public void ajaxPost(@ResponBody List<User> user){ } public void ajaxPost(@ResponBody List<Map<String,Object>> userMap){ } THANDKSEnd -一个立志成大腿而每天努力奋斗的年轻人伴学习伴成长,成长之路你并不孤单! ...

January 9, 2019 · 1 min · jiezi