java中的参数传递 值传递,引用传递

参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递。

在 Java 应用程序中永远不会传递对象,而只传递对象引用。因此是按引用传递对象。Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数。参数可以是对象引用,而 Java 应用程序是按值传递对象引用的。

Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型。当作为参数传递给一个方法时,处理这两种类型的方式是相同的。两种类型都是按值传递的;没有一种按引用传递。

按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

1、对象是按引用传递的

2、Java 应用程序有且仅有的一种参数传递机制,即按值传递

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

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

首先考试大来看看第一点:对象是按引用传递的

  确实,这一点我想大家没有任何疑问,例如:

  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!!!

  这说明什么,原始数据类型是按值传递的,这个按值传递也是指的是进行赋值时的行为下一个问题:Java 应用程序有且仅有的一种参数传递机制,即按值传递

  class Test03{
  public static void main(String[] args){
  StringBuffer s= new StringBuffer(“good”);
  StringBuffer s2=new StringBuffer(“bad”);
  test(s,s2);
  System.out.println(s);//9
  System.out.println(s2);//10
  }
  
  static void test(StringBuffer s,StringBuffer s2) {
  System.out.println(s);//1
  System.out.println(s2);//2
  s2=s;//3
  s=new StringBuffer(“new”);//4
  System.out.println(s);//5
  System.out.println(s2);//6
  s.append(“hah”);//7
  s2.append(“hah”);//8
  }
  }

  程序的输出是:

  good
  bad
  new
  good
  goodhah
  bad

  考试大提示: 为什么输出是这样的?

  这里需要强调的是“参数传递机制”,它是与赋值语句时的传递机制的不同。

  我们看到1,2处的输出与我们的预计是完全匹配的

  3将s2指向s,4将s指向一个新的对象

  因此5的输出打印的是新创建的对象的内容,而6打印的原来的s的内容

  7和8两个地方修改对象内容,但是9和10的输出为什么是那样的呢?

  Java 应用程序有且仅有的一种参数传递机制,即按值传递。

在这里画了一个图给大家分析:

这里写图片描述

1.对象就是传引用

2.原始类型就是传值

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

参考:http://www.cnblogs.com/perfy/archive/2012/10/16/2726039.html

猜你喜欢

转载自blog.csdn.net/went_081/article/details/79375782
今日推荐