标题:
张龙老师面试之java 方法传参 个人小结
[打印本页]
作者:
qingqing3721
时间:
2011-9-8 04:32
标题:
张龙老师面试之java 方法传参 个人小结
一:1 :如果参数是基本数据类型(四类八种:byte,short,int,long,double,float,double,boolean,char),那么传的是变量的值,例如: int a= 10; 那么传过来的就是10! 例子:package qqwwffg.pass_method_paramater;
public class PrimitiveType {public void change(int a) {a = 3;}public static void main(String[] args) {int a = 1
rimitiveType test = new PrimitiveType();test.change(a);System.out.println(a); // 1 ,而不是3}}
change 方法在被调用的时分,在内存中也分配一个空间来存储,存的是传过来的值,即3 .而当方法完毕时,这块内存就等渣滓回收了,而在main 方法中,它打印的a 的值是在调用main方法时分配的内存空间,他们俩之间没有任何关系,所以打印的还是1.
2 : 如果参数是引用数据类型(类,数组,接口),那么传的是也是变量的值,例如: Point param = new Point(); 那么传过来的是point 这个变量的值 ,而不是说Point 这个对象!而point 这个变量的值,其实就是Point 对象在内存中的地址(也叫引用)!例子:
public class ReferenceType {
public void changePoint(Point point) {point.x = 5;point.y = 6;}public void changeReference(Point point) {point = null;}
public void testPassByStirng(String param) {param = "newValue";}
public static void main(String[] args) {int a = 1
oint point = new Point(1, 2);ReferenceType test = new ReferenceType();test.changePoint(point);System.out.println(point.x); // 5 而不是 1System.out.println(point.y); // 6 而不是 2test.changeReference(point); // 调用这个后,下面能否会报空指针呢?int x = point.x; // 不会System.out.println("x 的值是 " + x );
String param = "value";test.testPassByStirng(param);System.out.println(param); // 是value ,而不是 newValue}}
class Point {int x;
int y;
public Point(int x, int y) {this.x = x;this.y = y;}}在java 中,拜访对象是通过指向对象的引用来操作的,而一个对象可以被多个引用所指向,无论其中哪个引用对这个对象的内容进行修改,它都会影响到另外一个引用,虽然引用有多个,但对象却只要一个!changePoint 方法被调用时,你把main 方法中的Point 对象的引用point 传给了changePoint的参数point,此时,这个point 引用也指向了main 方法中的Point 对象(new 出来的),而你在这个方法中,用point 这个引用对Point 对象(new 出来的)的内容进行了修改(point.x = 5;point.y = 6;),由于它们指向的是同一个Point 对象(new 出来的),所以,当方法执行完后,这个修改会反映到这个对象上,
1
而此时,你再打印出Point 对象的x,y 的值,都是被改动后的值! 即不再是1和2,而是5与6 .
小结:在java 中,方法参数的传递永远都是传值,而这个值,对于基本数据类型,值 就是你赋给变量的那个值,而对于引用数据类型,这个值是对象的引用,而不是这个对象自身.
二: 在java 中,通过方法的调用,只能改动对象的内容,而不能改动对象的引用.如 下面的方法public void changeReference(Point point) {point = null;}point = null ,这句话是把你在调用changeReference方法时,本来point 这个引用与你在main 方法中的那个point 引用指向的是同一个对象,而当你调用point = null 时,它就不再指向原来的Point 对象了,此时,它只是改动它自身的指向,并没有对main 方法中的point 引用进行修改,main 中的point 引用还是指向main 中的Point 对象!所以,你在main 方法中调用 point.x; 是不会发作空指针异常的.
也就是说:在方法中,你把引用 所对应的对象的内容给改动了,它是会反响到对象上的,这时,你再取对象的内容时,已经是你改动过了的!而无论你把传过来的引用如何改(point = null),该引用永远指向它原来 的那个对象!
在这里说一点的就是:张教师在视频中说到当String 做为参数传递的时分,是由于String对象自身是不变对象所决定的! 下面的testPassByStirng 方法.而我自己的想法是:String 类型,它是不变对象,但它契合二:当它作参数传过来时,如果对引用操作如: paramString = "改动原来的值";这个所做的是: "改动原来的值" 其实就是String类的一个匿名对象,所以,你这样是在方法中,重新结构一个String 对象出来,然后这个对象的引用赋给paramString ,此时,把paramString 这个引用 给改动了,但传过来的引用并没有被改动!
在这里说一句:这些内容有的是在看视频时,摘张教师的话,有的是自己看别的书,整理做下的笔记,方便自己学习,难免有些缺乏之处,自身了解错误的内容,请各位老鸟们拍砖(别把我拍死了,就行),指点!
欢迎光临 编程开发论坛 (http://bbs.lihuasoft.net/)
Powered by Discuz! 6.0.0