如何访问另一个类的ArrayList

时间:2014-11-01 14:08:15

标签: java

我是Java的新手,需要弄清楚如何从另一个类访问ArrayList。

我有三个课程:MarketStockEntryPrint

我从Market调用了Print类的print方法,而Print类从StockEntry类中获取了arrayList的引用,但它没有打印任何东西。见下文:

市场类

public class Market {
    StockEntry stock;
    Print print;

    Market() {
        stock = new StockEntry();
        print = new Print();
    }

    void addStock (String itemName,String name, int quantity, int price) {
        stock.addStockOfItems(itemName, name, quantity, price); 
    }

    void print() {
        print.pr();
    }
}

StockEntry Class

import java.util.ArrayList;

public class StockEntry {
    Fruit fruit;
    ArrayList<Fruit> fruitList ;

    StockEntry() {
        fruit = new Fruit();
        fruitList = new ArrayList<Fruit>();
    }

    void addStockOfItems(String itemName,String name, int quantity, int price) {
        fruit.enterTheDetail(name, quantity, price);
        fruitList.add(fruit);
    }
}

打印课程

import java.util.ArrayList;

public class Print {
    StockEntry stock;
    ArrayList<Fruit> fruitList;

    Print() {
        fruitList = new ArrayList<Fruit>();
    }

    void pr() {
        for (Fruit fruit : stock.fruitList) {
            System.out.println(fruit);
        }
    }
}

有人可以帮我弄清楚为什么这不起作用吗?

3 个答案:

答案 0 :(得分:0)

您的Print类需要对StockEntry对象的有效引用,可能会传递给Print的构造函数,这将允许它调用StockEntry上的方法,包括允许它获取有关其所拥有数据的信息的方法。您不应该做的是在Print中创建一个新的StockEntry对象,因为如果这样做,它将不会保存添加到主类中使用的其他StockEntry的数据。

请注意,您的addStockOfItems方法已损坏:

void addStockOfItems(String itemName,String name, int quantity, int price) {
        fruit.enterTheDetail(name, quantity, price);
        fruitList.add(fruit);
}

您需要在此方法中创建一个新的Fruit实例,而不是更改单个现有的Fruit实例。否则,ArrayList将包含对单个Fruit实例的多个引用。


例如:

<强> SimpleMarket.java

// imports

public class SimpleMarket {
   private SimpleStockEntry stockEntry;
   private SimplePrint print;

   public SimpleMarket() {
      stockEntry = new SimpleStockEntry();
      print = new SimplePrint(stockEntry);
   }

   public void addData(String datum) {
      stockEntry.addStock(datum);
   }

   public void print() {
      print.print();
   }

   public static void main(String[] args) {
      SimpleMarket market = new SimpleMarket();
      market.addData("Fe");
      market.addData("Fi");
      market.addData("Fo");
      market.addData("Fum");
      market.print();
   }
}

<强> SimpleStockEntry.java

public class SimpleStockEntry {
   private List<String> myList = new ArrayList<>();

   public void addStock(String datum) {
      myList.add(datum);
   }

   public List<String> getMyList() {
      return myList;
   }
}

<强> SimplePrint.java

class SimplePrint {
   private SimpleStockEntry stockEntry;

   public SimplePrint(SimpleStockEntry stockEntry) {
      this.stockEntry = stockEntry;
   }


   public void print() {
      for (String item : stockEntry.getMyList()) {
         System.out.println(item);
      }
   }

}

请注意,我的代码不是您作业的直接答案,而是简化以向您展示需要做的概念。

答案 1 :(得分:0)

如果您想打印水果列表,您应该有有效的参考。所以你可能会在StockEntry类和Market类中公开一个getter方法,同时调用print方法传递你所拥有的引用,如下面的StockEntry,然后从print方法中的stockEntry获取所有结果并迭代它们

public class Market
{   

 StockEntry stock ;

 Print print;

Market()
{
    stock = new StockEntry();

    print = new Print();
}


void addStock (String itemName,String name, int quantity, int price)
{
    stock.addStockOfItems(itemName, name,  quantity,  price); 


 }

 void print()
 {


   print.pr(stock);

 }


}

第二课

import java.util.ArrayList;

public class StockEntry
{
  Fruit fruit ;

  ArrayList<Fruit> fruitList ;

  StockEntry()
  {

     fruit = new Fruit();

     fruitList   =  new ArrayList<Fruit>();


   }

  public ArrayList<Fruit> getFruitList() {
    return fruitList;
  }

  void addStockOfItems(String itemName,String name, int quantity, int price)
  {


      fruit.enterTheDetail(name, quantity, price);

      fruitList.add(fruit);



   }

第三类

public class Print
{   



  void pr(StockEntry stock){

      for(Fruit fruit : stock.getFruitList()){

      System.out.println(fruit);

   }


}

}

答案 2 :(得分:0)

首先要知道的是,当你打印一个Object时,实际上是方法 自动调用“toString()”,返回要打印的字符串。

请提供您的Fruit课程,因为您的代码是:

System.out.println(fruit);

如果你没有为类Fruit实现toString(),地址将打印如下:

Fruit@15db9742

或者,如果覆盖toString()但没有仔细实现,则会出现问题