




如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
【黑马程序员】Java中方法的参数传递问题 第一篇:【黑马程序员】Java中方法的参数传递问题【黑马程序员】Java中方法的参数传递问题最近有很多同学,就算是就业班毕业之后,还依然在问java方法的调用中值的传递问题,实际参数究竟什么时候才会改变?接下来我们先由一个例子来引出大家的问题,请看如下例子,并回答下面代码中的四个问题publicclassDemo{publicstaticvoidmain(String[]args){inta=10;change(a);System.out.println(a);//1:请问输出什么?Stringstr=“abc”;change(str);System.out.println(str);//2:请问输出什么?Students=newStudent(“张三”,13);System.out.println(s);//输出Student[name=张三,age=13]change(s);System.out.println(s);//3:请问输出什么?change1(s);System.out.println(s);//4:请问输出什么?}publicstaticvoidchange(Strings){s=s+“def”;}publicstaticvoidchange(inta){a=a+10;}publicstaticvoidchange(Students){s=newStudent(“李四”,14);}publicstaticvoidchange1(Students){s.setName(“李四”);s.setAge(14);}}大家看完上面的题目之后,估计有很多同学能回答出前两问,1:输出10,2:输出abc,因为这类的参数传递在咱们java基础课程的第5天和第13天都有讲到。但是虽然讲了,但黑马程序员济南中心编著是有很多同学都没有充分的理解透彻,这也就是为什么大家回答不出第三问和第四问的原因。实际上第三问的答案是3:输出Student[name=张三,age=13]4:Student[name=李四,age=14]。下面我就给大家讲解一下。首先用一句话来归纳java中参数传递:不管是基本类型还是引用类型:形式参数做赋值操作的时候,实际参数不发生改变,如果在方法里面是改变形式参数内部的一些东西的时候那么实际参数发生改变。1.不管是基本类型还是引用类型:形式参数做赋值操作的时候,实际参数不发生改变(当被调用的方法开始执行的时候,就从方法区里面把方法拿到了栈内存中,形式参数变量也根据传递过去的值进行初始化,当方法用完了,那么该方法在栈内存中的变量也消失了。在所以也就是只在栈内存中对方法里面变量进行了改变,是不影响实际参数的。而加减乘除、赋值[就算是引用类型之间的赋值,是不是也只是在栈内存中把地址值进行的赋值]这一系列的赋值操作都是在栈内存中对方法里面变量进行了改变,而方法执行完毕后从栈内存中消失了,回到了调用这个方法的main方法栈内存中,实际参数原来是什么现在依然是什么)2.如果在方法里面是改变形式参数内部的一些东西的时候那么实际参数发生改变(对于引用类型,它随着参数传递到方法里面去的是地址值,指向的是堆中的对象,如果在方法里面通过这个地址值改变对象内部的一些属性,即使方法用完了,方法里面的变量的地址值的黑马程序员济南中心编著指向也消失了,但是对象内部的一些属性还是已经改变了,这些属性不会消失[因为在堆内存中],所以实际参数还是会改变。如果是基本类型,根本在堆内存中没有指向,基本类型都在栈内存或者常量池[值更不能被改变]中,所以基本类型形式参数的改变无论如何是改变不了实际参数的)3.看完上面的两句话和解释,相信大家还是觉得比较抽象,下面我给大家准备了一个代码案例,每一行代码都有对应的解释,看完下面的案例后估计大家就会真正的明白java中参数传递,参数改变时机的问题了publicclassDemo2{publicstaticvoidmain(String[]args){inta=10;intb=20;System.out.println(a+“”+b);//1020change1(a,b);//形式参数做赋值操作的时候,实际参数不发生改变//基本类型一般都在栈内存中(所以堆内存中没有指向内部也就没有东西嘛),//所以值能做一些加减乘除、赋值的操作,//而做完了这些操作,就在占内存中消失了,所以不会影响实际参数System.out.println(a+“”+b);//1020System.out.println(“-------------------”);Students=newStudent();System.out.println(s);//Student[name=null,age

Ro****44
实名认证
内容提供者


最近下载