zoukankan      html  css  js  c++  java
  • java值传递详解

    java的值传递详解

    1. 首先我们需要弄清楚基本数据类型和引用数据类型的区别
      int num = 0;
      String str = "java";
      基本数据类型直接保存在变量中,而引用数据类型保存在变量中的是地址值,地址指向实际对象,所以被称为引用数据类型。

      2. 再来弄清楚赋值运算符(=)的作用
      num = 20;
      str = "hello";
      基本数据类型直接修改变量中存储的数值,而应用数据类型是修改了变量中保存的地址,新地址指向所赋值的实际对象,原来的对象并没有改变。没有任何地址指向的对象就是垃圾会被java垃圾回收机制回收

      3. 值传递实际例子
      //第一个例子:基本类型
      void foo(int value) {
      value = 100;
      }
      foo(num); // num 没有被改变
      //第二个例子:没有提供改变自身方法的引用类型
      void foo(String text) {
      text = "windows";
      }
      foo(str); // str 也没有被改变
      //第三个例子:提供了改变自身方法的引用类型
      StringBuilder sb = new StringBuilder("iphone");
      void foo(StringBuilder builder) {
      builder.append("4");
      }
      foo(sb); // sb 被改变了,变成了"iphone4"。
      //第四个例子:提供了改变自身方法的引用类型,但是不使用,而是使用赋值运算符。
      StringBuilder sb = new StringBuilder("iphone");
      void foo(StringBuilder builder) {
      builder = new StringBuilder("ipad");
      }
      foo(sb); // sb 没有被改变,还是 "iphone"。
      第一个例子,对于基本数据类型来说,因为是值传递,将num的值赋给形参value,所以num并不会改变。
      第二个例子,对于引用数据类型来说,将str的地址赋值给text,函数中改变的是text的地址值,所以str没有变换。
      第三个例子,在函数中sb的地址赋值给形参builder,builder的地址没有变化,而实际对象"iphone"被修改成”iphone4“,所以sb地址指向的值从”iphone“变成了”iphone4“。


      第四个例子,在函数中sb的地址赋值给形参builder,而builder的地址发生变化,原来的实际对象i并没有发生改变,因此sb没有改变,依旧指向”iphone“。

  • 相关阅读:
    自动化CodeReview
    10个有关RESTful API良好设计的最佳实践
    ASP.NET Core 获取控制器上的自定义属性
    [转] Autofac创建实例的方法总结
    PetaPoco
    LogViewer
    hdoj:2047
    hdoj:2046
    hdoj:2045
    hdoj:2044
  • 原文地址:https://www.cnblogs.com/jiangblog/p/12861838.html
Copyright © 2011-2022 走看看