博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java的值传递和引用传递
阅读量:6944 次
发布时间:2019-06-27

本文共 2558 字,大约阅读时间需要 8 分钟。

先不多说,看两个题。

第一题,如下代码执行结果:

package com.zhyea.test;public class Test {    public static void main(String[] args) {        String str = "123";        changeString(str);        System.out.println(str);    }    public static void changeString(String str){        str = "ABCDEFG";    }}

第二题,如下代码执行结果:

package com.zhyea.test;public class MyTest {    public static void main(String[] args) {        Person robin = new Person("Robin", 29);
changePersonName(robin, "zhangsan");        System.out.println(robin);    }    public static void changePersonName(Person p, String name) {        p.setName(name);    }}class Person {    String name;    int age;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String toString() {        return "Person name:[" + name + "], age:[" + age + "]";    }}

看后心里运行下,稍后讨论结果。

值传递:调用方法时,实参将它的值传递给形参,执行方法时形参值的改变不影响实参。

引用传递:也称地址传递。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

关于引用传递解释得有点晦涩是吧。不过也不影响理解。

这里传递的两个变量都是引用类型(String和Person)。所以按引用传递的解释,第一个输出的应该是“ABCDEFG”,第二个输出的就是“Person name:[zhangsan], age:[29]”。

嗯。跟我想的一样。可是我错了。

这个问题在CSDN有讨论过:。

直接说结论:Java中没有引用传递。Java中实参交给方法形参的值是它实际值的一个副本。方法对形参所做的任何操作对实参无任何影响。

回来说那两道题:

第一题结果比较好理解,和结论一致,不解释了。

第二题还需要解释下,在这道题中,实参的值并没有改变,改变的是实参的值所指向的对象里面的属性。解释得比较拗口。这涉及到引用类型与内存之间的一些关系。这个可以自己查些资料。

说下我的理解:如果把引用类型对象比作一个房子,那么引用类型的变量(实参)就是一把可以打开这个房子的门牌号。实参把房子的门牌号告诉了方法,方法知道了门牌号就可以找到并进入这个房子。但是哪怕方法把房子里的东西都搬空了,这个房子的门牌号却是不能动的。

再为第二题拿个实例出来就好理解了:

package com.zhyea.test;public class MyTest {    public static void main(String[] args) {        Person robin = new Person("Robin", 29);        changePerson(robin);        System.out.println(robin);    }        public static void changePerson(Person p) {        Person tom = new Person("Tom", 16);        p = tom;    }}class Person {    String name;    int age;    public Person(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String toString() {        return "Person name:[" + name + "], age:[" + age + "]";    }}

 

就这样。

转载于:https://www.cnblogs.com/amunote/p/4183905.html

你可能感兴趣的文章
onvif开发实战2--总结框架搭建
查看>>
数据结构-线性表
查看>>
1098 均分纸牌
查看>>
jquery.masonry瀑布流插件的4个使用步骤
查看>>
Apache ab测试工具使用方法(无参、get传参、post传参)
查看>>
Java中如何遍历Map对象的4种方法
查看>>
深度学习和机器学习截然不同?模式识别是最古老的很过时的,机器学习是最基础的初创公司热点,深度学习是有影响力的前沿领域...
查看>>
[认证授权] 2.OAuth2授权(续) & JWT(JSON Web Token)
查看>>
使用 log4j 2记录日志
查看>>
新词发现(一):基于统计
查看>>
从“为什么创业”到“怎么创业”(转)
查看>>
从零开始学习渗透Node.js应用程序
查看>>
Three-js 创建第一个3D场景
查看>>
mysql优化:连接数
查看>>
单例设计模式之安全的懒汉式
查看>>
iOS_20_微博OAuth授权_取得用户授权的accessToken
查看>>
离线用户的灰色头像处理
查看>>
php递归函数return会出现无法正确返回想要值的情况
查看>>
Android Studio之Activity切换动画(三)
查看>>
Bitcoin: A Peer-to-Peer Electronic Cash System(比特币论文翻译)
查看>>