java中的参数传递-值传递、引用传递

2022-11-29 21:03:37 浏览数 (1)

代码语言:javascript复制
public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str   " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

代码语言:javascript复制
输出
代码语言:javascript复制
good and gbc

参数是按值而不是按引用传递的说明 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对象,所以要特殊对待。可以认为是传值。

参考:https://blog.csdn.net/yqlakers/article/details/70144766 http://www.cnblogs.com/perfy/archive/2012/10/16/2726039.html

0 人点赞