Java参数传递是值传递,对象引用传的是地址副本,可修改对象状态但不能改变原引用指向;C++引用是原变量别名,指针支持地址运算和底层操作,但需开发者自行管理内存安全。

Java传递的是“地址值的副本”,不是指针本身
Java中所有参数都是值传递,对象引用作为参数时,传递的是该引用所存地址的拷贝——比如对象在堆中地址是0x1234,传进方法的形参拿到的也是0x1234,但这是个独立副本。你可以在方法内通过这个地址修改对象状态(如sb.append()),但一旦执行sb = new StringBuilder(),只是让形参指向新地址,原引用变量仍指向旧对象。
C++引用传递可直接绑定原变量,指针还能做地址运算
C++的引用参数(int& a)不是副本,而是原变量的别名,对a赋值等同于直接改原变量;而指针(int* p)虽也存地址,但允许p++、*p = 5等底层操作,甚至能跨内存区域访问——Java完全禁止这类行为。
安全机制差异:JVM管控 vs 开发者自主管理
Java引用由JVM统一管理:自动判空、垃圾回收、禁止地址计算,不会出现野指针或内存越界;C++指针若未初始化、释放后继续使用或越界访问,程序可能直接崩溃。Java的null是明确状态,C++的未初始化指针值是随机的,风险更高。
内存与类型约束更严格
Java引用没有固定内存大小概念,不参与算术运算,也不能强制类型转换成整数;C++指针本质是整型地址(如64位系统为8字节),支持reinterpret_cast等转换,也支持数组下标偏移(p[i]等价于*(p+i))。Java中数组下标越界会抛ArrayIndexOutOfBoundsException,C++则可能静默读写非法内存。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











