zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    MeteoInfoLab脚本示例:Trajectory
    MeteoInfoLab脚本示例:闪电位置图
    MeteoInfoLab脚本示例:AVHRR HDF数据
    发布MeteoInfo 1.2.8
    切图,css注意事项
    C# Winform下一个热插拔的MIS/MRP/ERP框架15(窗体基类场景1)
    Xamarin Android Webview中JS调用App中的C#方法
    C# Winform下一个热插拔的MIS/MRP/ERP框架14(自动更新)
    C# Winform下一个热插拔的MIS/MRP/ERP框架13(窗体基类)
    RDLC报表的相关技巧四(报表内依照分组重置页码)
  • 原文地址:https://www.cnblogs.com/jccjcc/p/14194709.html
Copyright © 2011-2022 走看看