java中对象作为参数传递一般是引用传递,基本变量传值方式是值传递。但是字符串作为一个对象传递却意外的是值传递。
先定义值传递意义:就是将原先的基本变量或者引用拷贝一份,作为参数传递给函数。特点是当函数里面对该基本变量做修改后只对副本起作用,对原先的基本变量或者引用指向的对象不起作用。
引用传递的意义:将指向对象的引用变量(地址值)复制一份传递给函数,而不是对象本身,传递的是引用变量的副本。这样一来函数对引用指向的对象的所有改变就是对原先的对象的直接改变。
下面是一个实验,分别探究对字符串,普通对象,基本变量作为参数传递给函数的到底是值传递还是引用传递。
package com;
public class Zhi {
public Zhi(){}
//对应输出字符串没有改变,是值传递。
static void pass(String a){
a = "改变字符串的方法生效了";
}
//对应对象的原先属性改变了,是引用传递。
static void pass(A a){
a.age = 100;
}
//对应基本类型变量的原先值没改变,值传递。
static void pass(int a){
a = 222;
}
//对应原先数组的值没有改变,是值传递。
static void pass(int[] a){
a[0]= 99;
}
public static void main(String[] args) {
String first = "原先的字符串";
String second = new String("原先的字符串");
A a = new A();
int bInt = 0 ;
int[] intArray = {0,1,2,3};
System.out.println(" 最开始字符串量:"+first+
" ---最开始类A的成员变量age值:"+a.age+
" ---最开始整数值:"+bInt+
"----最开始数组第一个元素值:"+intArray[0]);
Zhi.pass(first);
Zhi.pass(a);
Zhi.pass(bInt);
Zhi.pass(intArray);
System.out.println("经过方法pass后字符串量:"+first"|”+second+
"---经过方法pass后类A的成员变量age值:"+a.age+
"---经过pass方法后的整数值:"+bInt
+
"----经过pass方法后数组第一个元素值:"+intArray[0]);
}
}
输出结果:
最开始字符串量:原先的字符串|原先的字符串
—最开始类A的成员变量age值:0
—最开始整数值:0
—最开始数组第一个元素值:0
经过方法pass后字符串量:原先的字符串|原先的字符串
—经过方法pass后类A的成员变量age值:100
—经过pass方法后的整数值:0
----经过pass方法后数组第一个元素值:99
总结:在java中一般对象(包括数组)作为参数是引用传递,但是字符串是被当做值传递(划重点);基本类型变量当做值传递。
对于类似代码块,比如for,while等内部使用外部变量时候,都是直接对外部变量进行修改,此时考虑的是变量作用域的问题,而不是值传递还是引用传递问题。