唉,老了!
搞了这么多年的,到头来基本的东西都忘记得差不多了!
1、Java中所有东东都是通过值传递。而对象,压根就不会被传递。
2、变量的值要么是原始类型,要么就是引用,而不是对象本身。
所以都是值传递,只不过这个值可能是原始类型的值,也可能是对象的地址(引用,见第二条)。
其实都是叫法不同,基本数据类型直接把数据复制一份,非基本数据类型(包括数组)把它的引用复制一份(其实就是内存地址),相当于多个引用指向同一个对像,调用其中任何一个引用改变这个对象,其他多个引用也随之改变,但当其中一个引用指向别的对象时,原来的引用不发生改变。
参考文章:http://tjuking.iteye.com/blog/1405532 的第二个例子, 函数中的对象只是其本身指向了别的对象,对于越来的对象和对象的应用时没有影响的。
参考:
原理:java参数传递(超经典): http://blog.sina.com.cn/s/blog_4b622a8e0100c1bo.html
表象: http://blog.csdn.net/steedhorse/article/details/6892569
或者这么说:
1. 原始类型是值传递
2. 非原始类型是应用传递(也就是传地址值,上文说的对象地址的意思)
简单增加一个通过main 往args里面传递数据的例子:
如下参数传递给public static void main(String[] args) {
a) -d "\\t" "E:\LearningMaterial\ebook\Data Mining\LensKit\grouplens-lenskit-hello-25c12e76a10e\src\dataset\ml-100k\u.data" 6
传递后,args[1]等于: \\\\t
b) -d \t "E:\LearningMaterial\ebook\Data Mining\LensKit\grouplens-lenskit-hello-25c12e76a10e\src\dataset\ml-100k\u.data" 6
传递后,args[1]等于: \\t
c) -d "\t" "E:\LearningMaterial\ebook\Data Mining\LensKit\grouplens-lenskit-hello-25c12e76a10e\src\dataset\ml-100k\u.data" 6
传递后,args[1]等于: \\t
由此可以看出, main接受的参数都当作是没有转义意义的参数,都是必须参数。 如果需要转义,得自己用双引号或者单引号(不可变)进行封装。
d)准确做法,注意双引号中间空格是一个tab键
-d "" E:\LearningMaterial\ebook\Data Mining\LensKit\grouplens-lenskit-hello-25c12e76a10e\src\dataset\ml-100k\u.data" 6