2011-11-02 113 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

抽象类永远不能实例化。其唯一目的是延长。在抽象类中,如果指定至少一个抽象方法,那么需要将整个类指定为抽象类。抽象类允许您在同一个类中实现和未实现(抽象)方法。如果类中的所有方法都是抽象的,那么你实际上有一个接口,并且接口中声明的任何变量都被视为常量。您的问题中的变量不会被继承,因为它们对抽象类是私有的。您必须通过抽象类的方法访问它们。