【J2SE】浅谈 Java 的方法参数传递机制

class Solution {
  public void backtrace(int i, String digits, StringBuilder sb, LinkedList<String> resList, boolean[] visited) {
    if(sb.length() == digits.length()) {
      resList.addLast(sb.toString());
      //好玩:sb = new StringBuilder();
      return;
    }

    char digit = digits.charAt(i); 
    String letters = letterMap[digit - '0'];  
    for (int j = 0; j < letters.length(); j++) {
      sb.append(letters.charAt(j));  
      backtrace(i+1, digits, sb, resList, visited);
      sb.deleteCharAt(sb.length()-1);
    }
  }
}

注:在为什么 new 一个 StringBuilder 与 不 new 都行?原因是方法在执行的时候有栈帧的概念,入栈的时候只是压栈方法参数是传入参数的副本

应该注意到:Java 的数据类型有二:基本类型和引用类型

  • 基本类型:值存放在局部变量表中,无论如何修改只会修改当前栈帧的值,方法执行结束对方法外不会做任何改变;此时需要改变外层的变量,必须返回主动赋值。
  • 引用数据类型:指针存放在局部变量表中,调用方法的时候,副本引用压栈,赋值仅改变副本的引用。但是如果直接改变副本引用的值,修改了引用地址的对象,此时方法以外的引用此地址对象当然被修改。(两个引用,同一个地址,任何修改行为 2 个引用同时生效)
  • 看一下面的例子:
public class Main{
    public static void setValue(String str){
        str = "aString";
    }
    public static void setValue(Person person){
        person = new Person("aPerson");
    }
    public static class Person{
        public Person(String name) {
            this.name = name;
        }
    }
 
    public static void main(String[] args) {
        String str = "str";
        setValue(str);
        System.out.println(str);	//str
 
        Person person= null;
        setValue(man);
        System.out.println(man);	//null
    }
}
发布了419 篇原创文章 · 获赞 94 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43539599/article/details/104499610