java - 如何在 Java 中的方法之外访问局部变量?
问题描述
https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
此代码用于生成所有可能的字符串,当 2 到 9(含)之间的每个数字映射到英文字母字符串时。
问题是重新创建手机 T9 字典,也就是说,如果用户键入 23,则应该返回所有可能的字符串“abc”和“def”的组合。
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);
}
}
}
当方法没有返回类型时,如何设置方法ret
内的声明和实例化。letterCombination()
combination( )
解决方案
Java 是 100% 按值传递的,但是,可能看起来像值的对象实际上总是对对象的引用。这些引用是按值传递的。 https://stackoverflow.com/a/40523/57695
在语言中,C
或C++
引用具有特殊语法,但是在 Java 中,变量只是引用或原语,因此没有理由具有特殊语法。
new LinkedList<String>()
不是堆栈上的局部变量。它是堆上的一个对象。当您传递对它的引用时,它不会被复制,也不会以某种方式设为只读。如果您在另一个方法或另一个线程中修改它,它会被更改。
您的ret
局部变量只是对该堆对象的引用。您无法在其他方法中更改该引用,但您可以更改引用的对象。这是因为复制了引用,但仅复制了引用。
推荐阅读
- enums - SwiftUI - 选择器
- android - 将颜色阴影拖放到 Xamarin 中的按钮
- vue.js - 没有嵌套的动态 v 模型
- sql - sql查询喜欢在列表顶部排序完全匹配
- swift - 如何从 NSDecimalNumber 中获取绝对值?
- javascript - 如何将 tsx 文件转换为 React 的 js 文件
- php - How do I install php-curl in CentOS 8?
- java - Servlet [example] in web application [/SpringMvcDemo] threw load() exception java.lang.ClassNotFoundException:
- arrays - 如何将numpy数组四舍五入为1dp
- c# - 从控制器发送消息以在 asp.net core mvc 中查看的最佳方式