参数传递(值传递与引用传递)

转:https://www.cnblogs.com/xiaotiaosi/p/6377248.html

按值传递和按引用传递。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。

1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递(引用传值传递的是原始值的内存地址,其实也是一种按值传递)
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

public class ParamterE2 {

    public static class ParamterE3{
        public String name="xiaotiaosi";
    }

    public static void run(ParamterE3 paramterE3,String a,int b){
        ParamterE3 paramterE=paramterE3;
        paramterE.name="xiaohua111";
        a="girl";
        b=1;
    }

    public static void main(String[] args) {
        ParamterE2 paramterE2=new ParamterE2();
        ParamterE3 paramterE3=new ParamterE3();
        String a="boy";
        int b=0;
        paramterE2.run(paramterE3,a,b);
        System.out.println(paramterE3.name+" "+a+" "+b);
    }
}

程序运行的结果为: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";,故执行后和执行前值没有改变。

猜你喜欢

转载自www.cnblogs.com/toSeeMyDream/p/12969318.html