【问题标题】:How can OOP be implemented to call an instance method from one class to be stored in an array in another instance method in a different class?如何实现 OOP 以从一个类调用实例方法以存储在不同类中另一个实例方法的数组中?
【发布时间】:2013-03-05 20:33:19
【问题描述】:

为了进一步理解我的问题:

我在 Java 教科书中遇到了一个问题,它要求我编写一个名为 GroceryList 的类,该类表示要从市场上购买的物品列表,以及另一个名为GroceryItemOrder 表示购买给定数量的特定商品的请求(例如:四个单位的橙子)。根据进一步的指示,我将开发一个客户端来测试并打印所有已实现方法的结果。

免责声明:我并不是要任何人为我解决这个问题。我只是想请一位导师澄清如何根据我的客户 GroceryListClient。

我的 GroceryList 类中的代码:

public class GroceryList_test {
    public GroceryList_test() {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    }

    public void add(GroceryItemOrder_test item) {
        GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
        GroceryList[1] = item;
        System.out.println(GroceryList[1]);
    }

    /*public double getTotalCost(GroceryItemOrder_test item) {
    }*/
}

在实例方法add(GroceryItemOrder_test item)下:

  • 如果列表中的项目少于 10 个(不担心这个元素;我可以用 if 语句和空异常来做到这一点。

我希望此方法每次在 GroceryListClient 中指示它执行此操作时,都将 GroceryItemOrder_test (String name, int quantity, double priceperunit) 中的项目订单动态加载到数组中 客户端,稍后将访问该客户端以在下面的 TotalCost() 实例方法中计算总成本。

我的 GroceryItemOrder 类中的代码:

public class GroceryItemOrder_test {
    String itemID;
    int NumberofItems;
    double priceperunit;

    public GroceryItemOrder_test(String name, int quantity, double pricePerUnit) {
        this.itemID = name;
        System.out.println("Item: " + itemID);
        this.NumberofItems = quantity;
        System.out.println("Quantity: " + NumberofItems);
        this.priceperunit = pricePerUnit;
        System.out.println("Price per unit: $" + priceperunit);
    }

    public double getCost() {
        return ((NumberofItems * priceperunit) * 100.0) / 100.0;
    }
    public void setQuantity(int quantity) {
    }
 }

在公共类下public GroceryItemOrder_test(String name, int quantity, double pricePerUnit)

  • 构造一个商品订单,以购买给定名称、给定数量的商品,每件商品的价格为给定。

我希望将此方法加载到 GroceryList 类的实例方法 add(GroceryItemOrder_test item) 中的数组中。

来自我的 GroceryListClient 客户端的代码:

public class GroceryListClient {
    public static void main(String[] args) {
        GroceryList_test addorder = new GroceryList_test();
        GroceryItemOrder(addorder);
    }
    public static void GroceryItemOrder(GroceryList_test addorder) {
        GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
        System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
        addorder.add(Oranges);
        System.out.println();
        GroceryItemOrder_test Grapes = new GroceryItemOrder_test("grapes", 15, 0.55);
        System.out.println("Total cost of " + Grapes.itemID + " = $" + Grapes.getCost());
        addorder.add(Grapes);
    }
 }

GroceryItemOrder(GroceryList_test addorder)方法下:

GroceryItemOrder_test Oranges = new GroceryItemOrder_test("oranges", 3, 2.46);
System.out.println("Total cost of " + Oranges.itemID + " = $" + Oranges.getCost());
addorder.add(Oranges);

具体语句addorder.add(Oranges);

这应该将项目作为“项目”指定的“对象”添加到 add(GroceryItemOrder_test item) 方法下的数组中。

这些是我无法弄清楚如何执行的条件。如果可能,请提供任何帮助。

不建议使用 ArrayList,因为我还没有做到这一点,经过进一步研究,我认为它不会很容易地用于此目的。

【问题讨论】:

  • 你的题名很不清楚,加上题体很长,会妨碍我们给你很好的帮助。您是否可以更简洁地陈述您的问题?
  • 您将如何实现来自客户端程序的指令以从一个类构造一个项目(对象)并将其存储在不同类的 10 个对象的单独数组中?客户端会收到指令来创建橙子订单和葡萄订单,然后将这些项目存储到另一个类中的数组中。

标签: java oop instance-method


【解决方案1】:

如果我理解您的意思,您希望 GroceryList 存储不同的 GroceryItemOrder 对象。

您即将在代码中找到解决方案。但是请看这里:

public void add(GroceryItemOrder_test item) {
    GroceryItemOrder_test[] GroceryList = new GroceryItemOrder_test[10];
    GroceryList[1] = item;
    System.out.println(GroceryList[1]);
}

如果你跟踪它是如何工作的,那么每次你输入add() 方法时,都会创建一个包含十个空元素的新数组。当方法退出时,您将立即丢失对此的所有引用,因为它将是 out of scope 并最终被垃圾回收。

要解决这个问题,您需要使用一个保持在范围内的变量。我为您的 GroceryList 类推荐一个实例变量,如下所示:

public class GroceryList {

    private GroceryItemOrder[] list = null;

    public GroceryList() {
        list = new GroceryItemOrder[10];
    }

    public void add(GroceryItemOrder item) {
        for(int i=0; i<list.length; i++) {
            if(list[i] == null) {
                list[i] = item;
                System.out.println(item);
                break;
            }
        }
    }
}

现在在这个add() 方法中,我们只查看已经存在和持续存在的list 变量,而不是创建一个新变量。我们循环遍历它以找到一个可用的插槽(如果有的话),然后执行其余的处理。 break 语句是必要的,这样列表中的每个项目就不会被设置为您要添加的一个项目。

然后你的GroceryClient 类可以随意创建GroceryItemOrder 对象并使用GroceryList 中的add() 方法(因为它是public)。

请注意,使用ArrayList 确实会更容易,这与您在帖子结束时所说的相反。

【讨论】:

  • 我实现了代码,并在添加了 System.out.println(list[i]);在 for 循环内部但在 if 语句之外,我每次都能看到我的对象列表累积。非常感谢,我想我可以从这里完成剩下的工作。
  • @RylandCline 太好了!祝你好运。
  • 再次感谢您向我展示“break”命令。我不知道我可以用它来达到这个目的。它至少有助于这种类型的编码。
猜你喜欢
  • 2015-06-10
  • 2011-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多