Java到底是传值还是传引用?相信很少有人能完全回答正确。通常的说法是:对于基本数据类型(整型、浮点型、字符型、布尔型等),传值;对于引用类型(对象、数组),传引用。基本类型传值,所有人都不会对此有疑义;问题出在引用类型上。
为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛?
/**
* @(#)Swap.java
*
*
* @author
* @version 1.00 2007/1/5
*/
public class Swap {
public Swap() {}
public static void main(String[] args) {
Changer c = new Changer();
String stra = " Mighty " ;
String strb = " Mouse " ;
c.swap(stra, strb);
System.out.println(stra + " " + strb);
String[] strArr = new String[ 2 ] ;
strArr[ 0 ] = stra;
strArr[ 1 ] = strb;
c.swap(strArr);
System.out.println(strArr[ 0 ] + " " + strArr[ 1 ]);
}
static class Changer {
public < T > void swap(T a, T b) {
T temp = a;
a = b;
b = temp;
}
public < T > void swap(T[] t) {
if (t.length < 2 ) {
System.out.println( " error! " );
return ;
}
T temp = t[ 0 ];
t[ 0 ] = t[ 1 ];
t[ 1 ] = temp;
}
}
}
上面程序的正确运行结果为:
Mighty Mouse
Mouse Mighty
你答对了嘛?
下面我们来分析一下:为什么会出现上面的运行结果?
为分析这个问题,我们必须对程序中的数据在内存中的布局有一定了解。上面main程序中和String相关的变量共有3个,其布局可以用下图所示:
当调用swap(stra, strb)函数时,传递的是引用类型stra、strb的拷贝值,因此函数中任何对参数的改变都不会影响到stra和strb的值;而调用swap(strArr)时,传递的是strArr的拷贝值,程序中对参数的任何改变仍然不会影响到strArr的值,然而swap(T[] t)中改变的并不是strArr的值,而是strArr[0]和strArr[1]的值,也就是引用类型strArr所指向的对象的值,因而strArr[0]和strArr[1]的值发生了变化。
从上面的分析,我们可以得出结论:对于引用类型,其实参数传递时仍然是按值传递的;当然,按引用传递也不是完全没有道理,只是参考对象不是引用类型本身,而是引用类型所指向的对象。
- 大小: 4.4 KB
分享到:
相关推荐
在Java编程语言中,函数调用时的参数传递方式有两种:传值(Passing by Value)和传引用(Passing by Reference)。虽然Java官方文档中并未明确指出有传引用这一概念,但在实际操作中,Java的行为类似于传引用,尤其...
"java中传值还是传引用的认识" Java 中的参数传递是值传递还是引用传递?这是一个经常引发讨论的问题。在 Java 中,参数传递是按值传递的,也就是说,传递给方法的参数是一个副本,而不是原始值本身。 当一个对象...
理解Java中的传值与传引用对于编写正确且预期的行为代码至关重要。在编写函数时,应清楚地知道参数如何被传递,以及这将如何影响函数的可读性和行为。在实际编程中,合理运用这些知识能帮助避免许多常见的错误和困惑...
本文将深入探讨Java中的传值与传引用问题,并通过具体的例子来解析其中的原理。 #### 二、基础知识回顾 在Java中,所有的数据类型可以分为两大类:基本类型(如int, double等)和引用类型(如Object, String等)。...
JAVA传值与传引用[整理].pdf
### Java是传值还是传址引用 #### 一、简单类型是按值传递的 Java在处理简单数据类型(如int、boolean等)时采用的是按值传递的方式。这意味着当你将一个简单类型的值作为参数传递给一个方法时,实际上传递的是这...
"Java中的传值与传引用实现过程解析" Java中的传值与传引用是Java编程语言中的一种基础概念,它们是Java函数中参数传递的两种方式。 Java中的传值是指函数参数的值被复制到函数内部,在函数内部对参数的修改不会...
### Java及C++中传值传递、引用传递和指针方式的理解 在程序设计语言中,函数调用时参数的传递方式对理解程序的行为至关重要。本文将深入探讨Java与C++这两种广泛使用的编程语言中参数传递的方式,包括值传递、引用...
引用类型包括类(classes)、接口(interfaces)、数组以及委托(delegates),它们在内存中的存储方式与值类型截然不同。对于引用类型,变量存储的是一个指向对象内存地址的引用,而非对象本身。因此,当我们将一个...
本篇文章将深入探讨Java中的方法传值和传引用问题。 首先,让我们理解什么是传值。在Java中,基本数据类型(如int, double, char等)和字符串(String类)的参数传递方式被称为传值。这意味着当一个变量作为参数...
- **通过JSP表达式语言(EL)**:使用EL表达式,如 `${javaVariable}`,可以直接在JavaScript代码中引用JavaBean或作用域内的变量。 2. **JavaScript到Java的传值**: - **表单提交**:通过JavaScript修改表单字段的...
许多人认为对象是按引用传递,而实际上,Java总是按值传递,包括对象。这里的“值”指的是对象的引用,而不是对象本身。这与C++或C#等其他语言中对象的传递方式有所不同。 首先,我们需要理解Java中的引用概念。当...
根据标题和描述,我们将深入探讨Java中传值与引用的区别,以及它们在实际编程中的应用。 首先,Java是一种“总是按值传递”的语言。这意味着无论是基本类型还是引用类型,当作为参数传递时,都会有一个副本被创建并...
在实际开发中,Java的这种行为有时会引发混淆,特别是在多线程环境中,需要特别注意共享对象的引用问题,以防止并发修改导致的错误。此外,理解这一特性也能帮助我们更有效地利用局部变量和方法参数,避免不必要的...
当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1. `Circle.java` 文件定义了一个名为 `Circle` 的类,它包含一个 `double` ...
本文将通过一个具体的例子来深入探讨Java中的传值与传引用的区别,并解释如何利用这一特性来更好地管理程序的状态。 #### 1. 传值与传引用的概念 在Java中,基本数据类型(如int、char等)的参数传递遵循“传值”...
在编程语言中,传值与传地址是两种不同的参数传递方式。Java 作为一门面向对象的语言,对于简单类型和对象类型的处理方式有所不同。本文将详细解释这两种类型在Java中的传递机制。 1. 简单类型(按值传递) Java中...
总结起来,理解传值、传名(或传引用)和传地址的异同是编程基础的重要组成部分。它们影响着函数的可读性、效率以及程序的行为。在编写代码时,根据具体需求选择合适的参数传递方式,是提升代码质量的关键。