Java 中的传值与传引用

Java 函数中的传值和传引用问题一直是个比较“邪门”的问题,其实 Java 函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中修改参数值时,无论是基本类型的参数还是引用类型的参数,修改的只是该参数的拷贝,不影响函数实参的值,如果修改的是引用类型的成员值,则该实参引用的成员值是可以改变的,例子如下

class Model {
    public int i = 0;
    public String s = "no value";

    public static void changeInt(int i) {// 改变int型变量的函数
        i = 100;
    }

    public static void changeString(String s) {// 改变String型变量的函数
        s = "changeString";
    }

    public static void changeModel(Model model) {// 改变Model型变量的函数
        model = new Model();
        model.i = 1;
        model.s = "changeModel";
    }

    public static void changeModel2(Model model) {// 改变Model型变量的成员的函数
        model.i = 1;
        model.s = "changeModel";
    }

    // 测试程序
    public static void main(String[] args) {
        int i = 0;
        String s = "hello";
        Model model_1 = new Model();
        Model model_2 = new Model();

        changeInt(i);
        System.out.println("i = " + i);
        changeString(s);
        System.out.println("s = " + s);
        changeModel(model_1);
        System.out.println("model_1.s = " + model_1.s);
        changeModel2(model_2);
        System.out.println("model_2.s = " + model_2.s);
    }
}

测试结果

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe"
i = 0
s = hello
model_1.s = no value
model_2.s = changeModel

Process finished with exit code 0

可以看出i没有改变,s 也没有改变,model_1 也没有改变,model_2的 s 改变了。

总结

Java 中的形参是复制实参的一份拷贝(在栈中的拷贝,对于引用型则是复制引用的拷贝),所以在函数中改变形参是无法改变实参的值的,改变引用只是将形参所代表的引用指向另外的新的对象,而实参的引用还指向原来的对象,改变形参引用的成员当然会影响实参引用成员的值,因为他们的引用都指向同一个对象。

转自:https://www.cnblogs.com/zhangj95/p/4184180.html

原文地址:https://www.cnblogs.com/n031/p/11660767.html

时间: 2024-11-09 03:57:12

Java 中的传值与传引用的相关文章

Java中的传值与传引用

曾经对java中传值还是传引用的问题十分困惑,而且也被问到过许多次,无论是面试,还是平时我们平时的讨论中. 在stackoverflow上面浏览时,无意中发现了跟这个问题有关的论题,于是深入地查看了,感觉获益匪浅,于是结合自己过去的经验,写了这篇博客跟大家分享. 以前我觉得是这样的,java中的基本数据类型和String是传值的,而其它的类类型的数据则是传引用的.不过现在我觉得不是这样的. *****************************************************

(转)java 中的 传值 与 传址

在一些面试企业的过程当中 ,很多人看重于基础的考核.其中,传值与传地址 就是一种基础能力考核的关键,这里我总结了 5种很典型的例子 ,最后做了一个总结 首先是8种基本数据类型 下面用 int 类型 做例子 属于传值 public static void method1(int i) { i= i+10; System.out.println("在方法内的值"+i); } public static void main(String[] args) { int i =5; method1

(转) java 函数形参传值和传引用的区别.

(一)基本数据类型:传值,方法不会改变实参的值. [java] view plain copy public class TestFun { public static void testInt(int i){ i=5; } public static void main(String[] args) { int a=0 ; TestFun.testInt(a); System.out.println("a="+a); } } 程序执行结果:a=0 . (二)对象类型参数:传引用,方法

python中函数传值与传引用

python中函数整数,字符串,元组都是传值,函数中不会改变其值,其他的会在函数中改变其值 例如传列表: #-*-ecoding:UTF-8 -*- def fun(a):     a[0]="sss";     print a     print id(a)     return ; a=["a","b"]; fun(a); print a; print id(a) 列表中的值已经改变,但列表的地址没有改变

Java中传值和传引用

今天看了Java中的传值和传引用,对于这一块开始的时候不太能理解,通过查阅其他几篇blog,将自己的理解记录下来: 比较好的几篇blog:http://blog.csdn.net/houpuhope/article/details/7449377; 首先对于传值和传引用需要有一个初步的理解就是,通过传值的方式传进来的参数修改了,对原变量并没有什么影响: 而,通过传引用的方式修改的,原变量值也跟着改变.下面进行详细的解析: 1.对于基本类型Java是按照传值传递的: public class Te

Java经典问题:传值与传引用?

转自:http://developer.51cto.com/art/201104/254715.htm Java到底是传值还是传引用?相信很少有人能完全回答正确.通常的说法是:对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数组),传引用.基本类型传值,所有人都不会对此有疑义;问题出在引用类型上. 为引入正题,不妨先看看下面的例子,你能正确给出程序的运行结果嘛? /** * @(#)Swap.java * * *  @author *  @version  1.00

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用

C语言结构体,C语言结构体指针,java对象引用,传值,传地址,传引用 传值 把实参的值赋值给行参 那么对行参的修改,不会影响实参的值 传地址 传值的一种特殊方式,只是他传递的是地址,不是普通的如int 那么传地址以后,实参和行参都指向同一个对象 传引用 真正的以地址的方式传递参数 传递以后,行参和实参都是同一个对象,只是他们名字不同而已 对行参的修改将影响实参的值 所谓变量是内存地址的一个抽象名字,在静态编译的程序中,所有变量名都会在编译时转换成内存地址,机器不知道变量名,只知道地址. C 语

Java传值与传引用

在Java中,变量分为以下两类, 1.对于基本类型变量,Java是传值的副本,即时自己的副本变了,自己也不会变化. 2.对于一切对象型变量,Java都是传引用的副本,也就是复制指向地址的指针,它传的引用副本指向自己的地址. eg:你要张三(张三相当于函数)打开仓库,并检查库里面的货物(仓库相当于地址),有必要新建一座仓库(并放入相同的货物)给张三吗? 没有必要,你只需要把钥匙(引用)复制一把给张三即可, 张三会拿复制的钥匙(引用副本,但是有时效性,函数结束,钥匙销毁)打开仓库. 注意:Strin

【转载】Java是传值还是传引用

1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Test.java * @author fancy */ public class Test { public static void test(boolean test) { test = ! test; System.out.println("In test(boolean) : test = &q