Java中的堆栈
堆中存放的数据类型为
对象和数组
栈中存放的数据类型为
基本数据类型变量,引用类型变量,方法
案例
package javaCore.valuePropagation;
/**
* 值传递问题的测试类
* 包含基本类型的值传递问题
* String类的值传递问题
* 非String类的值传递问题
*/
public class PropagationTest {
public static void main(String[] args) {
String s = "hello";
int a = 10;
Person p = new Person("peng",23);
change(a,s,p);
System.out.println("a: "+a);
System.out.println("s: "+s);
System.out.println("p.age: "+p.age);
System.out.println("p.name: "+p.name);
}
public static void change(int a1,String s1,Person person){
a1 = 11;
s1 = "hi";
person.age = 24;
person.name = "zhang";
}
}
class Person{
String name;
int age;
Person(String name,int age){
this.name = name;
this.age = age;
}
}
测试结果
结果分析
因为引用变量p和person指向的是同一个对象,在change中更改person中的age,name,实际上就是更改堆中new Person()对象的age,name,所以p的name,age也随之更改
s和s1也是引用类型,且指向同一个对象,为什么更改s1,s却没有随之改变呢?
这就深入到String类型的底层数据结构了,我们都很清楚String对象是不可以更改的,为什么呢?因为String的底层数据结构是字符数组,你每次更改String对象其实都需要创建一个新的字符数组,相当于创建一个新的引用对象