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中传值与传引用,详细讲解java中的传值与传引用
Java 是传值还是传引用,问题主要出在对象的传递上,因为 Java 中简单类型没有引用。既然争论中提到了引用这个东西,为了搞清楚这个问题,我们必须要知道引用是什么。 简单的说,引用其实就像是一个对象的名字...
java中传值还是传引用的的认识? 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
java传值所用的基本方法与java传值时是传引用还是传值
JAVA传值与传引用[整理].pdf
Java是传值还是传址引用
传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设 计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指 针。
java及C++中传值传递、引用传递和指针方式的理解.docx
引用类型不像值类型传值那样直接,那么引用类型是怎么样传值的呢?答案就在此文档中。
主要介绍了java中的传值与传引用实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
Java到底是传引用还是传值Java开发Java经验技巧共3页.pdf.zip
java 传值还是传引用?代码一目了然,代码中可以测试研究 到底传得什么
主要是对Java方法传值和传引用问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参本,函数对形参的操作并不
Java中引用类型传值的代码清单.pdf 学习资料 复习资料 教学资源
很多初学者比较疑惑的地方,看看绝对有帮助的。帮你打好Java的基础知识
通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能直接使用传引用调用,但是可以通过数组的方式模拟传引用...
第一次使用int实验: public class TTEST { private static List<UserEntity> mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a);...
Java中变量的传递,是传值,还是传引用? 之前我对这个"经典"问题,认识很不深刻,直到我在项目中遇到类似下面的问题: 示例A: <SPAN xss=removed>List<Person> perList = new ArrayList(); for (int i...