PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 你可以先阅读一下FAQ里的这个文章 “Java方法调用是传值还是传引用” https://github.com/deepnighttwo/LetsJava/blob/master/FAQ/02%E7%AB%A0-Java%E6%96%B9%E6%B3%95%E8%B0%83%E7%94%A8%E6%98%AF%E4%BC%A0%E5%80%BC%E8%BF%98%E6%98%AF%E4%BC%A0%E5%BC%95%E7%94%A8.md 其实Java比C++要简单,Java的参数传递就一句话:把形参当成方法的局部变量,然后在方法调用时,把实参的值,赋值给形参。 完事儿了,就这么简单,没有指针,没有地址,没有第二种可能和操作。 所以,形参无论怎么折腾,都无法影响实参一丝一毫。这点在参数为基本数据类型时毫无混淆的可能。 但是如果参数是个引用,就略绕一点点,但也只是一点点。如果参数是个引用,那么很简单,其实就是形参和实参这两个引用,指向同一个对象而已。仅此而已。 (如果形参在方法代码里再指向别的对象,那么还是那句话,对实参没有任何影响,实参还是指向之前的对象)
作者回复: 完全理解了👍
作者回复: 那必须的,我可是斥巨资买的本子,必须物尽其用。
作者回复: 因为实参是引用,改变的是实参和形參指向的同一个对象
作者回复: 是的,Java没有指针,无法改变实参的值
作者回复: 可以参考我这篇FAQ 😁 https://xie.infoq.cn/article/d673fe30fe8f9db3630abd959
作者回复: 引用的地址不会变化。引用的值,也就是这个引用的地址所在的内存里的数据,会在赋值时变化。引用的值是它指向的对象的地址。所以要分清 1)引用自己的地址和 2)引用在自己的地址位置存储的它指向的对象的地址这俩关系。
作者回复: 这个影响要从两个角度看,比如说s1是实参,s2是形参。赋值之后它们指向同一个对象,比如说是商品对象。那么通过s1修改这个商品的价格,用s2去检查商品的价格,那么是可以看到更新后的价格的。 从s1和s2本身的值来看,注意,不是s1和s2指向的对象,而是s1和s2自己的值,也就是它们存储的对象的地址。比如说s1是实参,s2是形参,那么是无法通过操作s2,让s1指向别的对象的。加黑加粗加大-》是无法通过操作s2,让s1指向别的对象的
作者回复: person类的代码没什么问题。你这里用的时候,getName是没有参数的,你给它塞了个参数(就是getSex方法的返回值)。所以这样编译会有错误
作者回复: 它们就是俩独立的变量