zoukankan      html  css  js  c++  java
  • [Java]_函数传参的疑惑与思考

    问题来源于leetcode上的两道题 Path Sum I && II,分别写了两个dfs。

    1 void dfs(TreeNode node , int sum , ArrayList<Integer> curPath)
    2 void dfs(TreeNode node , int sum , boolean ifExist)

    问题:在1号中我可以在方法中修改curPath,在结束函数调用时,变量修改仍然生效。

         在2号问题中,我即使在函数中修改了ifExist,结束函数调用时,变量修改无效。

    疑问:Java的参数传递方式?

    解决:考虑下面三种情况:

    1、

    double a = 10;
    void tripleValue(double x)
        x = 3 * x;
    tripleValue(a);

    上述代码运行后,a的值保持不变。结论一:方法不能修改一个基础数据类型(数值型和布尔型)的参数

    2、

    Employee a = new Employee("july");
    void changeName(Employee x )
      x.name = "alice";
    changeName(a);

    上述代码运行后,a的name属性被修改为alice。结论二:方法可以改变一个对象参数的属性

    3、

    Employee a = new Employee("alice");
    Employee b = new Employee("bob");
    void swap(Employee p1 , Employee p2){
          Employee temp = p1;
          p1 = p2;
          p2 = temp;
    }
    swap(a , b);

    上述代码运行后,a仍然为alice,b仍然为bob。结论三:方法不能让对象参数引用一个新的对象

    因此:Java的函数传参全为值传递

    在函数参数为基础数据类型时,方法参数得到参数值的拷贝;

    当函数参数为对象时,方法参数得到参数地址的拷贝,但也不是对原对象的引用(引用:类似于对变量取别名,除了名字不一样外,其它均是一样的)。

  • 相关阅读:
    子程序的设计
    多重循环程序设计
    汇编语言的分支程序设计与循环程序设计
    代码调试之串口调试2
    毕昇杯模块之光照强度传感器
    毕昇杯之温湿度采集模块
    【CSS】盒子模型 之 IE 与W3C的盒子模型对比
    【css】盒子模型 之 概述
    【css】盒子模型 之 弹性盒模型
    【网络】dns_probe_finished_nxdomain 错误
  • 原文地址:https://www.cnblogs.com/glamourousGirl/p/3755112.html
Copyright © 2011-2022 走看看