Java基础之Java值传递

java中没有引用传递,只有值传递。

 main里面有两个变量:num = 10;per.age=10;

基本类型变量num,per在栈里,实例对象new Person()在堆里。

 然后调用amethod方法,在aMethod的方法体中,Person per1像是个遥控器一样仍然可以操作堆中的per.age。

但是num1只存在于aMethod方法栈中,一但方法结束,空间释放,num1就没了,但是堆中的per.age的仍然发生了更改。

所以最终输出结果为10,11,num的值不发生变化。

总结:如果将a方法中的x 基本类型变量传入到b方法中,并在b方法中发生了修改,a方法中的x变量不变。

  如果将a方法中的x引用类型变量传入到b方法中,并在b方法中发生了修改,a方法中的x变量改变。(传入数组 int[] num,也会发生改变,因为数据为引用类型变量)

习题:

 最终输出结果?

首先 String不属于基本的数据类型。

当String str ="A";时,在堆给str开辟一个空间指向A,然后change方法引用str,str1 = str1+"1";因为string 定义为final,不可改变,所以在堆中又给str1开辟了一个空间指向“A1”,但是str仍指向的是空间A。所以输出为A。

StringBuffer是String的升级版,主要区别在修改字符串时不会再给String开辟新的空间,节约内存。StringBuffer sbB =new StringBuffer("B"),在堆中开辟空间new StringBuffer("B"),方法change引用sbB,然后sbB1.append("1")。因为不会在开辟空间所以原堆中的new StringBuffer指向常量池中新的值“B1”,但是堆中的实例对象没有发生改变,sbB1和sbB都指向了new  StringBuffer,而堆中的New StringBuffer指向了常量池中的“B1”,所以最终结果变为B1。

String sbC = new StringBuffer("C")在堆中开辟空间new StringBuffer并指向常量池中的“C”,方法change引用sbC,sbC1 = new StringBuffer("c1"),只要出现对象实例化,就得在堆中开辟新的空间,所在栈中的sbC1指向了堆中新的空间new StringBuffer,然后指向常量池中的“C1”,,这里sbC1指向的空间和sbC指向的空间并不一致,是两个不同的空间。所以最终结果输出为"C"。

在main中打印输出:A,B1,C

原文地址:https://www.cnblogs.com/jccjcc/p/14194709.html