Объекты перезаписываются при добавлении нового объекта в массив

#java #arrays #object

#java #массивы #объект

Вопрос:

Я работаю над заданием для школы и не могу понять, почему мои товары перезаписываются в моем классе корзины покупок. Если бы это зависело от меня, я бы использовал arraylist, но назначение вызывает массив элементов.

 package jjobrien_assignement_4;


import java.util.Arrays;
import java.util.Scanner;

public class ShoppingCart extends Shopper{

    private static final int DEFAULT_SIZE = 10;

    String userName;

    Item[] cart;

    int itemCount = 0;
    /**
     * ShoppingCart default constructor
     */
    public ShoppingCart(){
        userName = "";
        cart = new Item[DEFAULT_SIZE];
    }
    /**
     * Shopping cart overloaded constructor
     * @param aUserName
     */

    public ShoppingCart(String aUserName){
        userName = aUserName;
        cart = new Item[DEFAULT_SIZE];
    }
    /**
     * Adds a single item to the array cart[]
     * @param cart 
     * @return
     */

    public void addItem(Item theItem){

        for(int i = 0; i < DEFAULT_SIZE; i  ){

            if(cart[i] == null){
                System.out.print(i);
                cart[i]= theItem;
                itemCount  = 1;
                System.out.print(cart[i]);
                break;
            }   //System.out.print(cart[i]);

        }

    }

    public String removeItem(){
        return "";
    }
    /**
     * 
     * @param cleared
     * @return cleared
     * Will clear every object inside of the array cart[]
     * by setting all valuse in the cart[] to null.
     */
    public boolean clear(boolean cleared){
        for(int i = 0; i < cart.length; i  ){
            cart[i] = null;
        }

        cleared = true;
        itemCount = 0;
        return cleared;
    }

    public String indexOf(){
        return "";
    }
    /**
     * Grabs single item from array to return to shopper
     * @return
     */
    public String getItem(){
        String theItem = "";
        for(int i = 0; i < itemCount; i  ){
            theItem = cart[i].getProductName();
        }

        return theItem;
    }

    public String showAll(String all){

        for(int i = 0; i < itemCount; i  ){
            all  = cart[i].getProductName()   "   $" 
                          cart[i].getPrice()   "n";
        }
        return all;

    }
    /**
     * 
     * @return
     * Adds total cost and divides by item count to get avgCost
     */
    public double showAverageCost(){
        double avgCost = 0;
        double totalCartCost = 0;
        double singleItemCost = 0;

        for(int i = 0; i < itemCount; i  ){
            singleItemCost = cart[i].getPrice();
            totalCartCost = totalCartCost   singleItemCost;
        }

        avgCost = totalCartCost/itemCount;

        return avgCost;
    }

    /**
     * 
     * @param totalCartCost
     * @return
     * Calculates total cost by getting each price 
     * of all existing items in the array cart[].
     */

    public double totalCost(double totalCartCost){
        double singleItemCost = 0;
        for(int i = 0; i < itemCount; i  ){
            singleItemCost = cart[i].getPrice();
            totalCartCost = totalCartCost   singleItemCost;
        }
        return totalCartCost;
    }

    /**
     * @return itemCount
     * Counts how many items are in the shoppers cart
     */
    public int countItems(){
        int numOfItems = 0;

        for(int i = 0; i < itemCount; i  ){
            numOfItems = numOfItems   1;
        }

        return numOfItems;
    }


}
}

    {package jjobrien_assignement_4;

import java.util.Scanner;

import javax.swing.JOptionPane;

public class Shopper {

    public final static String MENU = "nSelect an option: nType "add" to add an Item to the cartn"  
                                        "Type "count" to determine the total number of Items in the"  
                                        "cartn"  
                                        "Type "total cost" to determine the total cost of Items in"  
                                        "the cartn"  
                                        "Type "show all" to display the contents of the cartn"  
                                        "Type "show average cost" to display the average price of"  
                                        "the contents of the cartn"  
                                        "Type "cheapest" to display the Item with the lowest price"  
                                        "in the cartn"  
                                        "Type "highest"  to display the Item with the highest price"  
                                        "in the cartn"  
                                        "Type "remove" to remove a specific Item from the cartn"  
                                        "Type "clear" to remove all Items from the cartn"  
                                        "Type "quit" to exit the program: ";

    public static void main (String [] args){

        Scanner keyboard = new Scanner(System.in);

        /*
        cart[0] = new Item("Milk", 3.00);
        cart[1] = new Item("Eggs", 4.25);
        cart[2] = new Item("Bread", 2.50);
        */

        boolean cleared = false;
        boolean done = false;

        double totalCartCost = 0.0;

        String userName = "";

        String userOption = "No option yet";

        JOptionPane.showMessageDialog(null, "Welcome to the shopping cart!");

        userName = JOptionPane.showInputDialog(null, "Please enter your name: ");



        ShoppingCart newCart = new ShoppingCart(userName);
        //While to display menu to customer and call methods based on user input
        while(!done){

        userOption = JOptionPane.showInputDialog(null, MENU);

        if(userOption.equals("quit")){
            if(quit(done) == true){
                JOptionPane.showMessageDialog(null, "Thank you for using the Shopping Cart program!n");
                done = true;
            }else if(quit(done) == false){
                done = false;
            }
        }else if(userOption.equals("add")){
            addItem(keyboard, newCart);
        }else if(userOption.equals("count")){

        }else if(userOption.equals("total cost")){
            findTotalCost(newCart);
        }else if(userOption.equals("show all")){
                showAllItems(newCart);
        }else if(userOption.equals("show average cost")){
                showAverage(newCart);
        }else if(userOption.equals("cheapest")){
                //getCheapest();
        }else if(userOption.equals("highest")){
                //getHighest();
        }else if(userOption.equals("remove")){
            //remove();
        }else if(userOption.equals("clear")){
            clear(cleared, newCart);
        }
    }

    }
    /**
     * Exits the program
     */

    public static boolean quit(boolean isDone){ 
        isDone = true;
        return isDone;
    }
    /**
     * Calls shopping cart class to add a single item to the array
     * @param keyboard
     * @param theCart
     */

    public static void addItem(Scanner keyboard, ShoppingCart theCart){
        String theItem = "";
        String tempPrice = "";
        Double thePrice = 0.0;

        Item temp = null;

        theItem = JOptionPane.showInputDialog(null, "Enter product name: ");
        tempPrice = JOptionPane.showInputDialog(null, "Enter the price of "   theItem   ": ");
        thePrice = Double.parseDouble(tempPrice);
        temp = new Item(theItem, thePrice);

        if(temp != null){
            theCart.addItem(temp);
        }

    }
    /**
     * Will call ShoppingCart Clear Method
     * @param cleared
     * @param theCart
     * @return
     */

    public static boolean clear(boolean cleared, ShoppingCart theCart){

        theCart.clear(cleared);
        JOptionPane.showMessageDialog(null, "Your cart was cleared");
        return cleared;
    }
    /**
     * will call totalCost method from shopping cart class
     * to add the total cost of all items stored in cart[] 
     * @param theCart
     */

    public static void findTotalCost( ShoppingCart theCart){
        double totalCost = 0;
        JOptionPane.showMessageDialog(null, "Total cost: " 
                  theCart.totalCost(totalCost));
    }

    /**
     * Will print every item with their corresponding price
     * in the cart[] array
     */
    public static void showAllItems(ShoppingCart theCart){
        String all = "";
        JOptionPane.showMessageDialog(null, theCart.showAll(all));

        }
    /**
     * calls shopping cart class to get average cost or all items
     * in the current cart
     */
    public static void showAverage(ShoppingCart theCart){
        JOptionPane.showMessageDialog(null, theCart.showAverageCost());
    }




}

}

    {package jjobrien_assignement_4;

public class Item {

        private static String productName;

        private static double price;

        public Item(){
            productName = "No Name yet";
            price = 0;
        }

        public Item(String aProductName, double aPrice){
            setProductName(aProductName);
            setPrice(aPrice);
        }

        public double getPrice(){
            return price;
        }

        public String getProductName(){
            return productName;
        }

        public double setPrice(double aPrice){
            price = aPrice;
            return aPrice;
        }

        public String setProductName(String aProductName){
            productName = aProductName;
            return aProductName;
        }

        public java.lang.String toString(){
            String text = "";

            text  = productName.toString();

            return text;
        }

    }
}
  

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

1. Можете ли вы лучше описать поведение? Возможно, воспроизводимый тестовый пример?

2. Я рекомендую попробовать debugger. Вы обнаружите ошибку в считанные минуты (как только познакомитесь с отладчиком).

3. @ToddDunlap по сути, то, что происходит, я начинаю с массива из 10. Итак, я выбираю добавить и элемент. Затем я ввожу название продукта. Скажем, «Молоко» и его цена «3.00», тогда я покажу все, и «Молоко» будет напечатано, но если я добавлю еще один элемент, скажем, «яйца» в «2.00», затем выберите показать все, программа напечатает «яйца 2.00 яйца 2.00»

4. Я все еще не понимаю проблему. В какой момент вещи перезаписываются?

5. Они перезаписываются, когда я добавляю какой-либо элемент после первого элемента. Насколько я понимаю, это происходит в методе addItem в моем классе ShoppingCart.

Ответ №1:

Ваш класс Item использует статические переменные для хранения своих значений.

Статическая переменная является классовой — существует только один экземпляр этой переменной, который используется каждым экземпляром вашего класса.

Когда вы изменяете значения своего элемента (например, при создании нового элемента), вы фактически изменяете статические переменные — фактически устанавливаете свои новые значения для всех объектов элемента.

Замена ваших статических переменных стандартными переменными-членами должна решить ваши проблемы:

 private String productName;

private double price;
  

Обратите внимание, что Eclipse автоматически сгенерирует конструкторы и установщики, используя синтаксис:

 public void setSomething(String something) {
    this.something = something;
}
  

и Eclipse также должен выдать вам предупреждение, если вы попытаетесь назначить статическую переменную таким образом (потому что вы используете статическую переменную в нестатическом контексте).

Я не уверен насчет других IDE, но они должны делать что-то подобное.

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

1. О, вау, большое спасибо. Я чувствую себя ослом, я даже не подумал посмотреть на мои переменные в моем классе item. Ценю это.