子类和超类

时间:2014-02-22 06:52:30

标签: java inheritance subclass superclass

我正在尝试构建一个具有某些要求的程序,主要是我有一个类,然后创建一个添加功能的子类。我创建了类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();
}
}

2 个答案:

答案 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两次,这就是为什么它会向您展示年份