`
zhb8015
  • 浏览: 397215 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
Group-logo
Spring Roo杂谈
浏览量:0
社区版块
存档分类
最新评论

Java中函数参数的传递是值传递还是引用传递(转)

阅读更多

z

java参数传递时到底是值传递还是引用传递(baidu搜集)

最近比较长一段时间以来,网上的IT同行里面比较流行JAVA面试32问”,很多人的BLOG里都引用这些面试题,最近因为工作内容比较枯燥,也来看看这些试题以调节一下口味,其有一道题让我很费解。

原题是:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

google查询结果,得到答案基本上是:值传递。当时觉得挺纳闷儿,为什么连参数的内容都被修改了,怎么还能说是“值传递”呢?因为在传统的印象里(尤其是从C++过来以后),值传递都应该是不改变原参数的。

问问周围的同事,也大都这么讲,但是也都讲不清这种理论的根源是什么。我这个人有个毛病,有事情想不通时就会憋得难受,后来在《Thinking in Java》的一段内容(注解[1])里找到了自己的结论,我认为(《Thinking in Java》的作者也这么认为):可以说是值传递,也可以说是引用传递。

一,认为是值传递。得出这种结论的前提必须是“参数的值就是对该对象的引用,而不是对象的内容”,这句话可能有些费解,举个例子加以说明。

public class Paier {

     public static void main(String[] args) {

                    Paier paier = new Paier();

                    paier.test();

     }

    

     public void test() {

                    TestClass para1 = new TestClass();

                    para1.setTest(new Integer(10));

                    TestClass result1 = test1(para1);

                    System.out.println("para1   = " + para1.getTest());

                    System.out.println("result1 = " + result1.getTest());

                   

                    TestClass para2 = new TestClass();

                    para2.setTest(new Integer(10));

                    TestClass result2 = test2(para2);

                    System.out.println("para2   = " + para2.getTest());

                    System.out.println("result2 = " + result2.getTest());

     }

    

     public TestClass test1(TestClass t) {

                    t = new TestClass();

                    t.setTest(new Integer(20));

                    return t;

     }

    

     public TestClass test2(TestClass t) {

                    t.setTest(new Integer(20));

                    return t;

     }

    

     class TestClass {

                    Integer test = null;

                    public void setTest(Integer i) {

                                  test = i;

                    }

                    public Integer getTest() {

                                  return test;

                    }

     }

}

执行后的结果是:

para1   = 10

result1 = 20

para2   = 20

result2 = 20

为什么会这样呢?因为test1想通过修改参数的引用来修改返回值,但是在JAVA中,参数的引用是不可修改的,所以para1result1分别指向不同的空间,结果也不一样。而在test2中,result2para2始终指向同一块区域,test2方法修改的是参数内容,而不是参数的引用。

从上面看来,因为参数的引用不可改变,如果理解为“参数的值就是对该对象的引用”,那么java自然只有值传递。

二,认为是引用传递。还是上面的例子,如果在参数传递时理解为“参数的值就是该对象的内容”,那么显然不是值传递,因为对象的内容已经改变了。

认为是引用传递还有一个理由,就是java有一个保留字byvalue现在的JDK版本中还没有实现这个保留字,似乎是在暗示对这种观点的支持。(There appears to be some support for this view within Sun, since one of the “reserved but not implemented” keywords is byvalue.

所以说,对于原题的结论,是值传递还是引用传递并不重要,重要的是要理解“对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。”

 

分享到:
评论

相关推荐

    Java:按值传递还是按引用传递详细解说

    在Java编程语言中,关于参数传递的方式一直存在两种观点:一种认为Java仅支持按值传递,另一种则指出Java同时支持按值传递和按引用传递。实际上,这两种观点并非完全对立,而是根据不同的角度来描述Java中的参数传递...

    Java的引用和函数参数传递

    通过上述分析,我们可以清楚地了解到Java中引用和函数参数传递的基本概念以及它们的具体应用。了解这些概念对于正确使用Java进行编程非常重要,尤其是在处理复杂的数据结构和对象交互时。希望本文能帮助读者更好地...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    无论将Java的参数传递称为"值传递"还是"引用传递",重要的是要明白对象的引用不会改变,但对象的内容可以在方法中被修改。这种机制使得Java的代码更安全,避免了不必要的副作用,同时也提供了灵活的编程模型。

    java值传递与引用传递

    在Java编程语言中,函数参数的传递方式有两种:值传递和引用传递。理解这两种机制对于编写高效、无误的代码至关重要。以下是对这两种传递方式的详细解析。 首先,值传递是指函数调用时,实际参数的值被复制一份传给...

    java 中函数的参数传递详细介绍

    1. 值传递:在Java中,基本数据类型(如int、float、char等)和它们的包装类(Integer、Float、Character等)作为函数参数时,遵循值传递的原则。这意味着函数内部对这些参数的任何修改都不会影响到原始变量。例如,...

    java 值传递和引用传递的比较

    在Java编程语言中,了解值传递和引用传递的概念至关重要,因为它们直接影响到函数参数的处理方式。下面将详细探讨这两个概念及其区别。 首先,我们来理解什么是值传递。在Java中,基本数据类型(如int、double、...

    浅谈JavaScript 函数参数传递到底是值传递还是引用传递

    JavaScript中的函数参数传递机制一直以来都是开发者讨论的热点。在传统观念中,JavaScript的参数传递常被误解为引用传递,即类似C++或C中的指针传递。然而,JavaScript的实现其实更为复杂,它包含了值传递和引用传递...

    浅析Java引用类型和方法参数传递

    Java中,无论是值类型还是引用类型,在作为方法参数传递时,都遵循着一种被称为“按值传递”的机制。这意味着,当我们将一个变量作为参数传递给方法时,实际上传递的是该变量的一个副本。 ##### 1. 值传递 - **原理...

    23.Java对象作为参数传递是传值还是传引用1

    总结起来,Java中对象作为参数传递时,传递的是对象引用的副本,而不是对象本身。这意味着函数可以修改对象的状态,因为它持有相同的引用,但不能改变对象引用指向另一个不同的对象。这种行为与基本数据类型不同,...

    Java参数传递PPT

    在值传递中,函数或方法接收的是原始数据类型(如int、double、boolean)参数的副本。例如,如果有一个方法tripleValue,它接受一个double类型的percent并尝试将它乘以3,实际上这个操作不会影响到原始的percent变量...

    Java中的值传递和引用传递的区别.doc

    Java 中的值传递和引用传递是两个不同的参数传递机制。值传递是指当基本数据类型作为入口参数传给函数体时,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的函数体内部的操作都是...

    函数调用参数传递类型(java)的用法介绍..ppt

    本文档主要介绍 Java 中函数调用参数传递类型的用法,通过对 Applet 概述、Applet 应用程序接口、绘图、Swing 基础、Swing 的特点和概念、Swing 组件、其它 Swing 特性等方面的讲解,展示了 Java 语言程序设计的主要...

    C、C++函数参数传递方式.pdf

    在值传递中,函数接收的是实参的副本,因此原始数据不会被改变。在给定文档中,值传递的示例为: ```cpp int main(){ void swap(int a, int b){ int temp = a; a = b; b = temp; } int i = 3, j = 4; cout , ...

    探讨Java中函数是值传递还是引用传递问题

    根据标题和描述,本文将深入探讨Java中函数参数传递的机制,究竟是值传递还是引用传递。实际上,Java只支持值传递,但这种值传递对于引用类型(对象)的数据有着特殊含义。 首先,值传递是指当函数调用时,实际参数...

    值传递和引用传递

    在计算机编程中,值传递和引用传递是两种常见的参数传递方式。这两种传递方式在不同的编程语言中有不同的实现细节,但其核心概念是相似的。本文将详细介绍值传递和引用传递的概念、用法以及它们之间的区别,并通过...

    C与C++中的函数参数传递机制

    Java中无论是基本类型还是对象引用,都是按值传递的。但是,当传递的是对象引用时,传递的是引用的副本,这使得函数内部对对象的修改会影响到原始对象。相比之下,C/C++中的参数传递更灵活,可以通过指针来实现类似...

    java值传递和引用传递详解

    Java中的参数传递方式主要有两种:值传递和引用传递。理解这两种机制是编程中至关重要的,因为它们直接影响到函数内部如何改变或操作传入的数据。 **值传递**在Java中是基本数据类型(如int, double, char等)的...

    参数传递的总结——构造函数

    1. **值传递**:在构造函数中使用值传递时,函数接收的是参数值的副本。这意味着即使在构造函数内部改变了这个副本,也不会影响到调用构造函数时传入的原始值。例如,在C++中,如果参数是基本类型(如int或double)...

    java中参数传递方式详解

    * Java 中参数传递方式可以分为按值传递和按引用传递两种 * 在 C++ 语言中,这两种传递方式都是合法的,而在 Java 语言中,只有按值传递是一种合法的传递方式 * 函数内修改了形参指向一个新对象,外面的实参不受影响...

Global site tag (gtag.js) - Google Analytics