我正在尝试构建一个具有某些要求的程序,主要是我有一个类,然后创建一个添加功能的子类。我创建了类DVD,然后创建了子类。
我正在添加一种方法来将年份添加到列表中,以及将要添加到打印的最终库存值中的重新进货费用。我构建了子类,创建了重写方法,但它没有被添加到显示的输出中。不仅如此,它还将输入年份置于错误的位置。我没有得到任何错误,它只是像子类不存在的行为,即使我的DVD类说有些方法被覆盖。
我在想我必须错过我应该调用新方法的东西,也许我读错了资源,但听起来我只需要调用DVD类,我想要覆盖的方法就是被自动覆盖。我更愿意将这些信息添加到超类中,但这是分配的必要条件。
所以我想知道当我需要添加这些新功能时,我如何实际调用这些覆盖方法?我一直在看资源告诉我如何创建它们,但实际上并没有实现它们。
从我的main方法,我调用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();
}
}
答案 0 :(得分:1)
在main方法中,您只需实例化DVD
对象,而不是ExtendedDVD
对象。
替换
DVD dvd= new DVD(dvdName,itemNum,quantity,price);
类似
DVD dvd= new ExtendedDVD(year);
显然,您可能需要ExtendedDVD
答案 1 :(得分:1)
如果你想使用你在ExtendedDVD中编写的新方法,你需要实例化那个仍在调用原始dvd类的类,这样你仍然可以获得这些方法。
例如
DVD dvd = new DVD(dvdName, itemNum, quantity, price);
和
DVD Dvd = new ExtendedDVD(dvdName, itemNum, quantity, price);
是两件不同的事情
如果您查看主要方法,那么您将分配itemNum两次,这就是为什么它会向您展示年份