java方法参数到底是值传递还是引用传递?

结论:java方法参数是值传递
在计算机术语中,值调用(call by value)表示方法接收的是调用者提供的。引用调用(call by referennce)表示方法接收的是调用者提供的变量地址
在java中:

public static void tripieValue(double x) // 不起作用
{ 
    x = 3 * x; 
}
double x = 10;
tripieValue(x);
System.out.println(x);//依然是10

方法只是接收参数的一段拷贝,所以原值依然没有改变,这个好理解。
然而方法由两种数据类型

  • 基本数据类型(数值,布尔型,字符型)
  • 对象类型
    当一个对象类型数据传递给方法参数时,传递的是对象的地址的一份拷贝。如果改变了对象地址相应的值,那么还是能达到目的,而如果只是给形式参数y赋值为空或者改变引用,完成操作之后,由于y属于局部变量,就被抛弃了,并没有改变x的值。
int[] x = {10}
public static void tripleValue(int[] y)//起作用
{ 
    y[0] = 30;//值被改变,数组x被改变
    y = null;//不起作用,因为之前是x对象地址赋值给了y,而y又赋值为空,数组x未被改变
}

在C++中,引用实际上是变量的另一个别名,所以下面这串代码是有效的。这是在C++实现的引用传递,方法内是真实的变量地址。

#include <iostream>
using namespace std;
 
// 函数声明
void swap(int& x, int& y);
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
 
   cout << "交换前,a 的值:" << a << endl;//100
   cout << "交换前,b 的值:" << b << endl;//200
 
   /* 调用函数来交换值 */
   swap(a, b);
 
   cout << "交换后,a 的值:" << a << endl;//200
   cout << "交换后,b 的值:" << b << endl;//100
 
   return 0;
}
 
// 函数定义
void swap(int& x, int& y)
{
   int temp;
   temp = x; /* 保存地址 x 的值 */
   x = y;    /* 把 y 赋值给 x */
   y = temp; /* 把 x 赋值给 y  */
  
   return;
}

总结,在JAVA中方法参数接受的是传递的值或变量地址的一份拷贝,相当于开辟了一块内存空间,然后在数据内存空间里传入值或变量地址,进行赋值操作,所以是值传递
而在上例的C++中,方法直接接受的原变量内存空间的地址,并没有新开辟内存空间,方法参数是传入变量的别名,能够直接操作传入的变量,所以是引用传递

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值