前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中的参数传递-值传递、引用传递

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

作者头像
chenchenchen
发布2022-11-29 21:03:37
4.6K0
发布2022-11-29 21:03:37
举报
文章被收录于专栏:chenchenchenchenchenchen
代码语言: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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-05-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档