`
anna_zr
  • 浏览: 200556 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Java参数传递机制

阅读更多
在方法调用时,需要根据方法声明传入适当的参数,通过每次调用方法时传参,极大的增强了方法的统一性,避免了方法内部功能代码的重复。但是在实际传递参数时,如果在方法内部修改了参数的值,则调用时使用的变量是否发生改变呢?

         例如如下代码:

                   /**

* 参数传递代码示例

*/

public class TransferValueDemo {

                            public static void main(String[] args) {

                                      int m = 10;

                                      int[] a = {1,2,34};

                                      test(m,a);

                                      System.out.println(m);

                                      System.out.println(a[0]);

                            }       

                            public static void test(int n,int[] t){

                                      n = 0;

                                      t[0] = 123;

                            }

}

         则执行该程序以后,程序的输出结果是:10  123。则在调用test方法时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值发生了改变呢?下面就来说明该问题。

         在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是:

l  按值传递(by value)

按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。

说明:使用该方式传递的参数,参数原始的值不发生改变。

l  按址传递(by address)

按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。

说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。

         在Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示:

l  按值传递的数据类型:八种基本数据类型和String(这样理解可以,但是事实上String也是传递的地址,只是string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址。关于String的特殊性见本博客的String类深入解析)。

l  按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口

按照这里的语法规则,则上面的代码中变量m的类型是int,属于按值传递,所以在方法内部修改参数的值时m的值不发生改变,而a的类型是数组,属于按址传递,所以在方法内部修改参数的值时,原始的值发生了改变。

按值传递和按址传递在实际使用时,需要小心,特别是在方法内部需要修改参数的值时。有些时候,对于按值传递的参数需要修改参数的值,或者按址传递时,不想修改参数的值,下面是实现这两种方式时的示例代码。

按值传递时通过返回值修改参数的值:

         /**

* 按值传递的类型通过返回值修改参数的值

*/

public class TransferValueDemo1 {

                  public static void main(String[] args) {

                            int m = 10;

                            m = test1(m);  //手动赋值

                            System.out.println(m);

                  }

                  public static int test1(int n){

                            n = 15;

                            return n;

                  }

}

         在该示例代码中,通过把修改以后的参数n的值返回,来为变量m赋值,强制修改按值传递参数的值,从而达到修正参数值的目的。

         按址传递时通过重新生成变量避免修改参数的值:

                  /**

* 按址传递时通过重新生成变量避免修改参数的值

*/

public class TransferValueDemo2 {

                            public static void main(String[] args) {

                                      int[] a = {1,2,3};

                                      test2(a);

                                      System.out.println(a[0]);

                            }       

                            public static void test2(int[] m){

                                      int[] n = new int[m.length];

                                      for(int i = 0;i < m.length;i++){

                                               n[i] = m[i];

                                      }

                                      n[0] = 10; 

                            }

}

         在该示例代码中,通过在方法内部创新创建一个数组,并且把传入数组中每个参数的值都赋值给新创建的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,原来的参数内容就不发生改变了。

         这里系统介绍了Java语言中参数传递的规则,深刻理解这些规则将可以更加灵活的进行程序设计。例如使用复合数据类型按址传递的特性可以很方便的实现多参数的返回,代码示例如下:

                   public int test3(int[] m,int[] n){……}

         则该方法中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数传递的一种基本使用,在JDK提供的API文档中也大量的存在该方法。

/////////////////////////////////////////////////////////////////////////////
当是对象时,方法取得的是引用的copy。swap(obj   a,obj   b)  
  调用是swap(c,d),就是对象a,b的引用进行了复制。引用a和c都指向同一对象,引用b和d都指向同一对象。如果Integer有setValue方法没有问题,但可惜没有,用int   t=p.intValue能取得对象的值,但还是不能交换。如果创建新对象,影响的只是c和d,不会影响a,b。

注意JAVA和VC的区别,JAVA没有指针,因此在无论方法中的形参怎样变化,方法外的实参不受影响。(这句话也不完全对)

string对象和其他对象是不同的,string对象是不能被改变的,内容改变就会产生新对象。那么StringBuffer就可以了,但只是改变其内容。不能改变外部变量所指向的内存地址。
分享到:
评论

相关推荐

    58.java参数传递机制.zip

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

    Java参数传递PPT

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

    java 参数传递

    Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论话题,究竟是“传值”还是“传引用”,双方各执一词,互不相让。本文将通过详细的分析和实例,揭开 Java 参数传递机制的奥秘。 基本类型作为参数...

    Java参数传递的经典示例

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

    Java方法参数传递机制原理解析

    Java方法参数传递机制原理解析 Java方法参数传递机制是指在Java中,方法调用时传递参数的机制。参数传递机制可以分为两种:值传递和引用传递。 值传递是指基本数据类型的参数传递,值传递的体现是数值的传递。在值...

    java参数传递 java 参数.doc

    Java 参数传递机制是编程中的重要概念,尤其是在Java中,它涉及到“值传递”和“引用传递”的理解。这里我们将深入探讨这两个概念,并结合给定的示例代码进行解析。 首先,我们看“值传递”。在Java中,基本类型...

    java参数传递时到底是值传递还是引用传递分享.pdf

    Java参数传递机制是一个常见的面试问题,它涉及到Java语言的基础特性。Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 ...

    java参数传递(经典).docx

    Java参数传递机制是一个经常引起讨论的话题,尤其是在初学者和经验丰富的开发者之间。Java中参数传递的基本原则可以总结为:对于所有类型的参数,Java总是进行值传递。然而,对于基本类型和对象引用,"值传递"的概念...

    java参数传递

    清晰的描述java参数传递机制,有效地帮助不管是java初学者还是高手解决参数传递疑惑。

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

    Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法参数传递中的引用类型传递。 ...

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

    本文对Java语言中参数传递机制进行了深入的剖析,首先从Java的变量内存分配机制开始,对不同的参数传递机制进行了分析,并得出了最合理的结论。 Java语言中参数传递机制可以分为两种情况,即按值传递和引用传递。按...

    方法的参数传递机制测试类

    方法的参数传递机制测试类,以供大家交流之用。

    java基础面试题方法的参数传递机制

    java基础面试题方法的参数传递机制本资源系百度网盘分享地址

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

    Java中的参数传递机制是一个经常引起讨论的话题,尤其是在面试和学习过程中。Java的参数传递方式实际上是一种特殊的"值传递",通常被称为"按引用传递对象的引用",这与C++等语言中的引用传递有所不同。以下是对这个...

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

    本文将深入探讨Java中的参数传递机制,并通过具体的代码示例和内存分配图解来帮助读者理解按值传递和按引用传递的概念。 #### 二、按值传递的概念与特点 按值传递是指在函数或方法调用过程中,传递给函数或方法的...

    利用ASP实现JAVA动态参数的传递

    然而,在Java程序与Web页面之间建立有效的参数传递机制,尤其是对于那些不可预知或经常变化的动态参数,成为了一项挑战。传统的手动修改HTML代码来更新参数的方式不仅效率低下,而且容易出错,尤其是在参数频繁变化...

    Java方法的参数传递机制实例详解

    Java方法的参数传递机制实例详解 Java中的参数传递机制是值传递的,也就是说当将一个参数传递给一个方法时,方法接收的是原始值的一个副本。按值传递意味着方法可以修改副本,但是原始值保持不变。在Java中,基本...

    1Z0-808 甲骨文JAVA认证考试 2023真题

    1. Java参数传递机制:在Java中,对象是按引用传递的,而基本类型是按值传递的。这意味着,当我们将一个对象传递给一个方法时,实际上是传递了对象的引用,而不是对象本身。 2. Java中的静态和非静态成员:在Java中...

Global site tag (gtag.js) - Google Analytics