#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];
- Сначала создается новая карта сокровищ с именем ‘item’.
- Это делает новый treasurechest способным содержать
numOFitems
treasuremaps и закапывает его в песок. Затем он заполняется таким количеством пустых карт, которые не приводят к сокровищу. - Это обновит вашу
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:
Здесь есть две разные концепции:
-
Выделение массива и присвоение ссылки на массив переменной, и
-
Присвоение значений элементам в массиве
В 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()
массив с помощью метода, автоматически отображаются в исходном источнике данных.