按值传递是java比较单纯的体现,虽然真正的内部实现还是按照地址、指针那一套,不过理解起来似乎没有那么裹人!但是还是得小心一点,有时候会出现一些假象,我们应该看清那些东西的本质!
public class CallByValue{
public static void swap(int a,int b){
int temp=aa;
a=db;
b=temp;
System.out.println("a="+a+" b="+b);
}
public static void main(String[] args){
int a=6;
int b=9;
swap(a,b);
System.out.println("a的值为:"+a+" b的值为:"+b);
}
}
大家应该一眼可以看出来,在swap中毫无疑问是按值传递的。只是传给a、b的副本给swap,在swap中a、b的值变化了,但是main中的a、b丝毫不受影响。这个就是所谓的按值传递!但是下一段代码的传递方式不是那么容易理解,尽管它仍然是按值传递。
public class CallByValue{
public static void swap(DataObject do_){
int temp=do_.a;
do_.a=do_.b;
do_.b=temp;
System.out.println("a="+do_.a+" b="+do_.b);
}
public static void main(String[] args){
DataObject dw=new DataObject();
dw.a=6;
dw.b=9;
swap(dw);
System.out.println("a的值为:"+dw.a+" b的值为:"+dw.b);
}
}
class DataObject{
int a;
int b;
}
乍一看,好似按引用传递(也就是按照指针),因为a、b的值发生了改变!这难道不足以说明问题吗?如果这样想的话,那就是被这个表象所欺骗!下面我们来仔细分析 一下它。
dw是一个DataObject的引用,并不是对象本身。当将dw作为参数传给swap的时候,实际上是给swap传递了一个值,只不过这个值所指向的对象和main中的dw指向的是同一个。当通过swap中的do_改变所指对象的时候,这个是改变对象本身了。
请看下图:
如果对此还有疑问的话,可以在swap方法最后添加:
do_=null;
其效果形如下图:
- 大小: 69.5 KB
- 大小: 68.6 KB
分享到:
相关推荐
call by value(值传递) -------------------- 在Java中,基本数据类型(primitive types)采用call by value方式传递参数。这意味着,当我们将一个基本数据类型的变量传递给一个方法时,实际上是将该变量的值传递...
按值传递(call by value)是最常用的求值策略:函数的形参是被调用时所传实参的副本。修改形参的值并不会影响实参。 按引用传递(call by reference)时,函数的形参接收实参的隐式引用,而不再是副本。这意味着函数...
Call-by-value是计算机编程中一种参数传递的方式,其含义是当函数调用时,实际参数的值被复制一份传递给函数的形式参数。在函数内部对形式参数的任何修改都不会影响实际参数。Call-by-value与“Call-by-reference”...
2. **对象引用和原始类型**:对于基本类型(如int, char, double等),`Call By Value`意味着传递的是这些类型的值的副本。而对于对象引用,虽然也是按值传递,但传递的是对象引用的副本,而不是对象本身。这意味着...
这个问题涉及到两种主要的传递方式:按值传递(call by value)和按引用传递(call by reference)。此外,JavaScript中还有一种特殊的传递方式,称为按共享传递(call by sharing)或者按对象传递(call by object...
在程序设计语言中,按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递...
1. 按值传递(Call by Value) 按值传递是指将实参的值复制给形参,形参的变化不会影响实参的值。这种方式适用于基本数据类型,如int、long、float等。在按值传递中,实参的值被复制到形参中,形参的变化不会影响...
在C语言中,函数参数的传递主要有两种方式:按值传递(Pass by Value)和按引用传递(Pass by Reference)。"函数按值传参"这个文件名表明它主要关注的是按值传递这一机制。 按值传递意味着函数在调用时会复制参数...
1. 值传递(Call by Value) 值传递是最常见也是最基本的参数传递方式。在值传递中,函数接收的是实参的副本,因此原始数据不会被改变。在给定文档中,值传递的示例为: ```cpp int main(){ void swap(int a, int b...
在C语言中,函数调用时的参数传递方式主要分为两种:值传递(Call by Value)和地址传递(Call by Address),也称作传值和传址。 在值传递中,当调用一个函数时,实际参数(实参)的值被复制到形式参数(形参)中...
当讨论方法参数时,有两种术语经常被提及:值传递(Call by Value)和引用传递(Call by Reference)。Java参数传递的规则是:**Java只使用值传递,但这种值传递对于对象参数表现为类似引用传递的行为。** 在值传递...
public class CallByValue { private static User user = null; private static User stu = null; public static void swap(User x, User y) { User temp = x; x = y; y = temp; } public static void ...
在C语言中,函数参数传递默认是按值传递(Call by Value),这意味着函数内部对形参的任何修改不会影响到实参。如果想要在函数中改变实参的值,就需要使用指针参数,这样函数可以通过指针访问并修改实参的内存位置。...
参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。Java主要采用值传递的方式。 ##### 1. 值传递 当我们将基本数据类型作为参数传递给方法时,实际上是传递了该数据的值的一个...
基本数据类型在方法传递时采用“按值传递”(call by value)的方式,即传递的是变量的副本值,原变量的值不会被改变。例如,在一个方法中,对传入的int型变量进行操作,原变量的值保持不变。 引用数据类型的参数...
在程序设计语言中,方法参数传递有两种方式:按值调用(call by value)和按引用调用(call by reference)。按值调用是指方法接收的是调用者提供的值,而按引用调用是指方法接收的是调用者提供的变量地址。Java采用...
3. call by value, call by address (或 call by pointer), call by reference? - call by value:函数接收的是实参的副本,对副本的修改不会影响到原始变量。 - call by address 或 call by pointer:函数接收的是...
在C++中,函数调用有两种主要方式,即值传递(Call by Value)和引用传递(Call by Reference)。值传递时,函数接收的是参数值的副本,对参数的修改不会影响到原变量。而引用传递则不同,函数接收的是变量的引用,...