Java中的赋值和参数传递

Java中的=赋值

一直以来我对于这些都有些模糊,今天来写一篇博客总结一下。

在Java中,=赋值对于基本类型可以简单理解为就是直接传值

1
2
3
4
5
int a = 1;
int b = a;
b = 2;
System.out.println(a); // 1
System.out.println(b); // 2

我们可以看出我们把a赋值给b然后对b进行改变的时候a的值还是不会变。

所以在基本数据类型中,我们可以简单理解为=为传值。

而在对象中的=就不是赋值那么简单了,对于对象的=其实赋值的是对象的地址而不是内容,比如a = a1 ,假设这两个变量是对象,那么我们是将a1的地址赋值给a,那么a的地址就是a1的地址,即他们两共享同一地址,所以如果我们对a进行了操作,其实就是通过地址同时操作a1。

1
2
3
4
5
StringBuilder s1 = new StringBuilder("123");
StringBuilder s2 = s1;
s2.append("456");
System.out.println(s1); // 123456
System.out.println(s2); // 123456

所以我们可以理解对于对象的=赋值的是对象的地址,除非我们再次new一个对象,将这个new的对象的地址重新赋值给s2。

1
2
3
4
5
6
7
8
9
StringBuilder s1 = new StringBuilder("123");
StringBuilder s2 = s1;
s2.append("456");
System.out.println(s1);
System.out.println(s2);
s2 = new StringBuilder("123");
s2.append("789");
System.out.println(s1); // 123456 不变
System.out.println(s2); // 123789

我们可以看出当我们给s2重新赋值一个地址的时候这个时候的s2就与s1无关了,因为他们已经不是共享同一个地址了。

Java中的方法参数传递

我觉得方法参数传递和=赋值差不多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  public class Test {

public static void function1(StringBuilder stringBuilder) {
stringBuilder.append("我改变了");
}


public static void function2(StringBuilder stringBuilder) {
stringBuilder = new StringBuilder("我重新赋值地址了");
}

public static void main(String[] args) {

StringBuilder stringBuilder = new StringBuilder("初始化");
System.out.println(stringBuilder); //初始化
Test.function1(stringBuilder);
System.out.println(stringBuilder); //初始化我改变李
Test.function2(stringBuilder);
System.out.println(stringBuilder); //初始化我改变了
// 这里我们看出function2对stringBuilder对象没有任何改变,是因为
// 我们传入function2的stringBuilder是一个地址,然后我们又重新将
// 新的地址赋值给stringBuilder,所以指向了不同的地址 自然就不会有关联了
}

总之记住一个就是Java中的参数传递就是按值传递,当我们传入的是一个对象的时候我们传入的是地址,我们传入一个基本类型的时候传入的是一个值,我们也可以简单理解为地址就是对象的值。

其实也可以这么理解,基本类型的值在栈中,即栈中的的值,然后对象的地址在栈中,这个地址指向堆中的内容,我们可以简单理解为传值就是传入栈中的内容。

-------------本文结束感谢阅读-------------