Java 如何使用同一引用引用多个类

Java 如何使用同一引用引用多个类,java,Java,我需要向多个类发送相同的数据。我的教授给了我们一个半完整的驱动程序文件,他使用相同的引用引用了两个不同的类,这样您就可以在一个方法调用中向两个类发送相同的数据。但是,这会导致错误。我一直在努力使它工作,即使给他们不同的参考和调用方法两次,但仍然不起作用。它还表示在方法的签名中找不到符号“SortedStringListReferenceBased_solution”。请帮忙 public class SortedStringListDriver { public static void

我需要向多个类发送相同的数据。我的教授给了我们一个半完整的驱动程序文件,他使用相同的引用引用了两个不同的类,这样您就可以在一个方法调用中向两个类发送相同的数据。但是,这会导致错误。我一直在努力使它工作,即使给他们不同的参考和调用方法两次,但仍然不起作用。它还表示在方法的签名中找不到符号“SortedStringListReferenceBased_solution”。请帮忙

 public class SortedStringListDriver
{

  public static void main(String [] args)
 {
    SortedStringListArrayBased myGroceryList = new SortedStringListArrayBased();
    SortedStringListReferenceBased myGroceryList = new SortedStringListReferenceBased();

    myGroceryList.add("milk");
    myGroceryList.add("eggs");
    myGroceryList.add("butter");
    myGroceryList.add("pecans");
    myGroceryList.add("apples");
    myGroceryList.add("bread");
    myGroceryList.add("chicken");
    myGroceryList.add("black beans");
    myGroceryList.add("rice");
    myGroceryList.add("sausage");
    myGroceryList.add("flour");

    printList(myGroceryList);//print out original List
    System.out.print("numItems for array based list is now: "+myGroceryList1.size()+"\n\n");


    adding(myGroceryList, "juice");
    removing(myGroceryList, "juice");
    adding(myGroceryList, "banana");
    removing(myGroceryList, "sausage");
    removing(myGroceryList, "cheese");

    }

   public static void adding(SortedStringListReferenceBased_solution myList, String str)
   {
    System.out.println("Adding " + str + " ...");
    myList.add(str);  //add juice
    printList(myList);
    System.out.print("numItems for array based list is now: " + myList.size() + "\n\n");
  }

  public static void removing(SortedStringListReferenceBased_solution myList, String str)
  {
    System.out.println("Removing " + str + " ...");
    myList.remove(str);
    printList(myList);
    System.out.print("numItems is now: " + myList.size() + "\n\n");
  }

  public static void printList(SortedStringListReferenceBased_solution myList)
  {
   //method prints a list, numbering the values,  e.g, "0.  milk" .... "4.  juice".... etc.
    for (int index = 0; index < myList.size(); index++)
    {
      System.out.printf("%2d. %s\n",index, (String) myList.get(index));
    }
  }

}
公共类SortedStringListDriver
{
公共静态void main(字符串[]args)
{
SortedStringListArrayBased myGroceryList=新建SortedStringListArrayBased();
SortedStringListReferenceBased myGroceryList=新建SortedStringListReferenceBased();
myGroceryList.添加(“牛奶”);
myGroceryList.添加(“鸡蛋”);
myGroceryList.添加(“黄油”);
myGroceryList.add(“山核桃”);
myGroceryList.添加(“苹果”);
myGroceryList.添加(“面包”);
myGroceryList.添加(“鸡肉”);
myGroceryList.add(“黑豆”);
myGroceryList.添加(“大米”);
myGroceryList.添加(“香肠”);
添加(“面粉”);
打印列表(myGroceryList);//打印出原始列表
System.out.print(“基于数组的列表的numItems现在是:“+myGroceryList1.size()+”\n\n”);
添加(myGroceryList,“果汁”);
移除(myGroceryList,“果汁”);
添加(myGroceryList,“香蕉”);
移除(myGroceryList,“香肠”);
移除(myGroceryList,“奶酪”);
}
公共静态空白添加(SortedStringListReferenceBased_解决方案myList,String str)
{
System.out.println(“添加“+str+”);
myList.add(str);//添加果汁
打印列表(myList);
System.out.print(“基于数组的列表的numItems现在是:“+myList.size()+”\n\n”);
}
公共静态无效删除(基于SortedStringListReferenceU解决方案myList、String str)
{
System.out.println(“删除“+str+”);
myList.remove(str);
打印列表(myList);
System.out.print(“numItems现在是:“+myList.size()+”\n\n”);
}
公共静态无效打印列表(SortedStringListReferenceBased_解决方案myList)
{
//方法打印一个列表,对值进行编号,例如,“0.牛奶”…“4.果汁”。
对于(int index=0;index
看了作业后,我认为这是需要的:


您需要设置一个变量,该变量可以是基于
SortedStringListArrayBased
SortedStringListReferenceBased
。但是这两个都实现了
SortedStringListInterface
,因此变量将被声明为
SortedStringListInterface
。您可以将变量指定给其中一个

SortedStringListInterface myGroceryList;
if (iWantAnArray)  // I have no idea how to determine this
    myGroceryList = new SortedStringListArrayBased();
else
    myGroceryList = new SortedStringListReferenceBased();
注意,当您将
myGroceryList
声明为
sortedString ListInterface
,这意味着无论是什么类,变量都可以引用实现该接口的任何对象。这可能就是你主题行中问题的答案

完成后,您可以添加您的项目:

myGroceryList.add("milk");
myGroceryList.add("eggs");
...

它将调用
SortedStringListArrayBased
add
方法或
SortedStringListReferenceBased
方法,具体取决于您将
myGroceryList
设置为哪种对象。这就是多态性——它在运行时根据实际类选择实际发生的
add
方法


add
调用(和其他调用)列表在您的程序中只应出现一次。但是如果你想做两次,每种列表一次,你可以把它放在一个主程序调用两次的方法中。或者,您可以使列表的类型依赖于
args
中的参数,并运行该程序两次。我不知道教授想要什么。但是这一部分可以很容易地更改。

基本上,UML图显示您有一个接口,然后有两个类实现该接口,箭头表示。一个接口让你说“嘿,实现这个接口的东西会有这些方法,我会在接口代码中留空”接口是一种通过实现类(es)方法来填充的方式。所以你的教授给了你这个界面,由你来决定每门课应该如何“添加”或“删除”一些东西?如果椅子实现了可移动界面,它应该如何移动?这取决于实现接口的类。如果实现它的类是“WheeledChair”,那么move()可能是“push the darn chair”,但是如果实现了可移动接口,“WoodLeggedChair”可能是“捡起它,这样你就不会刮地板了!”所以你需要决定在每个类中应该如何实现这些方法。这就是接口的要点——当您知道实现接口的东西可能需要以不同的方式处理数据时,定义一组空的方法或行为。通过这种方式,您可以确保实现这些方法,但将实现的详细信息留给实现类来处理,这些类现在可以工作了。这不完全是我想做的,但已经足够近了

public class SortedStringListDriver
{

  public static void main(String [] args)
  {
    SortedStringListArrayBased myGroceryList1 = new SortedStringListArrayBased();
    SortedStringListReferenceBased myGroceryList2 = new SortedStringListReferenceBased();

    myGroceryList1.add("milk");
    myGroceryList1.add("eggs");
    myGroceryList1.add("butter");
    myGroceryList1.add("pecans");
    myGroceryList1.add("apples");
    myGroceryList1.add("bread");
    myGroceryList1.add("chicken");
    myGroceryList1.add("black beans");
    myGroceryList1.add("rice");
    myGroceryList1.add("sausage");
    myGroceryList1.add("flour");

    myGroceryList2.add("milk");
    myGroceryList2.add("eggs");
    myGroceryList2.add("butter");
    myGroceryList2.add("pecans");
    myGroceryList2.add("apples");
    myGroceryList2.add("bread");
    myGroceryList2.add("chicken");
    myGroceryList2.add("black beans");
    myGroceryList2.add("rice");
    myGroceryList2.add("sausage");
    myGroceryList2.add("flour");

    printList(myGroceryList1);
    printList(myGroceryList2);//print out original List
    System.out.print("numItems for array based list is now: " + myGroceryList1.size() + "\n");
    System.out.print("numItems for referenced based list is now: " + myGroceryList2.size() + "\n\n");

    adding(myGroceryList1, "juice");
    adding(myGroceryList2, "juice");
    removing(myGroceryList1, "juice");
    removing(myGroceryList2, "juice");
    adding(myGroceryList1, "banana");
    adding(myGroceryList2, "banana");
    removing(myGroceryList1, "sausage");
    removing(myGroceryList2, "sausage");
    removing(myGroceryList1, "cheese");
    removing(myGroceryList2, "cheese");
  }

  public static void adding(SortedStringListInterface myList, String str)
  {
    System.out.println("Adding " + str + " ...");
    myList.add(str);  //add juice
    printList(myList);
    System.out.print("numItems for array based list is now: " + myList.size() + "\n\n");
  }

  public static void removing(SortedStringListInterface myList, String str)
  {
    System.out.println("Removing " + str + " ...");
    myList.remove(str);
    printList(myList);
    System.out.print("numItems is now: " + myList.size() + "\n\n");
  }

  public static void printList(SortedStringListInterface myList)
  {
    //method prints a list, numbering the values,  e.g, "0.  milk" .... "4.  juice".... etc.
    for (int index = 0; index < myList.size(); index++)
    {
      System.out.printf("%2d. %s\n\n",index, (String) myList.get(index));
    }
  }

}
公共类SortedStringListDriver
{
公共静态void main(字符串[]args)
{
SortedStringListArrayBased myGroceryList1=新建SortedStringListArrayBased();
SortedStringListReferenceBased myGroceryList2=新建SortedStringListReferenceBased();
MyGroceryList 1.添加(“牛奶”);
MyGroceryList 1.添加(“鸡蛋”);
myGroceryList1.添加(“黄油”);
myGroceryList1.添加(“山核桃”);
MyGroceryList 1.添加(“苹果”);
MyGroceryList 1.添加(“面包”);
myGroceryList1.添加(“鸡肉”);
MyGroceryList 1.添加(“黑豆”);
MyGroceryList 1.添加(“大米”);
MyGroceryList 1.添加(“香肠”);
myGroceryList1.添加(“面粉”);
MyGroceryList 2.添加(“牛奶”);
MyGroceryList 2.添加(“鸡蛋”);