2014-09-25 40 views
0

基本上,我創建了一個抽象類Ticket以防止Ticket類的實例化。這個Ticket類是WalkupTicket的超類。我應該執行TicketMain課程來打印WalkupTicket的價格和門票號碼。而我不允許將price作爲參數傳遞給構造函數。以下是我寫的代碼。但是,實例變量price從未得到更新。我不知道哪裏出了問題。Java面向對象編程:未能更新實例變量

我相信我必須在繼承/多態性方面有一些誤解。請指出我的錯誤。謝謝。

public abstract class Ticket{ 
     // Fields 
     private int tixNumber; 
     private double price; 

     // Constructor 
     public Ticket(int tixNumber){ 
      this.tixNumber = tixNumber; 
     } 

    // Instance method 
    public double getPrice(){ 
      return price; 
    } 

    public int getTixNumber(){ 
      return tixNumber; 
    } 

     public String toString(){ 
      return "Number: " + getTixNumber() + ", Price: " + getPrice(); 
    }   
} 

public class WalkupTicket extends Ticket{ 
    // Fields 
    private double price; 

    // Constructor 
    public WalkupTicket(int tixNumber){ 
     super(tixNumber); 
     this.price = 50.0; 
    } 
} 

public class TicketMain{ 
     public static void main(String[] args){ 
      WalkupTicket ticket1 = new WalkupTicket(2); 
      System.out.println(ticket1.toString()); 
     } 
} 

輸出是:

Number: 2, Price: 0.0 

這不是我想要的。我想輸出是:

Number: 2, Price: 50.0 

回答

3

領域priceWalkupTicket值不是從Ticket訪問,你需要重寫getPrice方法......比如......

public class WalkupTicket extends Ticket{ 
    // Fields 
    private double price; 

    // Constructor 
    public WalkupTicket(int tixNumber){ 
     super(tixNumber); 
     this.price = 50.0; 
    } 

    public double getPrice() { 
     return price; 
    } 
} 

更好的解決方案是在Ticket類中提供protected方法,該方法允許您設置price值...

public abstract class Ticket{ 
    //... 
    protected void setPrice(double price) { 
     this.price = price; 
    } 
    //... 
} 

那麼你就不需要在WalkupTicketprice變量的一切,只需通過設置在二傳手的price值...

public class WalkupTicket extends Ticket{ 

    // Constructor 
    public WalkupTicket(int tixNumber){ 
     super(tixNumber); 
     setPrice(50.0); 
    } 
} 
+0

非常感謝你 – mynameisJEFF 2014-09-25 01:13:39

+0

@Chinegro希望它有幫助 – MadProgrammer 2014-09-25 01:15:43

1

你的價格區域是私有的,而一個在WalkupTicket也私人的,他們是兩個不同的領域。

「private」意味着任何人都無法訪問它,甚至不能訪問子類,所以你有兩個截然不同的「價格」字段,分配給另一個。

有很多方法可以做你想做的。

如果該字段需要被子類訪問,則聲明該字段爲protected double price;並僅在Ticket類上聲明該字段。

如果你想使價格多變,但不能讓子類自由訪問它,然後在售票添加setter:

public void setPrice(double price) { 
    this.price = price; 
} 

最終,像以前一樣,如果你想在二傳手只可調用按子類,使用保護而不是公共。

如果你想要一個稍微不同而又不常見的方法,請重寫getter,因爲你用來訪問該字段的是getter。於是在課上WalkupTicket:

public double getPrice() { 
    return this.price; 
} 

的代碼是一樣的,在票務類,吸氣,但此getter將覆蓋舊,並返回WalkupTicket的價格領域。但是..它可以工作,用它來理解事情的工作方式,但不要在實踐中這樣做,因爲在這種情況下它只會使代碼難以閱讀。