美文网首页JavaJava基础基础知识
(二)值传递与引用传递

(二)值传递与引用传递

作者: 黄金矿工00七 | 来源:发表于2018-07-18 22:53 被阅读42次

首先,我们要明确一点,Java中只有值传递,至于原因,下面说。

错误理解:

  • 参数是值,就是值传递;参数是引用,就是引用传递。
  • 参数是基本类型,就是值传递;参数是对象类型(引用类型),就是引用传递。

在说值传递和引用传递之前,我们来说一下形参和实参:

  • 形参:定义函数时所使用的参数,用来接收调用函数时传入的参数
  • 实参:调用参数时实际传入的参数


    图片.png
public class Test {

  public static void main(String[] args) {
    //123是实参
    print("123");
  }
  //str是形参
  public static void print(String str) {
    System.out.println(str);
  }
}

接下来,来看一下什么是值传递和引用传递,

  • 值传递:值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
  • 引用传递:引用传递(pass by reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
    好了,上代码:
public class Test {

  public static void main(String[] args) {
    int i=0;
    print(i);
    System.out.println(i);
  }

  public static void print(int  i) {
    i++;
  }
}

图片.png
i的值没有改变,说明是值传递
再来看一下引用类型的参数:
public class Test {

  public static void main(String[] args) {
    A a = new A();
    a.setName("a");
    print(a);
    System.out.println(a.name);
  }

  public static void print(A a) {
    a.setName("b");
  }
}

class A {

  String name;

  void setName(String name) {
    this.name = name;
  }
}

图片.png

这是为啥呢?参数怎么变了,好,我们再看一个程序:

/*
 * Copyright (c) 2018 lyc All Rights Reserved.
 *
 *
 *
 *
 *
 *
 */

/**
 * description .
 *
 * @author liyaocai
 * @version V1.0
 * @date 2018/7/18 12:56
 * @since 1.8
 */

public class Test {

  public static void main(String[] args) {
    A a = new A();
    a.setName("a");
    print(a);
    System.out.println(a.name);
  }

  public static void print(A par) {
    par = new A();
    par.setName("b");
  }
}

class A {

  String name;

  void setName(String name) {
    this.name = name;
  }
}

图片.png
这里为啥又没变化呢?我们来看一张图
图片.png
我们创建了一个对象a,这时候在堆里开辟了一块空间存放他,好了我们记住他的内存地址0X123,当调用print,把a作为实参传给par,会把这个地址交给par,执行 par = new A();的时候,par指向了0x456,如果是引用传递,那么a也应该指向0x456,然而并没有,所以,上面的参数其实是值传递,把实参对象引用的地址当做值传递给了形式参数。在第二个例子中,并没有对形参本身进行修改,而是修改的形参持有的地址中存储的内容
最后一个坑就是String,String=“***”,没有new,实际上也会改变指向(String是不可变的)
最后总结一下:Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用

相关文章

  • (二)值传递与引用传递

    首先,我们要明确一点,Java中只有值传递,至于原因,下面说。 错误理解: 参数是值,就是值传递;参数是引用,就是...

  • 聊聊Java内部类

    一.磨叽磨叽Java值传递与引用传递 “在Java里面参数传递都是按值传递”即:按值传递是传递的值的拷贝,按引用传...

  • C++基础

    C++ 值传递、指针传递、引用传递详解C++中引用传递与指针传递区别 引用传递和指针传递的区别 引用的规则:(1)...

  • Java 与值传递

    问: 什么是值传递?什么是引用传递?为什么说 Java 中只有值传递? 一、值传递与引用传递 实参与形参: 实际参...

  • Day12-Java

    值传递和引用传递 值传递是值的拷贝, 引用传递是引用的拷贝 String 类型是引用类型, new String ...

  • 引用传递与值传递

    访问变量分引用传递和值传递 值传递 基本数据类型值的传递,就是将变量的值复制给另一个变量。这两个变量是完全独立的。...

  • 值传递与引用传递

    一般数据类型(byte,char,int,float,double,long,String,Integer,Lon...

  • 值传递与引用传递

    JavaScript有6种基本的数据类型,分别是:布尔、null、undefined、String和Number、...

  • 值传递与引用传递

    值传递 在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。 引用传...

  • Java中的参数传递

    为了便于理解,会将参数传递分为按值传递和按引用传递。按值传递是传递的值的拷贝,按引用传递传递的是引用的地址值,所以...

网友评论

    本文标题:(二)值传递与引用传递

    本文链接:https://www.haomeiwen.com/subject/myjapftx.html