相信有些同窗跟我同样,曾经对这个问题很疑惑。在网上也看了一些别人说的观点,评论不一。有说有值传递和引用传递两种,也有说只有值传递的,这里只说下我的看法html
先看一个例子ide
public class Test1 { public static void main(String[] args) { int a = 10; changeNum(a); System.out.println("main a=" + a); } static void changeNum(int a) { a = 100; System.out.println("changeNum a=" + a); } }
结果:函数
changeNum a=100
main a=10this
说明对于基本的数值类型其实传递的是一份数值的拷贝,传入函数以后跟原来的值就没有关系了,在函数中改变这个数的值也不会影响到原来的值。spa
再看一个例子3d
public class P { String name = "P"; public P(String name) { this.name = name; } @Override public String toString() { return name; } } public class Test { static P p1 = new P("p1"); public static void main(String[] args) { P p = new P("P");
System.out.println("before change p:" + p.toString); changeObj(p); System.out.println("after change p:" + p.toString()); } static void changeObj(P p) { p = new P("pp"); System.out.println("change p:" + p.toString()); //p = p1; //System.out.println(p.toString()); } }
这个例子中的运行结果会是什么呢?code
在这个例子中传入的是一个对象类型的数据。htm
咱们先来猜测一下:若是传入的是一个对象的引用,在函数中改变了这个引用所指向的对象,那么外部的引用"p"应该是指向了新建立的P("pp")的对象才对对象
因此猜测的结果是:blog
before change p:P
change p:pp
after change p:pp
那让咱们来实际运行一下看看结果,实际的结果是:
before change p:P
change p:pp
after change p:P
想猜测的不同!!!
这就让咱们很疑惑了,为何函数没有改变引用所指向对象呢?
实际上是这样的,首先要理解“=”赋值操做的意义,
对于基本类型来讲“=”赋值操做是直接改变内存地址上的值,
而对引用类型来讲“=”赋值实际上是改变引用变量所指向的内存地址。
赋值操做后
引用的赋值并无对原来的对象形成影响,"hello"对象仍然是存在的,只是str又指向了新的"world"对象
理解了赋值操做后,如今来讲下函数的参数传递
函数的参数实际上就是函数内部的一个局部变量,从外部传值给这个参数实际上就是一个赋值的过程。
来看看第一个例子,传一个定义一个int类型名称为a的形式参数,其实彻底能够把名称改成b
而后把外部变量a的值传递给函数的变量,就是赋值。基本类型的赋值就是把外部a变量的10赋值给函数变量a,因此这实际上是两个变量,二者之间没有任何关系,
因此对函数内部变量的改变也不会对外部的变量形成影响。
再来讲下引用类型的传递,实际上是一个道理。
在传递的时候是把一个对象的内存地址赋值给函数内部的引用类型的局部变量
如上图所示,两个变量是指向同一个对象的。
在第二个例子中,咱们在函数内部新建立了一个对象,并从新赋值给内部变量p,实际上是改变了内部变量的引用所指向的对象,以下图所示
因此对外部的p变量是没有影响的。
总结:
函数参数传递实际上是一个赋值的过程,基本类型传递的是数值,引用类型传递的引用对象的内存地址。
另一点要特别注意,函数的参数实际上是函数内部的局部变量。不要跟外部变量混淆
以上内容均为原创,转载请注明出外 http://www.cnblogs.com/taixuyingcai/p/6373423.html