Java中的参数传递
Java中没有真正的引用传递 只有值传递 传引用参数指的还是原来的那个引用,但是Java里面参数类型是对象时是复制了原来的引用到一块新的内存,两者之间没有关系
1按值传递
在方法调用时,传递的参数按值的拷贝传递
public class TempTest
{
private void test1(int a)
{
a = 5;
System.out.println("test1方法中的a="+a);
}
public static void main(String[] args)
{
TempTest t = new TempTest();
int a = 3;
t.test1(a); //传递后,test1方法对变量值的改变不影响这里的a
System.out.println(”main方法中的a=”+a);
}
}
运行结果是: test1方法中的a=5 main方法中的a=3
按值传递重要特点:传递的是值的拷贝,也就是说传递后就互不相关了。
2按引用传递
在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。
public class TempTest
{
private void test1(A a)
{
}
public static void main(String[] args)
{
TempTest t = new TempTest();
A a = new A();
t.test1(a); //这里传递的参数a就是按引用传递
}
}
class A
{
public int age = 0;
}
3按引用传递的重要特点
传递的是值的引用,也就是说传递前和传递后都指向同一个引用(也就是同一个内存空间)。
public class TempTest
{
private void test1(A a)
{
a.age = 20;
System.out.println("test1方法中的age="+a.age);
}
public static void main(String[] args)
{
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test1(a);
System.out.println(”main方法中的age=”+a.age);
}
}
class A
{
public int age = 0;
}
图解
此时A实例的age值的变化是由test1方法引起的
运行结果如下: test1方法中的 age=20 main方法中的 age=20
对上述代码稍作改变
能不能让按照引用传递的值,相互不影响呢?就是test1方法里面的修改不影响到main方法里面呢?
方法是在test1方法里面新new一个实例就可以了。改变成下面的例子,其中第3行为新加的:
public class TempTest {
private void test1(A a){
a = new A();//新加的一行
a.age = 20;
System.out.println("test1方法中的age="+a.age);
}
public static void main(String[] args) {
TempTest t = new TempTest();
A a = new A();
a.age = 10;
t.test1(a);
System.out.println(”main方法中的age=”+a.age);
}
}
class A{
public int age = 0;
}
图解
这个时候test1方法中的变量a的age被改变,而main方法中的是没有改变的
运行结果为: test1方法中的age=20 main方法中的age=10
以上就是两种参数传递,
需要注意的是,引用传参由于指向同一片内存空间
所以方法体中的参数有可能改变内存空间的数值
导致main方法中的参数同样改变
总结
(1):“在Java里面参数传递都是按值传递”这句话的意思是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值传递。
(2):在Java里面只有基本类型和按照下面这种定义方式的String是按值传递,其它的都是按引用传递。就是直接使用双引号定义字符串方式:String str = “Java私塾”;
版权声明:本文为CSDN博主「散仙一个」的原创文章