0
votes

Comment la méthode affecte-t-elle le tableau?

Je ne sais pas comment le tableau a été attribué à des données, car la méthode est censée être un self-contain ou je n'ai pas compris un concept fondamental

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


0 commentaires

3 Réponses :


0
votes

String[] item = new String[numOFitems];

  1. Cela crée d'abord une nouvelle carte au trésor nommée «objet».
  2. Cela rend un nouveau trésor capable de contenir des numOFitems trésorerie numOFitems , et l'enfouit dans le sable. Il est alors rempli de ces nombreuses cartes vierges qui ne mènent à aucun trésor.
  3. Ceci met à jour votre carte item trésor d' item pour pointer vers ces cartes contenant des trésors.

getDetail(item,broughtItem,costItem);

Cela amène votre carte du trésor au trésor de cartes et en fait une copie, puis la remet à la méthode getDetail . Votre copie est non modifiée et ne peut être modifié par getDetail ... mais c'est juste votre copie de la carte au trésor, pas le trésor. Notez que getDetail appelle ce name copie et non l' item - ce qu'il est libre de faire.

(dans getDetail) name[arrayIndex] = answer;

C'est getDetail qui prend son name Treasuremap (qui est une copie de la carte des objets de main), suit la carte, sort une pelle, fouille, trouve le trésor, l'ouvre, trouve le arrayIndex la carte dedans, le tire vers le haut, et y copie sa carte de answer .

Ainsi .. quand main suit sa copie de sa carte vers le même trésor, la même chose se produit.

Bien sûr, en java, nous utilisons un jargon différent.

  • 'trésor' -> 'objet'
  • 'Treasuremap' -> 'référence'
  • 'suivez la carte, creusez, ouvrez le trésor' -> 'déréférencer'.
  • 'créer un trésor' -> 'instancier un objet'

0 commentaires

0
votes

Il y a deux concepts différents ici:

  1. Allocation d'un tableau et attribution d'une référence de tableau à une variable, et

  2. Attribution de valeurs aux éléments du tableau

En main , la new opération crée un tableau d'une certaine taille, et attribue une référence à ce tableau à la variable nommée item .

L'appel de getDetail(item,...) met une copie de cette référence (pas le tableau lui-même) à la disposition de la méthode. Dans getDetail , cette référence est stockée dans ce qui est effectivement une variable locale, nommée name .

La boucle à l'intérieur de getDetail collecte les réponses (qui sont en fait des références String) et les stocke dans des éléments successifs du tableau qu'il connaît comme name et que l'appelant connaît comme item .

    name[arrayIndex] =  answer;

(De même pour les deux autres tableaux, bien sûr)

En résumé, getDetail est fourni avec un tableau existant, dans lequel il écrit des valeurs.

Incidemment, si l'utilisateur tape trop de réponses (plus que name.length ), vous exécuterez la fin du tableau et obtiendrez une exception «index hors limites».


2 commentaires

Je comprends comment il copie, mais comment les tableaux de la méthode principale sont-ils attribués


Le tableau lui-même est affecté ici: String[] item = new String[numOFitems]; et les éléments du tableau sont attribués ici: name[arrayIndex] = answer; Le tableau n'est pas copié; une référence au tableau est copiée.



0
votes

Une String en java est considérée comme un type de données non primitif. Ainsi, lorsque vous avez créé votre tableau d'articles en utilisant:

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

Vous avez en fait créé un tableau vide d'objets String . En fonction de votre code, le tableau contient 50 espaces vides dans lesquels vous pouvez stocker des données.

La partie suivante de votre code est conçue pour obtenir les entrées de l'utilisateur et remplir ces tableaux:

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

Remarque: getDetail() ne renvoie jamais le tableau item[] , alors comment accéder aux données?

Lorsque vous passez votre tableau d' item en tant qu'argument à la méthode getDetail() , vous passez en fait ce tableau en tant que référence.

En Java, les types de données non primitifs sont passés comme référence. Cela signifie qu'au lieu d'envoyer les données à la méthode getDetail() , vous envoyez réellement des informations sur l'emplacement des données en mémoire.

Dans votre méthode getDetail() , vous pouvez manipuler les données et les modifications seront reflétées sur le tableau d'origine sans avoir à le retourner.

C'est la raison pour laquelle votre instruction d'impression affiche des données dans le tableau:

String[] item = new String[numOFitems];

Toute modification apportée au sein de la méthode getDetail() au tableau apparaît automatiquement sur la source de données d'origine.


0 commentaires