java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java参数传递

Java方法参数传递机制原理解析

作者:sumerday

这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Java方法参数传递机制原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

Java方法中如果声明了形参,在调用方法时就必须给这些形参指定参数值,实际传进去的这个值就叫做实参。
这就涉及到Java中的参数传递机制,值传递。

基本数据类型

基本数据类型,值传递的体现是数值的传递。

public class TransferTempTest {
  public static void main(String[] args) {
    //基本数据类型参数传递
    TransferTempTest test = new TransferTempTest();
    int num1 = 10;
    int num2 = 20;
    System.out.println("进行交换前:");
    System.out.println("num1 = " + num1 + ",num2 = " + num2);
    test.swap(num1, num2);
    System.out.println("交换之后:");
    System.out.println("num1 = " + num1 + ",num2 = " + num2);
  }
  public void swap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    System.out.println("交换过程中:");
    System.out.println("num1 = " + a + ",num2 = " + b);
  }
}
//运行结果
进行交换前:
num1 = 10,num2 = 20
交换过程中:
num1 = 20,num2 = 10
交换之后:
num1 = 10,num2 = 20

整个过程的内存图演示:

如图所示:

引用数据类型

基本数据类型,值传递的体现是地址值的传递。

public class TransferTempTest {
  public static void main(String[] args) {
  //引用类型参数传递
    DataTemp data = new DataTemp();
    data.a = 2;
    data.b = 4;
    System.out.println("进行交换前:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);
    data.swapClass(data);
    System.out.println("进行交换后:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);
  }
}
class DataTemp {
  int a;
  int b;

  public void swapClass(DataTemp data) {
    int temp = data.a;
    data.a = data.b;
    data.b = temp;
    System.out.println("交换过程中:");
    System.out.println("data.a = " + data.a + ",data.b = " + data.b);

  }
}
//运行结果
进行交换前:
data.a = 2,data.b = 4
交换过程中:
data.a = 4,data.b = 2
进行交换后:
data.a = 4,data.b = 2

整个过程的内存图显示:

如图所示:

  1. 在堆内存中创建DataTemp类型的对象,并让栈内存中的引用变量data存储0x7788(假设地址值),指向该对象,实例变量a和b的初始值都是0。
  2. 让data.a=2,data.b=4,如蓝色字体显示,这时打印:data.a = 2,data.b = 4
  3. 进入swapClass方法,首先在栈区声明形参变量data,将原来的data的地址值传入,红黑两个data不是同一个!!,红色data只是黑色data的拷贝值,且拷贝的是地址值。这时两个data指向同一片堆区内存,如红色箭头显示。
  4. 接着还是在栈区声明一个名为temp的变量,参与交换操作,这时操作的是堆区的数据,所以方法里显然打印:data.a = 4,data.b = 2
  5. 最后,退出这个方法,局部变量销毁,执行的交换过程虽然是在swapClass方法中,但引用变量传入形参传递的是地址值,意味着,这时的交换操作直接对堆区对象生效,所以最终交换成立:data.a = 4,data.b = 2

综合练习

package com.my.pac05;

public class TransferTest {
  public static void main(String[] args) {
    TransferTest test = new TransferTest();
    test.first();
  }

  public void first() {
    int i = 5;
    Value v = new Value();

    v.i = 25;
    second(v, i);
    System.out.println(v.i);
  }

  public void second(Value v, int i) {
    i = 0;
    v.i = 20;
    Value val = new Value();
    v = val;
    System.out.println(v.i + " " + i);
  }
}

class Value {
  int i = 15;
}
//运行结果
15 0
20

整个过程的内存图显示:

总结

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文