`
littie1987
  • 浏览: 134520 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java中的参数传递问题

    博客分类:
  • Java
阅读更多

      在java中关于参数传递时到底是按值传递还是按引用传递一直是比较头疼的。

我的理解是,基本类型是按值传递,而对象类型则是按引用传递的。但是,大家可能会发现一个问题。看下面的程序:

public class Test {
    public static void test(String str) {
        str = "World";
    }
    public static void main(String[] args) {
        String string = "Hello";
        test(string);
        System.out.println(string);
    }
}

   这段程序的输出结果是:Hello,而不是大家所期待的HelloWorld。原因是String类型是一个final型的变量。也就是他的值是不允许被改变的。在main方法中string是一个引用类型的变量时毫无疑问的,把他传给test方法的str,而str也是一个引用变量,此时在栈内存当中会存在两个变量string和str,他们虽然在栈内存当中是放在两个地方,但是却指向堆内存当中的同一个地址。简单的说,他们两个所存储的地址是一样的,都指向常量字符Hello。而在test的方法中,给str重新赋值了,按照常理,此时string引用也会跟着改变,而事实是没有。原因就在于String类型变量的特殊性。String类型的变量时不能被改变的,他尝试给他重新赋值之后,会给他重新分配地址,这就是说str被重新指向了别的地址了,而不是原来的string的地址了。

 

      上面仅仅是个特例,下面我们来看一个基本类型传值的例子:

    public static int test(int c) {
    	c=11;
        return c;
    }
    public static void main(String[] args) {
    	int a=19;
    	int b = test(a);
       System.out.println(a==b);
    }

   上面的代码输出了false。也就是说在把a赋值给c的时候,实际上是将a复制了一份放到了堆内存当中,然后让栈内存中的c指向这个新值。所以,此时的a和c将代表不同的内存地址,因此对c的任何变化和运算都不至于会影响到a。那么打印a==b自然也就是false了。

 

      我们再来看另外一段程序:

    public static StringBuffer test(StringBuffer str) {
        str.append("world");
        return str;
    }
    public static void main(String[] args) {
        StringBuffer string = new StringBuffer("hello");
        StringBuffer str = test(string);
        System.out.print(string==str);System.out.println(string);
    }

   这段程序和上个程序的区别是使用了StringBuffer对象,这时就是一个按引用传递了。即,当把string赋值给str的时候,并没有在堆内存当中再创建一个string的复制对象,而是简单的把 string的地址赋给str,所以此时string和str会指向同一个堆内存地址,所以,对任何一个的修改都会影响到另一个。就好比,两个人合起来花一百块钱,谁多花了都会影响到另一个人,因为是共有的。由此可以猜到改程序的打印结果:true   helloworld。

 

      现在就有一个问题,如果有两个基本类型的变量,int a 和 int b,如何通过一个方法将他们的顺序进行交换?答案好像是不行。如果你把a和b传递给某个方法作为参数,那么会在堆内存当中复制一个a和b,也就是新的a和b的任何修改不会影响到原来的。所以,交换两个变量的顺序就只能在方法内部有效。

分享到:
评论

相关推荐

    11.java参数传递.zip

    11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...

    13.java参数传递之引用传递.zip

    13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....

    58.java参数传递机制.zip

    58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...

    java方法的参数传递其二.docx

    在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 在 Java 中,引用类型包括类、接口、数组等,都是对象的引用。这些引用类型在传递过程中,会将对象的引用传递给方法体内的变量,而不是对象的副本。因此...

    Java参数传递PPT

    Java参数传递机制是编程中的重要概念,尤其是在Java中,它对于理解如何在方法间操作数据至关重要。本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。...

    JAVA反射参数传递概略

    在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...

    Jni中C++和Java的参数传递

    在涉及到C++和Java之间的参数传递时,有一些特定的规则和技巧需要注意。 首先,我们要理解Java对象和C++数据类型的映射关系。在JNI中,Java的基本数据类型如`boolean`, `byte`, `char`, `short`, `int`, `float`, `...

    Java参数传递的经典示例

    Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...

    java传递参数的方法

    java传递参数的方法 很的东西 大家下载学习一下

    java参数传递

    这里详细的说明了,java参数传递的过程,引用传递,值传递

    Jni中C和Java的参数传递.doc

    总结一下,JNI 参数传递的关键点包括: 1. **类型映射**:Java 和 C++ 的数据类型不同,需要使用 JNI 提供的类型映射,如 `jint`、`jstring` 等。 2. **字段访问**:使用 JNI 的 `GetFieldID` 和 `GetObjectField`...

    62.java引用类型的参数传递.zip

    62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....

    59.java基本类型的参数传递.zip

    59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....

    java中参数传递的演示

    java中参数传递的演示,分析传值与传引用的区别

    JAVA语言中参数传递的深入剖析.pdf

    Java语言中参数传递的深入剖析 Java语言中参数传递的机制是一个复杂的主题,对于初学者来说,参数传递机制是一个难点。许多教材、论文和帮助手册对Java语言中参数传递的机制进行了探讨,但这些说法不一,有些模糊带...

    java参数的传递与返回值

    #### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。...

    java中参数传递方式详解

    Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论...Java 参数传递机制详解,揭开了 Java 中的参数传递机制的奥秘,详细分析了基本类型和对象作为参数传递的机制,并揭开了对象作为参数传递的迷惑。

    java中传递数组参数

    1. **直接传递数组:** 在Java中,当我们想要将一个数组作为参数传递给某个方法时,只需要在方法的参数列表中指定数组类型即可。 ```java public void someMethod(int[] array) { // 方法体 } ``` 上述代码...

    Java的引用和函数参数传递

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

Global site tag (gtag.js) - Google Analytics