`

传址还是传值

    博客分类:
  • Java
 
阅读更多

    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=1b=1ab是指向同一空间的。如果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,但是str1str3指向的位置是一样的。为什么会怎样,因为存储方式跟基本数据类型是一样的,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是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...

    深入浅析Python传值与传址

    1. 传值与传址的区别 传值就是传入一个参数的值,传址就是传入一个参数的地址,也就是内存的地址(相当于指针)。他们的区别是如果函数里面对传入的参数重新赋值,函数外的全局变量是否相应改变:用传值传入的参数是...

    浅谈js中的引用和复制(传值和传址)

    同样,对于字符串,虽然其内容不可变,但在比较时被视为传值比较。 然而,对于引用类型,赋值实际上是复制了一个引用,即进行“传址”。例如,`var a = [1]; var b = a;`此时,`b`和`a`都指向同一个数组。如果修改`...

    VB参数传递(传值ByVal与传址ByRef)[整理].pdf

    VB 参数传递(传值 ByVal 与传址 ByRef) VB 中的参数传递方式有两种:传值(ByVal)和传址(ByRef)。这两种方式决定了在过程调用时,主调过程和被调过程之间的数据传递方式。 传值方式(ByVal) 在 VB 中,传值...

    c#几个区别传值和传址的好例子

    在C#编程中,了解和区分传值与传址的概念至关重要,因为这直接影响到函数调用时参数的处理方式,从而影响程序的行为。下面通过两个示例来详细讲解这两个概念。 **传值(Pass by Value)** 在C#中,基本类型(如int...

    delphi传址与传参的区别

    选择传值还是传址取决于具体的应用场景。一般来说: - 当需要确保函数调用不改变外部变量状态时,应使用传值。 - 当处理大型数据结构或需要函数直接修改外部变量时,应使用传址。 然而,传址也有其潜在的风险,...

    JavaScript基础篇之变量作用域、传值、传址的简单介绍与实例

    在学习JavaScript基础时,变量作用域、传值与传址是核心概念,它们在编程过程中有着举足轻重的作用。本文将对这些概念进行简单介绍,并通过实例加深理解。 首先,关于变量作用域。在JavaScript中,变量的作用域决定...

    PHP传参之传值与传址的区别

    在PHP中,函数参数的传递方式有两种:传值和传址。了解这两种传递方式的区别对于编写高质量的PHP代码至关重要。 传值(Pass by Value)是默认的参数传递方式,意味着当函数参数通过值传递时,实际上传递的是参数值...

    js代码-函数调用的传值和传址

    本主题聚焦于JavaScript中的函数调用机制,特别是关于传值和传址的概念。理解这两个概念对于编写高效和可维护的代码至关重要。 首先,我们要明白在JavaScript中,变量有两种类型:基本类型(如字符串、数字、布尔值...

    javascript中的变量是传值还是传址的?

    在这种情况下,变量间的赋值操作是传值,传递的是值的副本。 ```javascript var stringValue = "淡淡的"; var anotherStringValue = stringValue; stringValue = "I have changed"; ``` 在这个例子中,`...

    javascript的变量、传值、传址、参数之间关系

    JavaScript是一种动态类型的脚本语言,其变量、传值、传址和参数之间的关系是理解和使用JavaScript中的一个基础但关键点。接下来,我会详细解释这些概念。 首先,JavaScript中的变量可以存储两种类型的数据:基本...

    浅析C# 函数的传值与传址

     传址就是将地址传到所调用的函数里面操作,实参的值也会跟着变化,传址的有数组和字符串string。  上面说的就牵扯到数据的分类,分为值类型和引用类型,值类型的就是传值的那种,引用类型包括字符串类型,数组和...

    C语言第八章PPT学习教案.pptx

    通常,函数参数传递有两种方式:传值和传址。传值方式中,函数接收的是实参副本,无法直接影响实参的值。而传址方式下,函数通过指针参数可以直接修改实参对应的内存内容。这是因为形参和实参指向同一个内存地址,...

Global site tag (gtag.js) - Google Analytics