Как повторно инициализировать массив int в Java - PullRequest
1 голос
/ 04 декабря 2009
class PassingRefByVal 
{
    static void Change(int[] pArray)
    {
        pArray[0] = 888;  // This change affects the original element.
        pArray = new int[5] {-3, -1, -2, -3, -4};   // This change is local.
        System.Console.WriteLine("Inside the method, the first element is: {0}", pArray[0]);
    }

    static void Main() 
    {
        int[] arr = {1, 4, 5};
        System.Console.WriteLine("Inside Main, before calling the method, the first element is: {0}", arr [0]);

        Change(arr);
        System.Console.WriteLine("Inside Main, after calling the method, the first element is: {0}", arr [0]);
    }
}

Мне нужно преобразовать эту программу на языке c # в язык Java. Но эта линия смущает меня

pArray = new int [5] {-3, -1, -2, -3, -4}; // Это локальное изменение.

Как я могу повторно инициализировать массив Java? Спасибо за помощь.

Ответы [ 6 ]

4 голосов
/ 04 декабря 2009
pArray = new int[] {-3, -1, -2, -3, -4};

Т.е., не нужно указывать начальный размер - компилятор может считать элементы в фигурных скобках.

Также имейте в виду, что при передаче Java по значению ваш массив не будет «меняться». Вы должны вернуть новый массив.

2 голосов
/ 04 декабря 2009

Вы не можете "повторно инициализировать" массив из другого метода, потому что Java передается по значению. Вы можете решить это в C #, используя ключевое слово ref, но это не доступно в Java. Вы сможете изменить только элементы в существующем массиве из вызывающего метода.

Если вы хотите, чтобы массив изменялся только локально, то решение Божо будет работать.

1 голос
/ 04 декабря 2009

Вот что печатает программа C #:

** Внутри Main, перед вызовом метода, первый элемент: 1

Внутри метода первый элемент: -3

Внутри Main, после вызова метода, первый элемент: 888 **

Спросите себя, почему arr [0] установлено на 888 в Main () после вызова Change () ? Вы ожидали -3?

Вот что происходит. Переменная массива int pArray обрабатывается как локальная переменная внутри метода Change () . Первоначально он устанавливается как ссылка на экземпляр массива, который ему передается. (В примере программы это будет обр в Main () ). Линия

**pArray = new int[5] { -3, -1, -2, -3, -4 };   // This change is local.**

вызывает создание нового массива, и pArray устанавливается как ссылка на этот новый массив вместо arr из Main () .

Программа не распечатывает длины массива. Если бы это было так, длина была бы 3, 5 и 3 соответственно.

Вы можете попробовать следующее:

public class TestPassByRefByVal
{
    public static void Change(int[] pArray)
    {
        int [] lArray = { -3, -1, -2, -3, -4 };
        pArray[0] = 888;  // This change affects the original element.
        pArray = lArray;     // This change is local.
        System.out.println("Inside the method, the first element is: " + pArray[0]);
    }

    public static void main(String[]args)
    {
        int [] arr = { 1, 4, 5 };
        System.out.println("Inside Main, before Change(), arr[0]: " + arr[0]);

        Change(arr);
        System.out.println("Inside Main,  after Change(), arr[0]: " + arr[0]);
    }
}
0 голосов
/ 04 декабря 2009

Если вы хотите изменить размер в java, вам может потребоваться использовать Vector или ArrayList

0 голосов
/ 04 декабря 2009

, как вы правильно заметили, это невозможно с семантической передачей параметров Java (C # имеет ключевые слова ref для этих сценариев).

Поскольку массивы Java неизменны по размеру , вы можете изменять только значения, а не длину массива (он не может увеличиваться или уменьшаться).

0 голосов
/ 04 декабря 2009

Нельзя указывать размеры при наличии инициализатора массива, т.е.

 pArray = new int[5] {-3, -1, -2, -3, -4};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...