【问题标题】:How does a local variable is accessible outside its method in Java?如何在 Java 中的方法之外访问局部变量?
【发布时间】:2018-08-29 08:23:50
【问题描述】:

https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/

此代码用于生成所有可能的字符串,当 2 到 9(含)之间的每个数字映射到英文字母字符串时。

问题是重新创建手机T9字典,也就是说,如果用户输入23,那么应该返回所有可能的字符串“abc”和“def”的组合。

https://ideone.com/4FodC8

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        System.out.println(letterCombinations("23"));
    }

    private static final String[] KEYS = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };

        public static List<String> letterCombinations(String digits) {
            List<String> ret = new LinkedList<String>();  //this is the local variable.
            combination("", digits, 0, ret);  //being sent to a method. But that method doesn't have any return type.
            return ret; //so, how is this ret being populated????
        }

        private static void combination(String prefix, String digits, int offset, List<String> ret) {
            if (offset >= digits.length()) {
                ret.add(prefix);
                return;
            }
            String letters = KEYS[(digits.charAt(offset) - '0')];
            for (int i = 0; i < letters.length(); i++) {
                combination(prefix + letters.charAt(i), digits, offset + 1, ret);
            }
        }
}

combination( ) 方法没有返回类型时,如何在letterCombination() 方法中声明和实例化ret

【问题讨论】:

标签: java static void


【解决方案1】:

Java 是 100% 按值传递的,但是,可能看起来像值的对象实际上总是对对象的引用。这些引用是按值传递的。 https://stackoverflow.com/a/40523/57695

CC++ 等语言中,引用具有特殊语法,但在Java 中,变量只是引用或原语,因此没有理由使用特殊语法。

new LinkedList&lt;String&gt;() 不是堆栈上的局部变量。它是堆上的一个对象。当您传递对它的引用时,它不会被复制,也不会以某种方式设为只读。如果你在另一个方法或另一个线程中修改它,它就会被改变。

您的ret 局部变量只是对该堆对象的引用。您无法在其他方法中更改该引用,但您可以更改引用的对象。这是因为复制了引用,但只复制了引用。

【讨论】:

    【解决方案2】:

    因为这里的方法调用中

    combination("", digits, 0, ret); // 
    

    这里的参数ret 还引用了下面的ret 对象

    List<String> ret = new LinkedList<String>();
    

    【讨论】:

      猜你喜欢
      • 2016-04-18
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-05-13
      相关资源
      最近更新 更多