Как метод присваивает массив?

#java

#java

Вопрос:

Я в замешательстве от того, как массив был назначен каким-либо данным, поскольку метод должен был содержать себя, или я не понял фундаментальной концепции

 // Craft stall stock and till program   
import java.util.Scanner;
public class revisonTest {
public static void main(String[] args) // where program exicutes 
{
    final int numOFitems = 50;
    
    String[] item = new String[numOFitems];
    int [] broughtItem = new int[numOFitems];
    int[] costItem =  new int[numOFitems];
    
    int COUNT = getDetail(item,broughtItem,costItem);
    System.out.println(item[0]);

}
    

public static int getDetail(String[] name,int[] quantities,int[]cost)
{
    int count =1;
    int arrayIndex =0;
    String answer = "";
    while(!(answer.equals("Exit")))
    {
        answer =  userInput("Item" count ": ");
        if(!(answer.equals("Exit")))
        {
            name[arrayIndex] =  answer;
            quantities[arrayIndex] = Integer.parseInt(userInput("How many " name[arrayIndex] " have you brought? "));
            cost[arrayIndex] = Integer.parseInt(userInput("How much does a " name[arrayIndex] " cost? "));
            count  ;
            arrayIndex  ;
            
        }
    }
    return count;
    
}
public static String userInput(String question)
{
    Scanner sc = new Scanner(System.in);
    System.out.println(question);
    return sc.nextLine();
}
}
  

Ответ №1:

String[] item = new String[numOFitems];

  1. Сначала создается новая карта сокровищ с именем ‘item’.
  2. Это делает новый treasurechest способным содержать numOFitems treasuremaps и закапывает его в песок. Затем он заполняется таким количеством пустых карт, которые не приводят к сокровищу.
  3. Это обновит вашу item карту сокровищ, чтобы указать на этот treasurechest-containing-maps.

getDetail(item,broughtItem,costItem);

Это переносит вашу карту сокровищ в хранилище карт и создает ее копию, а затем передает копию getDetail методу. Ваша копия неизменена и не может быть изменена getDetail … но это всего лишь ваша копия КАРТЫ сокровищ, а не сокровища. Обратите внимание, что getDetail вызывает эту копию name , а не item — что это свободно делать.

(в getDetail) name[arrayIndex] = answer;

Это getDetail, который берет свою name treasuremap (которая является копией карты элементов main), следует по карте, достает лопату, выкапывает, находит сокровище, открывает его, находит arrayIndex в нем нужную карту, вытаскивает ее и копирует answer на нее свою карту.

Таким образом.. когда main следует за своей копией своей карты к тому же сокровищу, происходит то же самое.

Конечно, в java мы используем другой жаргон.

  • ‘сокровище’ -> ‘объект’
  • ‘карта сокровищ’ -> ‘ссылка’
  • «следуйте по карте, копайте, открывайте сокровища» -> «разыменование».
  • «создать сокровище» -> «создать экземпляр объекта»

Ответ №2:

Здесь есть две разные концепции:

  1. Выделение массива и присвоение ссылки на массив переменной, и

  2. Присвоение значений элементам в массиве

В main new операция создает массив определенного размера и присваивает ссылку на этот массив переменной с именем item .

Вызов getDetail(item,...) делает копию этой ссылки (а не сам массив) доступной для метода. Внутри getDetail эта ссылка хранится в том, что фактически является локальной переменной named name .

Внутренний цикл getDetail собирает ответы (которые на самом деле являются ссылками на строки) и сохраняет их в последовательных элементах массива, которые он знает как name и которые знает вызывающий item .

     name[arrayIndex] =  answer;
  

(Аналогично для двух других массивов, конечно)

Таким образом, getDetail предоставляется существующий массив, в который он записывает значения.

Кстати, если пользователь вводит слишком много ответов (более name.length ), вы закончите конец массива и получите исключение «индекс вне границ».

Комментарии:

1. Я понимаю, как он просто копирует, но тогда как назначаются массивы в основном методе

2. Здесь присваивается сам массив: String[] item = new String[numOFitems]; и здесь присваиваются элементы массива: name[arrayIndex] = answer; массив не копируется; ссылка на массив копируется.

Ответ №3:

A String в java считается непримитивным типом данных. Итак, когда вы создали свой массив элементов с помощью:

 String[] item = new String[numOFitems];
  

На самом деле вы создали пустой массив String объектов. На основе вашего кода в массиве есть 50 пустые пространства, где вы можете хранить данные.

Следующая часть вашего кода предназначена для получения входных данных от пользователя и заполнения этих массивов:

 int COUNT = getDetail(item,broughtItem,costItem);
  

Примечание: getDetail() никогда не возвращает item[] массив, так как же получить доступ к данным?

Когда вы передаете свой item массив в качестве аргумента getDetail() методу, вы фактически передаете этот массив в качестве ссылки.

В Java в качестве ссылки передаются непримитивные типы данных. Это означает, что вместо отправки данных getDetail() методу вы фактически отправляете информацию о том, где данные находятся в памяти.

В вашем getDetail() методе вы можете манипулировать данными, и изменения будут отражены в исходном массиве без необходимости его возврата.

Именно по этой причине ваш оператор печати отображает данные в массиве:

 System.out.println(item[0]);
  

Любые изменения, внесенные в getDetail() массив с помощью метода, автоматически отображаются в исходном источнике данных.