一、Java的值传递
(作者:知乎用户
链接:https://www.zhihu.com/question/20628016/answer/15683373
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处)
Java 中的所有函数调用都是值传递。
值传递是指,函数在调用时,传递的参数不是实参本身,而是它的副本。
引用传递是指,函数在调用时,传递的参数就是实参本身(的地址)。
显然,在使用引用传递的情况下,在函数体内可以对参数本身进行修改,修改结果会对函数调用者产生影响。而使用值传递,由于函数内对参数的修改实际上不是对参数本身,而是对参数的副本进行的修改,因此,修改结果不会对调用者产生影响。
在 Java 中,对象(类的实例)都是通过引用来访问的。例如:
Object foo = new Object();
其中,foo 是一个引用,指向了新创建的这个 Object 对象。
的确,你可以在某个方法(函数)中,对其参数引用的对象进行修改,例如:
void doSth(Object bar) {
bar.attr = newValue;
}
假设某个调用者调用了 doSth 方法,并且将 foo 传入。在方法返回之后,foo 所引用的对象的 attr 属性变成了 newValue。但这并不是值传递。因为 doSth 方法体内修改的是 foo 所引用的对象,而不是 foo 本身。
在 Java 中,你绝不可能在方法体内,把作为参数传入的引用本身指向其他对象。因为 Java 所有的函数调用都是值传递。这样的修改只会修改参数的副本,而不是参数本身。
--------------
Java 的设计目的之一就是为了填 C/C++ 的各种「坑」,让编程语言更加易用和易于理解,例如垃圾自动回收机制,单继承策略,等等。引用传递使得方法内部可以对方法外的数据进行修改,这无疑增加了一定的(但我觉得这很少)危险性。当然,这会使语言的灵活性降低,就算你对你的数据掌控得很好,你也不能随心所欲地修改它。事实上,你完全可以通过传递引用参数来修改方法外创建的对象。因此,受到制约的实际上就只有那些原生类型而已。
或许这是 Java 注重安全性与实用性而宁愿放弃一些灵活性的设计哲学的一种体现。1.这个解释的不错,其实不用长篇大论,本质上讲java没有所谓的引用(地址)传递是因为java规定了引用本身不能操作修改内存地址;
2.值传递与引用传递的最大区别就是内存属于copy还是share,前者属于copy,基本类型直接copy内容,object的变量copy的是内存地址(也就是引用),copy过来的引用是被包装过的,因此在java里没办法操作引用去修改变量的内存地址,也就是你代码解释的情况;
3.假如说java中有"引用传递",那么违背了java资深的规定,引用是"只读"的(而C++的指针是可读写的);
4.而C++由于采用的是指针,指针是"可写"的,因此才分别给了“”copy(值传递)“”和"share(地址传递)"来作明确区分.
二、Java的ThreadLocal源码分析
三、Java ThreadLocalMap的引申 (强引用,弱引用,软引用,虚引用)
四、Redis服务及应用场景
五、Java Spring Redis(spring配置,RedisTemplate类详解,@CachePut\@Cacheable\@CacheEvict)