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:引用的副本进行了交换,而非原引用
分享到:
相关推荐
JAVA 参数传递方式实例浅析【按值传递与引用传递区别】 JAVA 参数传递方式实例浅析【按值传递与引用传递区别】是 JAVA 编程语言中的一种基本概念,对于 JAVA 开发者来说是非常重要的。本文将通过实例形式分析 JAVA ...
11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java参数传递.zip11.java...
13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递.zip13.java参数传递之引用传递....
58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递机制.zip58.java参数传递...
Java中参数传递方式详解 Java 中参数传递方式详解是 Java 新手入门面临的一个经典的话题。本文意在终结这个话题,Java 中有说法:Java 里面参数传递都是按值传递,怎么理解这句话? 按值传递和按引用传递是来自 ...
本PPT深入探讨了这一主题,旨在帮助学习者彻底理解Java中的参数传递方式。 首先,我们要回顾面向对象的基本概念。在Java中,类(Class)是对象的蓝图,它定义了对象可能具有的属性(如name、age、gender)和方法...
这里详细的说明了,java参数传递的过程,引用传递,值传递
Java参数传递机制是编程中非常重要的概念,它涉及到基本类型和引用类型的差异。在Java中,参数传递主要有两种方式:值传递(Value Passing)和引用传递(Reference Passing)。虽然Java官方文档并未明确提及引用传递...
### 关于Java中的传递方式详解 #### 一、引言 在Java编程中,了解数据是如何在函数间传递的是至关重要的。这对于理解程序的行为、调试以及优化代码都非常关键。Java支持两种基本的数据传递方式:值传递和引用传递...
Java 参数传递机制详解 Java 中的参数传递机制是一个经久不息的讨论话题,究竟是“传值”还是“传引用”,双方各执一词,互不相让。本文将通过详细的分析和实例,揭开 Java 参数传递机制的奥秘。 基本类型作为参数...
Java 方法参数传递之引用类型 Java 方法参数传递是 Java 编程语言中的一种基本机制,在方法调用时将参数传递给方法体内的变量,但是在传递过程中,参数的类型会对传递结果产生影响。在本文中,我们将讨论 Java 方法...
Java 参数传递机制是编程中的重要概念,尤其是在Java中,它涉及到“值传递”和“引用传递”的理解。这里我们将深入探讨这两个概念,并结合给定的示例代码进行解析。 首先,我们看“值传递”。在Java中,基本类型...
#### 一、Java参数传递的基本概念 在Java中,方法(或称为函数)可以通过参数来接收外部的数据,并且能够返回处理后的结果。参数的传递方式主要有两种:值传递(Pass-by-value)和引用传递(Pass-by-reference)。...
java的参数传递对比,体现了值传递和引用传递的区别,是我在java入门是写的学习demo
62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递.zip62.java引用类型的参数传递....
59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递.zip59.java基本类型的参数传递....
在Java中,有两种基本的参数传递方式:值传递和引用传递。值传递是将变量的副本传递给方法,而引用传递则是传递变量指向的对象引用。对于基本类型,Java总是使用值传递;而对于对象,实际上是引用的复制,但仍然保持...
当把数组作为参数传递给方法时,传递的实际上就是数组对象的引用。 Java 可变参数是指在方法中可以传递同类型的可变参数,JDK 1.5 开始支持这种特性。可变参数可以使得方法更加灵活、方便使用。可变参数的使用规则...
Java参数传递机制是一个常见的面试问题,它涉及到Java语言的基础特性。Java中参数传递的方式有两种理解:值传递和引用传递,但这两种说法实际上是对同一种机制的不同角度的描述。下面将详细解释这两种理解方式。 ...
java传递参数的方法 很的东西 大家下载学习一下