如何实现OOP以从一个类调用实例方法以存储在另一个类中的另一个实例方法中的数组中?

时间:2013-03-05 20:33:20

标签: java oop instance-method

进一步了解我的问题:

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

免责声明:我不是要求任何人为我做这个问题。我只是想请一位导师澄清如何根据我的客户 GroceryListClient <的指令,将我的 GroceryItemOrder 类中的实例方法实现到我的 GroceryList 类中/ em>的

来自 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个项目,则将给定的项目顺序(在访问 GroceryItemOrder 类时,按照 GroceryListClient 的指示)添加到此列表中(不担心这个元素;我可以用 if语句和null异常 来做到这一点。

我希望这种方法每次在 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);

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

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

不要建议 ArrayList ,因为我还没有达到这个目标,经过进一步的研究,我认为它不会轻易达到这个目的。

1 个答案:

答案 0 :(得分:0)

如果我理解您的意思,您希望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个对象,并使用add()中的GroceryList方法(因为它是public)。

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