java传值还是传引用。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/caonima0001112/article/details/50588384

java传递分两种形式: 对象传递,参数传递。

总结:

  • 对象是按引用传递的
  • 参数传递,Java 应用程序有且仅有的一种参数传递机制,即按值传递
  • (但是我们参数传递过来的引用 类型的数据,在方法返回后,结果还是会改变,这是因为,在参数传递的时候,创建对象会在栈中保存在堆内存数据的地址,而在参数传递的时候,会把栈中的地址值,作为一个副本传递过去,这个副本保存的也是该对象的地址,所以对象会在方法内部改变,但是因为他和值传递一样都会生成一个副本,所以java参数传递也是值传递。而引用传递是直接传递地址值,不会生成一个副本)

按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。

按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本,其实地址也是一个值。

结合事例来看下,对象的引用传递:

class Test01
  {
  public static void main(String[] args)
  {
  StringBuffer s= new StringBuffer("good");
  StringBuffer s2=s;
  s2.append(" afternoon.");
  System.out.println(s);
  }
  }
  

对象s和s2指向的是内存中的同一个地址因此指向的也是同一个对象。

程序运行的输出是:
  good afternoon.
  这说明s2和s是同一个对象。
  这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)

基本类型传递例子

class Test02
  {
  public static void main(String[] args)
  {
  int i=5;
  int i2=i;
  i2=6;
  System.out.println(i);
  }
  }

程序的结果是什么?5!!!
  这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为。

参数按值传递应该不难理解,不做特别说明。http://guhanjie.iteye.com/blog/1683637

最后要注意:String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。


猜你喜欢

转载自blog.csdn.net/caonima0001112/article/details/50588384