Java里的传值实际上是拷贝引用,而不是拷贝对象。
如果是以基本数据类型(包括String类)做参数进行传递,或以某个类名(包括数组名)为类型做为参数而
直接对其类进行操
作(非类的属性),这样的传递叫值传递;
如果是以某个类名为类型做为参数进行传递而
针对该类的属性进行的操作,这样的传递叫做引用传递。
也就是说在值传递的过程中其操作不会对所传进来的对象有任何的影响,它传进来的只是该对象的一个副本,其本身不会有任
何的改变;而引用传递则传进来的是该对象的一个别名,即引用该对象在虚拟机中的“地址”,因此引用传递会对该“地址”的内
部属性产生影响,而不会改变该“地址”在虚拟机中的位置,即引用传递在外部看来是没有发生过任何变话的,但从内部看来,
它的属性会随着调用它的方法的改变而改变
因此,也有人说JAVA只有“值传递”,而没有引用传递。
一个简单的例子:
public class test{
public static void swap(String[] name){
String temp;
temp = name[0];
name[0] = name[1];/*传进去的虽然是一个副本,但是修改了数组的属性,对该数组的属性进行了操作,属于引用传递.*/
name[1] = temp;
}
public static void swap(String name0, String name1){
String temp;
temp = name0;
name0 = name1;
name1 = temp;
}
public static void main(String[] args){
String[] name = {"a","b"};
String name0 = "a";
String name1 = "b";
swap(name0, name1);
System.out.println(name0+","+name1);
swap(name); System.out.println(name[0]+","+name[1]);
}
}
}
输出为:
a,b
b,a
*************************************************************
按值传递:
8中基本数据类型(int,short int ,long int, double, float, char, byte,boolean)和String,Integer,Char,Double等基本数据类型的包装类
特点:在内存中复制一份数据,把复制后的数据传递到方法内部
作用:在方法内部改变参数的值,外部数据不会跟着发生改变,既不受影响。
简单地说,如果在方法中修改了传入实参变量的值,方法调用结束后,那个在调用的端的实参不会改变。
按引用传递:
除String ,Integer,Char等基本类型包装类以外的其他引用类型(对象)和数组.
热点:将对象引用的副本传递到方法内部
作用:在方法内部修改对象的内容,外部数据也会跟着发生变化。
与传值传递方式正好不同,按引用传递是指每次传递时实参时,把实参在内存中的引用(存储地址)复制一份,然后把副本传递到方法内部。
*********************************************************************
传值与传址是相对于方法而言的。什么为传。要有东西才是传。
例如:
Class Test{
int num=10;
Test A = new Test();此处的对象A是类Test的新实例,A的num为10;
A.num=20;
Test B = new Test();
B.num=30;
Test C = new Test();
}
在main方法中各打印出对象A,B,C的num,得到的值为20,30,10。可知A,B,C都是新的实例。互不影响。
传值与传址是在一个方法里传入,如public void method(Test test){
}
传入等于创建了一个副本。根据具体情况分析。
如public void change(int num){
num = num +10;
}
改变的只是副本,值无变化,如果再第一个num加this。改变的就是本身了,有变化。
如
public void change(Test test){
test.a=test.a+10
}
虽然改变的是副本的信息,但是副本和正本的指针指向同一地址,所以改变的是属性,会有变化。慢慢分析了解吧
分享到:
相关推荐
1. 传值与传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变:用传值传入的参数是...
在C#编程中,了解和区分传值与传址的概念至关重要,因为这直接影响到函数调用时参数的处理方式,从而影响程序的行为。下面通过两个示例来详细讲解这两个概念。 **传值(Pass by Value)** 在C#中,基本类型(如int...
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
在学习JavaScript基础时,变量作用域、传值与传址是核心概念,它们在编程过程中有着举足轻重的作用。本文将对这些概念进行简单介绍,并通过实例加深理解。 首先,关于变量作用域。在JavaScript中,变量的作用域决定...
同样,对于字符串,虽然其内容不可变,但在比较时被视为传值比较。 然而,对于引用类型,赋值实际上是复制了一个引用,即进行“传址”。例如,`var a = [1]; var b = a;`此时,`b`和`a`都指向同一个数组。如果修改`...
在PHP中,函数参数的传递方式有两种:传值和传址。了解这两种传递方式的区别对于编写高质量的PHP代码至关重要。 传值(Pass by Value)是默认的参数传递方式,意味着当函数参数通过值传递时,实际上传递的是参数值...
传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传址的有数组和字符串string。 上面说的就牵扯到数据的分类,分为值类型和引用类型,值类型的就是传值的那种,引用类型包括字符串类型,数组和...
总之,理解和掌握JavaScript中的传值与传址是编写高级JS代码的基础。它们不仅影响到函数如何处理参数,还涉及到数据的可变性、作用域以及性能优化等多个方面。通过深入学习这些概念,你可以更好地控制代码的行为,...
JavaScript是一种动态类型的脚本语言,其变量、传值、传址和参数之间的关系是理解和使用JavaScript中的一个基础但关键点。接下来,我会详细解释这些概念。 首先,JavaScript中的变量可以存储两种类型的数据:基本...
VB 参数传递(传值 ByVal 与传址 ByRef) VB 中的参数传递方式有两种:传值(ByVal)和传址(ByRef)。这两种方式决定了在过程调用时,主调过程和被调过程之间的数据传递方式。 传值方式(ByVal) 在 VB 中,传值...
### 传址与传值的选择 选择传值还是传址取决于具体的应用场景。一般来说: - 当需要确保函数调用不改变外部变量状态时,应使用传值。 - 当处理大型数据结构或需要函数直接修改外部变量时,应使用传址。 然而,...