参数传递(值传递与引用传递)
按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递(引用传值传递的是原始值的内存地址,其实也是一种按值传递)
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
1 public class ParamterE2 {
2
3 public static class ParamterE3{
4 public String name="xiaotiaosi";
5 }
6
7 public static void run(ParamterE3 paramterE3,String a,int b){
8 ParamterE3 paramterE=paramterE3;
9 paramterE.name="xiaohua111";
10 a="girl";
11 b=1;
12 }
13
14 public static void main(String[] args) {
15 ParamterE2 paramterE2=new ParamterE2();
16 ParamterE3 paramterE3=new ParamterE3();
17 String a="boy";
18 int b=0;
19 paramterE2.run(paramterE3,a,b);
20 System.out.println(paramterE3.name+" "+a+" "+b);
21 }
22 }
程序运行的结果为:xiaohua111 boy 0
原始对象内的成员变量name的值改变,原始String类型的变量a 和原始int类型的变量b值没有发生改变。
说明:
1.对象就是传引用
2.原始类型就是传值(boolean 、char、byte、short、int、long、float、double)
3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。
注:通过查资料发现String类型比较特殊,在Java中,String是一个引用类型,但是在作为参数传递的时候表现出来的却是基本类型的特性。
原因:首先我们看一下String类的实现,String类是通过private final char value[]数组实现的,从给的数组我们能够发现这个char[]数组使用了final关键字修饰,也就意味着,这个String类型的对象不可变,那么就有人要问了,既然不可变,那么我们如何修改字符串的值喃?例如:String str="xiaotiaosi321";如何将已创建的字符串对象修改成"xiaoshuaige321",首先我想给你们扫除一个误区,String类创建的字符串对象是不可变的,也就是修改不了的,哪有人就要问了,为啥str="xiaoshuaige321";语句好使啊,首先str并不能完全代表String类创建的字符串对象,str只是一个字符串变量的引用,str="xiaoshuaige321";语句只是将str引用指向了"xiaoshuaige321"字符串对象,相当于str=new String("xiaoshuaige321"); ,所以当String作为传参类型时,在方法中进行了字符串引用的重新复制时,只是将引用指向了新的对象,并没有对原始的对象进行修改,当方法执行完毕之后,作为虚拟机栈中局部变量都会被销毁,方法一些操作被还原,str引用重新指向"xiaotiaosi321";,故执行后和执行前值没有改变。