Как локальная переменная доступна вне ее метода в Java? - PullRequest
0 голосов
/ 29 августа 2018

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

Этот код генерирует все возможные строки, когда каждая цифра от 2 до 9 (включительно) отображается в строку английского алфавита.

Вопрос в том, чтобы воссоздать словарь T9 для мобильного телефона. Это означает, что если пользователь наберет 23, то должны быть возвращены все возможные комбинации строк «abc» и «def».

enter image description here

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);
            }
        }
}

Как устанавливается ret, объявленный и созданный в методе letterCombination(), когда метод combination( ) не имеет возвращаемого типа.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

потому что в вызове метода здесь

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

аргумент ret здесь также имеет ссылку на ret объект ниже

List<String> ret = new LinkedList<String>();
0 голосов
/ 29 августа 2018

Java на 100% передается по значению, однако объекты, которые могут появляться в значениях, на самом деле всегда являются ссылками на объекты. Эти ссылки передаются по значению. https://stackoverflow.com/a/40523/57695

В таких языках, как C или C++ ссылка имеет специальный синтаксис, однако в Java переменные являются только ссылками или примитивами, поэтому нет особого синтаксиса.

new LinkedList<String>() не является локальной переменной в стеке. Это объект в куче. Он не копируется, когда вы передаете ссылку на него, и не становится доступным только для чтения. Если вы измените его в другом методе или в другом потоке, он будет изменен.

Ваша локальная переменная ret является просто ссылкой на этот объект кучи. Вы не можете изменить эту ссылку в другом методе, но вы можете изменить указанный объект. Это связано с тем, что ссылка копируется, а копируется только ссылка.

...