java传值还是传引用
最近一直在看primer c++,函数一章对c++函数之间传递参数有详细的讲解,传值、传指针和传引用的应用与区别都讲得很清楚,
以前一直用java,由于java没有指针,当时也没有引用这个概念,所以没有对java参数的传递有过多的思考,现在搞清楚了c++
传递参数的机制,自然就会跟java进行对比,究竟java传的是什么东西?
Java代码
public static void test(Pass passA); {
passA = null;
}
看看, 对passA有什么影响?
毫无作用。函数调用出来后,passA还是原来的值,不会变成Null.
但是,你的代码对 passA进行了操作 passA.a ,改变了passA的成员变量。
这个成员变量是一个真实指向String 的 地址,当然能够被改变。
这就是操作 (.) 和 赋值 (=) 的区别。
这是对 成员变量 a 的 赋值。真正改变了成员变量 a 的值。
注意,这里传递的参数是 passA, 而不是 a.
所以,passA 被复制了一份。passA 的这个副本的 a 变量还 指向 原来的 passA 的 a 变量。
Java中的“引用”是指非原生类型的变量的值保存的是对一个堆上对象的引用。
Java任何时候都是传值的,只不过该值的语义有所不同罢了
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
写的没错,但是文字太多,第二条就已经把人弄糊涂了,得仔细看完4条才清楚。而且对String类型的疑惑没有解决。
三句话总结一下:
1.对象就是传引用
2.原始类型就是传值
3.String类型因为没有提供自身修改的函数,每次操作都是新生成一个String对象,所以要特殊对待。可以认为是传值。
在网上查了一下,还是外国人解释得比较清楚:
Does Java pass by reference or pass by value?
Why can't you swap in Java?
By Tony Sintes, JavaWorld.com, 05/26/00
Q:If Java uses the pass-by reference, why won't a swap function work?
A:Your question demonstrates a common error made by Java language newcomers. Indeed, even seasoned veterans find it difficult to keep the terms straight.
Java does manipulate objects by reference, and all object variables are references. However, Java doe
相关文档:
1. socket通信:有客户端和服务端的socket代码。
2.
多线程:客户端和服务端各用一线程发送信息;服务端另有一监听线程,用于把超时的信息删除。
这里应用到了同步,使两个线程可以操作同一个map。
代码:(类全在同一个包内)
server端:
import java.io.BufferedReader;
import java.i ......
eval.jar 需要到https://eval.dev.java.net/
下载
--下面是示例使用,支持中文变量
Expression exp = new
Expression("(x + y)/2"
);
Map<String, BigDecimal> variables = new
HashMap<String, BigDecimal>();
variables.put("x", new
BigDecimal("4.32"
)); ......
JAVA文件操作总结
File类
File f = new File(path);
path为实际路径,该路径可以是文件,或文件夹,也可以是不存在的。
f.exists() 可以判断该路是否存在。
f.isDirectory() 可以判断是否是文件夹。
f.mkdirs(); 递归创建文件夹
File和输入输出流之间纽带FileInutStream,FileOutputStream
URL url = new URL(strUr ......