2014-02-22 103 views
1

我想建立一个程序,有一定的要求,主要是我有一个类,然后使一个子类,添加一个功能。我创建了类DVD,然后创建了子类。子类和超类

我正在添加一种方法将年份添加到列表中,以及将添加到打印的最终库存值的库存费用。我构建了子类,创建了覆盖方法,但它不会被添加到显示的输出中。不仅如此,它还是将输入年份放在错误的地方。我没有得到任何错误,它只是像子类不存在的行为,尽管我的DVD类说,一些方法被覆盖。

我在想,我必须错过一些我应该调用新方法的地方,也许我错误地阅读了资源,但听起来像我只需要调用DVD类,并且我想覆写的方法将被自动覆盖。我宁愿只将这些信息添加到超类中,但这是分配的一项要求。

所以我想知道如何真正去调用这些重写方法,当我需要他们添加这些新功能?我不断看到资源告诉我如何创建它们,但实际上并没有实现它们。

从我的主要方法,我称之为DVD类,然后打印它。但是,它只打印原始dvd类中的内容,除了将年份添加到产品ID所在的位置之外。

public class DVD { 



String name; 
int id; 
int items; 
double cost; 

//default constructor 
public DVD() { 
    name = ""; 
    id = 0; 
    items = 0; 
    cost = 0.0; 
}//end default constructor 

//constructor to initialize object 
public DVD(String dvdName, int itemNum, int quantity, double price) { 
    name = dvdName; 
    id = itemNum; 
    items = quantity; 
    cost = price; 
}//end constructor 


//method to calculate value 
public double getInventoryValue() { 
     return items * cost; 
} 

//method to set name 
public void setdvdName(String dvdName){ 
    this.name = dvdName; 
} 

//method to get name 
public String getName(){ 
    return name; 
} 

//method to set id 
public void setitemNum(int itemNum){ 
    this.id = itemNum; 
} 

//method to get id 
public int getId(){ 
    return id; 
} 

//method to set items 
public void setquantity(int quantity){ 
    this.items = quantity; 
} 

//method to get items 
public int getItems(){ 
    return items; 
} 

//method to set cost 
public void setprice(double price){ 
    this.cost = price; 
} 

//method to get cost 
public double getCost(){ 
    return cost; 
} 

/** 
* 
* @return 
*/ 

public String toString() { 

    return "DVD Name: " + getName() + 
      "ID: " + getId() + 
      "Items: " + getItems() + 
      "Cost: " + getCost() + 
      "Total Value: " +getInventoryValue(); 
} 
} 

-

public class ExtendedDVD extends DVD{ 
double restockFee; 
int year; 

public ExtendedDVD(){ 
    year = 0; 
} 
public ExtendedDVD(int year) { 
    this.year = year; 
} 

public void setRestockFee(){ 
    this.restockFee = 0.05; 
} 

public double getRestockFee(){ 
    return restockFee; 
} 


public void setYear(){ 
    this.year = 0; 
} 

public int getYear(){ 
    return year; 
} 

@Override 
public double getInventoryValue(){ 
    double value1 = super.getInventoryValue(); 
    double value = restockFee * value1; 
    double totalInventoryValue = value + super.getInventoryValue(); 
    return totalInventoryValue; 
} 

@Override 
public String toString(){ 
    return super.toString() + "Year" + getYear(); 
} 
} 

}

public class Inventory { 

DVD[] inventory = new DVD[5]; 
int current = 0; 
private int len; 

public Inventory(int len){ 
    inventory = new DVD[len]; 

} 

public double calculateTotalInventory() { 
    double totalValue = 0; 
    for (int j = 0; j < inventory.length; j++) 
     totalValue += inventory[j].getInventoryValue(); 
    return totalValue; 
} 

/** 
* 
* @param dvd 
* @throws Exception 
*/ 
public void addDVD(DVD dvd) throws Exception { 
    if (current < inventory.length) { 
     inventory[current++]=dvd; 
    }else { 
     Exception myException = new Exception(); 
     throw myException; 

    } 
    } 
void sort() { 
     for (DVD inventory1 : inventory) { 
     len = current; 
    } 

     for (int i=0; i<len;i++) { 
     for(int j=i;j<len;j++) { 
      if (inventory[i].getName().compareTo(inventory[j].getName())>0) { 
       DVD temp = inventory[j]; 
       inventory[j] = inventory[i]; 
       inventory[i] = temp; 
      } 
     } 
    } 
} 




    public int getNumberOfItems() { 
    return current; 
} 


    public void printInventory() { 
    System.out.println("Current Inventory:"); 
    for(int i=0;i<current;i++) { 
     System.out.println(inventory[i]); 
    } 
    System.out.println("The total value of the inventory is:"+calculateTotalInventory()); 
    } 
} 

-

public class inventoryprogram1 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args){ 


    boolean finish = false; 
    String dvdName; 
    int itemNum; 
    int quantity; 
    double price; 
    int year = 0; 

    Inventory inventory = new Inventory(5); 
    while (!finish) { 
     Scanner input = new Scanner(System.in); // Initialize the scanner 
     System.out.print("Please enter name of DVD: "); 
     dvdName = input.nextLine(); 
     if (dvdName.equals("stop")) { 
      System.out.println("Exiting Program"); 
      break; 
     } else { 
      System.out.print("Please enter Product Number: "); 
      itemNum = input.nextInt(); 
      System.out.print("Please enter units: "); 
      quantity = input.nextInt(); 
      System.out.print("Please enter price of DVD: "); 
      price = input.nextDouble(); 
      System.out.print("Please enter production year: "); 
      itemNum = input.nextInt(); 

      DVD dvd= new DVD(dvdName,itemNum,quantity,price); 

      try { 
       inventory.addDVD(dvd); 
      }catch(Exception e) { 
       System.out.println("Inventory is full."); 
       break; 
      } 

      System.out.println("DVD: " + dvd); 

     }//end else 

    } 
     inventory.sort(); 
     inventory.printInventory(); 
} 
} 
+3

如果您从未创建任何ExtendedDVD,那么很明显,没有任何方法e ExtendedDVD类将永远被调用。 –

回答

1

另一个构造函数,如果你想使用在ExtendedDVD你写的新方法需要实例化那个类,你仍然在调用原始DVD类,所以你仍然会得到这些方法。

例如

DVD dvd = new DVD(dvdName, itemNum, quantity, price); 

DVD Dvd = new ExtendedDVD(dvdName, itemNum, quantity, price); 

是两回事

此外,如果你在你的主要方法看起来要分配itemNum两次,这就是为什么它显示你的年份

+0

感谢您的支持,我复制了一些内容,以便更快速地完成错过。 这是我感到困惑的地方。即使在oracle文档中也没有解释如何实例化它,我不确定它是否与它的超类一起被调用,或者如果我必须专门调用它。 – Laterali

+0

我认为如果你一直在编写代码,所有人都很难看到它,而你的欢迎 –

1

在main方法你只是实例化一个DVD对象,而不是一个ExtendedDVD对象。

更换

DVD dvd= new DVD(dvdName,itemNum,quantity,price); 

通过类似

DVD dvd= new ExtendedDVD(year); 

而且很明显,你可能想在ExtendedDVD