Java里在使用对象的时候,是传址还是传值呢?看看这句经典名言: O'Reilly's Java in a Nutshell by David Flanagan (see Resources) puts it best: "Java manipulates objects 'by reference,' but it passes object references to methods 'by value.'"从这句话可以看出,java应该是传址调用的(如果想深入了解的话,可以了解一下java虚拟机规范关于基本数据类型和复合数据类型(也就是对象)在栈和堆中的存储方式,以加深理解)。
我们也可以自己做个小实验:
本数据类型比较简单,因为数据存储空间比较小,每个不同的基本数据类型都有单独的存储空间,比如i=1,b=1,a和b是指向同一空间的。如果b=2了,那就新开一个空间,在把b指向这个位置。
对象的情况如下:
User u1=new User();
System.out.println(u1);
User u2=new User();
System.out.println(u2);
User u3=u1;
System.out.println(u3);
输出:
com.springMVC.entity.User@a62fc3
com.springMVC.entity.User@89ae9e
com.springMVC.entity.User@a62fc3
从以上的输出可以看到,java是传址调用的。
但是String是一个特殊的对象,他生成方式象对象,但是存储方式又像基本数据类型。
String str1="11111";
System.out.println(str1.hashCode());
String str2="22222";
System.out.println(str2.hashCode());
String str3="11111";
System.out.println(str3.hashCode());
输出:
3541024
3541025
3541024
从输出数据可以看到,str1没有附值给str3,但是str1和str3指向的位置是一样的。为什么会怎样,因为存储方式跟基本数据类型是一样的,str1生成的时候,内存分配了位置保存“11111”,当str3生成的时候,java虚拟机会在内存中查找是否已经有“11111”,如果有他就将str3指向这个位置,如果没有,就新生成一个。
在函数中使用传址(引用)还是值,定义按值传递和按引用传递这两个术语是重要的。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
上面的这些是很重要的,请大家注意以下几点结论,这些都是我认为的上面的文章中的精华和最终的结论:
1、对象是按引用传递的,
2、基本数据类型是按值传递(包括特殊的对象String),
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本,原来值不会变。
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本,对象的内容会变。
多于2个Bay被计划, 请联系EC处理=\u591a\u4e8e2\u4e2aBay\u88ab\u8ba1\u5212, \u8bf7\u8054\u7cfbEC\u5904\u7406
多于2個Bay被計劃, 請聯系EC處理=\u591a\u4e8e2\u500bBay\u88ab\u8a08\u5283, \u8acb\u806f\u7cfbEC\u8655\u7406
相关推荐
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
1. 传值与传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变:用传值传入的参数是...
同样,对于字符串,虽然其内容不可变,但在比较时被视为传值比较。 然而,对于引用类型,赋值实际上是复制了一个引用,即进行“传址”。例如,`var a = [1]; var b = a;`此时,`b`和`a`都指向同一个数组。如果修改`...
VB 参数传递(传值 ByVal 与传址 ByRef) VB 中的参数传递方式有两种:传值(ByVal)和传址(ByRef)。这两种方式决定了在过程调用时,主调过程和被调过程之间的数据传递方式。 传值方式(ByVal) 在 VB 中,传值...
在C#编程中,了解和区分传值与传址的概念至关重要,因为这直接影响到函数调用时参数的处理方式,从而影响程序的行为。下面通过两个示例来详细讲解这两个概念。 **传值(Pass by Value)** 在C#中,基本类型(如int...
选择传值还是传址取决于具体的应用场景。一般来说: - 当需要确保函数调用不改变外部变量状态时,应使用传值。 - 当处理大型数据结构或需要函数直接修改外部变量时,应使用传址。 然而,传址也有其潜在的风险,...
在学习JavaScript基础时,变量作用域、传值与传址是核心概念,它们在编程过程中有着举足轻重的作用。本文将对这些概念进行简单介绍,并通过实例加深理解。 首先,关于变量作用域。在JavaScript中,变量的作用域决定...
在PHP中,函数参数的传递方式有两种:传值和传址。了解这两种传递方式的区别对于编写高质量的PHP代码至关重要。 传值(Pass by Value)是默认的参数传递方式,意味着当函数参数通过值传递时,实际上传递的是参数值...
本主题聚焦于JavaScript中的函数调用机制,特别是关于传值和传址的概念。理解这两个概念对于编写高效和可维护的代码至关重要。 首先,我们要明白在JavaScript中,变量有两种类型:基本类型(如字符串、数字、布尔值...
在这种情况下,变量间的赋值操作是传值,传递的是值的副本。 ```javascript var stringValue = "淡淡的"; var anotherStringValue = stringValue; stringValue = "I have changed"; ``` 在这个例子中,`...
JavaScript是一种动态类型的脚本语言,其变量、传值、传址和参数之间的关系是理解和使用JavaScript中的一个基础但关键点。接下来,我会详细解释这些概念。 首先,JavaScript中的变量可以存储两种类型的数据:基本...
传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传址的有数组和字符串string。 上面说的就牵扯到数据的分类,分为值类型和引用类型,值类型的就是传值的那种,引用类型包括字符串类型,数组和...
通常,函数参数传递有两种方式:传值和传址。传值方式中,函数接收的是实参副本,无法直接影响实参的值。而传址方式下,函数通过指针参数可以直接修改实参对应的内存内容。这是因为形参和实参指向同一个内存地址,...