Java值传递机制

形参与实参

形参:方法被调用时需要传递出来的参数

实参:方法被调用时传入的实际值

Java里方法的参数传递机制只有一种:值传递

  • 形参是基本数据类型,则将基本数据类型存储的“数据值”传给形参

  • 形参时引用数据类型,则将引用数据类型变量的“地址值”赋给形参

基本数据类型

  1. main方法进栈,m和n的初始化值分别为10和20,

  2. swap方法进栈,将m和n的值传入swap方法的形参中,并将swap方法里的m和n的值交换,输出swap方法里,m的值为10,n的值为10

  3. swap方法结束,弹栈,只剩下main方法里面的成员变量,输出交换结束后,变量m的值为20,n的值为10

引用数据类型

  1. 首先main方法进栈,在执行Data d = new Data()时,JVM会创建一个Data()实例对象并在堆空间中开辟一块内存存储这个实例,同时把地址值(假设地址值为0x0011)赋值给d变量,由于Data类没有对m和n进行初始化,所以int类型默认值为0

  2. d.m=20d.n=20修改了原来的值使m=10,n=20

  3. swap方法进栈,形参data的值是main方法中swap(d)这条语句赋值过来,是地址值,所以也是0x0011,所以也指向那个实例

  4. swap方法又定义了一个局部变量tmp,只要是局部变量就放在栈空间,所以把tmp放在栈空间,并将m的值赋给它,tmp=10.然后把m和n的值交换,输出swap方法里,m的值为20,n的值为10

  5. swap方法结束,结束之后就弹栈

  6. 执行main方法里的输出语句,main方法还是指向那个实例,输出交换结束后,变量m的值为20,n的值为10

static关键字

看完后你可能会发现基本数据类型的代码main方法中有TransferTest1 t = new TransferTest1(),并且调用swap方法时是t.swap(m,n);

而引用数据类型的代码块main方法中直接使用swap(d),这是因为定义swap方法时使用了static关键字

static关键字的基本作用一句话来描述就是:

方便在没有创建对象的情况下来进行调用(方法/变量)。

很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。

所以第一块代码也可以写成


public class TransferTest1 {
  public static void main(String[] args) {
    int m = 10;
    int n = 20;
    swap(m, n);
    System.out.println("交换结束后,变量m的值为" + m + "n的值为" + n);
    }
  public static void swap(int m, int n) {
    int tmp = m;
    m = n;
    n = tmp;
    System.out.println("swap方法里,m的值为" + m + "n的值为" + n);
  }
}

猜你喜欢

转载自www.cnblogs.com/codecheng99/p/12439831.html