java传值与传址

写代码的时候到现在还容易会犯的错误,一直没有记牢,总结一下。

按照我的理解,Java可以理解为都是传值的。但是参数分两种,引用类型和原始类型。

原始类型(int, long, float, double, boolean),本身就是数值。

引用类型的值本身是指向对象的地址,所以传到函数中的是源数据的地址,更改指向相同地址的成员数据的话将改变原来对象里的内容。特例是下例子中test2和test3中都将str的指针重新指向了新的对象,而不是更改源对象,所以源对象没有改变。Array数组,二维数组,三维数组都是应用型。

package leetCode;

public class Test {
	public static void test(StringBuffer str) {
		str.append(", World!");
	}

	public static void test2(StringBuffer str) {
		str = new StringBuffer("Hello World!");
	}

	public static void test3(String str) {
		str = "Hello World!";
	}

	public static void test4(String str) {
		str.replace('l', 'o');
		// nothing changes, because replace() returns a new string without
		// modify the existing one
	}

	public static void main(String[] args) {
		StringBuffer string = new StringBuffer("Hello");
		test(string);
		System.out.println(string);
		StringBuffer string2 = new StringBuffer("Hello");
		test2(string2);
		System.out.println(string2);
		String string3 = "Hello";
		test3(string3);
		System.out.println(string3);
		String string4 = "Hello";
		test4(string4);
		System.out.println(string4);
	}
}
结果:

Hello, World!
Hello
Hello
Hello

### 引用的概念及区别 #### 1. (Call by Value) 在方式中,实际参数的副本被递给形式参数。这意味着任何对形参的操作都不会影响实参本身[^1]。这种方式通常用于简单的数据类型,比如整数或浮点数。 以下是的一个简单示例: ```c void add(int a, int b) { a += b; // 修改的是a的本地副本 } int main() { int x = 5; int y = 3; add(x, y); printf("%d\n", x); // 输出仍然是5,因为x未受影响 return 0; } ``` #### 2. (Call by Reference/Pointer) 是指将变量的实际内存地作为参数递给函数的形式参数。这样,在函数内部可以直接操作原始变量的内容,从而改变其[^4]。这种机制常见于C/C++等支持指针的语言中。 下面展示了一个利用指针实现乘法功能的例子: ```c void multiplyByTwo(int *pX) { (*pX) *= 2; // 改变原位置上的数 } int main(){ int z=7; multiplyByTwo(&z); printf("Result:%d ",z); // 结果应显示为14 return 0; } ``` 对于Java而言,尽管它不直接暴露指针概念,但对于对象来说实际上采用了一种特殊的“按递”,即递的是对象引用的拷贝而非真正的引用本身[^2]。 #### 3. 引用(Call by Reference with Modern Languages Perspective) 某些现代高级语言提供了更直观的方式处理类似需求——通过显式的引用类型来完成所谓的“引用”。例如,在C++中有专门的关键字`&`表示引用;而在Python里一切皆可视为对象,因此本质上也是基于引用计数管理资源释放等问题[^3]。 考虑如下C++代码片段: ```cpp void swapValues(int &val1, int &val2){ int temp=val1; val1=val2; val2=temp; } // 调用swapValues时无需取地符& ``` #### 区别总结表 | 特性 | **** | ** (通过指针)** | **引用** | |--------------|-----------------------------|------------------------------|---------------------------| | 数据共享 | 不共享 | 共享 | 共享 | | 性能开销 | 较低 | 可能较高(取决于上下文) | 高效 | | 安全性 | 更安全 | 存在潜在危险 | 相当安全 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值