2011-11-02 161 views
1

我對抽象數據類型的概念相當陌生,因爲我找不到任何好的示例。抽象數據類型問題

從我的理解,子類繼承了抽象的所有方法和變量,但我認爲我誤解了這一點。例如,我現在用的是抽象數據類型的菜單項

import javax.swing.*; 

public abstract class MenuItem{ 

    private String itemName; 
    private int ct; 
    private double costPer; 

    public String getItemName() 
    { 
     return itemName; 
    } 

    public int getCt() 
    { 
     return ct; 
    } 

    public double getCostPer() 
    { 
     return costPer; 
    } 
} 

public class Hamburger extends MenuItem{ 

    itemName = "Hamburger"; 
    ct = 0; 
    costPer = 4.99; 
} 

我知道這是不正確,但誰能告訴我,爲什麼創建菜單?子類漢堡包是隻繼承方法還是什麼?

回答

2

有幾個問題:

  1. itemName等人都private,所以儘管他們繼承,他們不是可見到子類。
  2. 您在Hamburger中使用的語法無效。

這裏是你如何能解決你的代碼:

public abstract class MenuItem{ 

    public MenuItem(String itemName, int ct, double costPer) { 
    this.itemName = itemName; 
    this.ct = ct; 
    this.costPer = costPer; 
    } 
    ... 
} 

public class Hamburger extends MenuItem{ 

    public Hamburger() { 
    super("Hamburger", 0, 4.99) 
    } 

} 

最後,我想說,而不是使用一個抽象基類和一堆具體類的,這將是更好地使用MenuItemHamburger實例的單個具體類。

+0

謝謝,我同意將它作爲一個具體的類來寫它會更容易,但我只是用它作爲澄清ADT的一個快速示例,謝謝。 –

1

問題在於MenuItem父類中字段的可見性。 private知名度意味着,他們不可見任何其他類包括自己的子類。

爲了使您的文件夾對子類可見,您必須將其可見性更改爲protected。請注意,這使得字段對同一包中的所有類都可見。

所有memeber知名度的問題涵蓋更詳細in this article

1

從我的理解,子類繼承了抽象的所有方法和變量,但我想我誤解這個

是的,你對你的誤解理解是正確的。 :-)

java中的子類不會繼承私有成員變量。他們只獲得公共和受保護的成員。

+0

有點技術上的區別,但是子類繼承私有成員和方法,它只是不能訪問它們。他們當然會獲得公共和受保護的成員變量以及方法。 – DJClayworth

+0

這是不正確的。閱讀規範:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.2 –

+0

@PaulMorie從上面的鏈接「聲明爲私有的類的成員不會被子類繼承該類別「。我的壞消息是在答案中缺少「私人」。 –

0

itemNamecostPerct被聲明爲私人訪問字段。他們只能在他們定義的班級內訪問。如果您以protected訪問權限聲明他們,則可以訪問它們。

如在Java語言規範定義的,部分6.6 Access Control

成員的引用(類,接口,或陣列)的(類,接口,字段或方法)型或類的構造函數類型是可訪問僅在類型是訪問和成員或構造被聲明爲允許訪問:

  • ...
  • (否則,)如果成員或構造函數聲明爲private,則允許訪問,如果只有如果它發生在包含成員或構造函數聲明的頂級類(§7.6)的主體內。
  • ...
0

你開始尋找到抽象類型之前,先從封裝的概念,並試圖瞭解它,因爲它被認爲是(很多)作爲對象的最重要的概念面向對象的設計,其次是多態性和繼承。如果類成員是私有的,那麼子類將不能直接訪問它們。

0

是的,Hamburger只繼承了方法。那是因爲他們是公開的。如果你把它們變成私有的(比如域),它們也不會被繼承。以下是解決問題的方法。

import javax.swing.*; 

public abstract class MenuItem { 

    //To be visible to subclasses, these need to be public, package-private, or protected 
    protected String itemName; 
    protected int ct; 
    protected double costPer; 

    public String getItemName() { 
     return itemName; 
    } 

    public int getCt() { 
     return ct; 
    } 

    public double getCostPer() { 
     return costPer; 
    } 

} 

public class Hamburger extends MenuItem { 

    //These assignments need to be inside a block, like a constructor 
    public Hamburger() { 
     itemName = "Hamburger"; 
     ct = 0; 
     costPer = 4.99; 
    } 

} 
0

抽象類永遠不能實例化。其唯一目的是延長。在抽象類中,如果指定至少一個抽象方法,那麼需要將整個類指定爲抽象類。抽象類允許您在同一個類中實現和未實現(抽象)方法。如果類中的所有方法都是抽象的,那麼你實際上有一個接口,並且接口中聲明的任何變量都被視爲常量。您的問題中的變量不會被繼承,因爲它們對抽象類是私有的。您必須通過抽象類的方法訪問它們。