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

Java参数的传递方式

阅读更多

Java参数的传递到底是以什么方式进行的,这个问题比较让我困扰。

有人说Java只有按值传递,但这种解释太过含糊,对于基本类型完全适用,但牵扯到对象,解决不了实际问题。

前几日,看到一篇英文文章,对这个事情解释的很清楚,转过来,顺便翻译一下。

 

===========我是分割线==========

Java通过对象的引用来操纵对象,并且对象的所有变量也是引用。但是,Java参数的传递不是通过引用传递的,而是通过值传递。

以交换函数badSwap()为例:

public void badSwap(int var1, int var2)   
{ 
 int temp = var1;   
 var1 = var2;   
 var2 = temp;  
}

 当badSwap()返回时,作为参数传递进出的两个变量仍保持原来的值。如果把参数类型由int换成Object,方法仍然无效,因此得出Object也是按照值进行传递而非引用。下面就解释其微妙之处。

 

public void tricky(Point arg1, Point arg2)   
{   
  arg1.x = 100;   
  arg1.y = 100;   
  Point temp = arg1;   
  arg1 = arg2;   
  arg2 = temp;   
}   
public static void main(String [] args)   
{   
  Point pnt1 = new Point(0,0);   
  Point pnt2 = new Point(0,0);   
  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y);    
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);   
  System.out.println(" ");   
  tricky(pnt1,pnt2);   
  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y);    
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);     
}   

 执行main()函数,我们将看到以下结果:

 X: 0 Y: 0  
 X: 0 Y: 0  
 X: 100 Y: 100  
 X: 0 Y: 0  

 方法成功改写了ptn1的值, 但是pnt2和pnt1没有成功交换。这就是困扰的主要原因。在main()函数中,pnt1和pnt2仅仅是对象的引用,当你把pnt1和pnt2作为参数传递给tricky()方法时,Java就把这个引用像传递其他参数一样,按照值进行传递,这意味着传递给函数的参数是原引用(original reference)的一个新副本(method reference)。图1就展示了,当Java把参数传递给函数后,这两个引用指向同一个对象

图1:当Java把参数传递给函数后,这两个引用指向同一个对象

Java复制并按值传递引用,而非对象本身。因此,原引用指向原对象时,方法就能改变原对象的值。如果引用仅是一个副本,则交换函数失效。如图2所示引用的副本进行了交换,而非原引用。方法被调用后,得到的是没有进行交换的原引用。可以在函数体外对原引用进行交换,以实现成功的交换。

图2:引用的副本进行了交换,而非原引用

 

分享到:
评论

相关推荐

    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参数传递方式实例浅析【按值传递与引用传递区别】

    主要介绍了JAVA参数传递方式,结合实例形式分析了java按值传递与引用传递区别及相关操作注意事项,需要的朋友可以参考下

    Java参数传递PPT

    关于Java参数传递的PPT,详细介绍参数传递的类型。彻底理解Java只有唯一传递方式——值传递。

    java参数传递

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

    java中参数传递方式详解

    主要介绍了java中参数传递方式详解的相关资料,需要的朋友可以参考下

    java参数传递 java 参数.doc

    java参数传递 java 参数

    Java参数传递的经典示例

    Java参数传递的经典教学PPT,引用类型,基础类型传递的区别,String和StringBuffer类型传递的区别。

    java 参数传递

    传值还是传引用 详细讲解JAVA参数传递机制 一目了然

    java参数传递学习demo

    java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo

    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方法的参数传递其二.docx

    介绍java 方法的参数传递,本文是引用传递。

    java传递参数的方法

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

    Java的引用和函数参数传递

    Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递Java的引用和函数参数传递

    Java数组传递及可变参数操作实例详解

    主要介绍了Java数组传递及可变参数操作,结合实例形式详细分析了java数组参数传递与可变参数相关使用技巧,需要的朋友可以参考下

    Java零基础-参数传递-1.md

    读者将学习Java中方法调用时的参数传递方式,并分别介绍基本类型和引用类型在参数传递过程中的特点和区别。 能学到什么: 学习Java中方法调用时的参数传递方式。 理解基本类型和引用类型在参数传递过程中的特点和...

    Java零基础-参数传递-2.md

    读者将学习Java中方法调用时的参数传递方式,并重点探讨基本类型和引用类型在参数传递过程中的特点和区别。此外,我们还将介绍可变参数和返回值的使用方法。 能学到什么: 学习Java中方法调用时的参数传递方式。 ...

Global site tag (gtag.js) - Google Analytics