我对抽象数据类型的概念相当陌生,因为我在网上找不到任何好的例子。
从我的理解,子类继承了抽象中的所有方法和变量,但我认为我误解了这一点。例如,我正在使用抽象数据类型MenuItem
创建菜单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;
}
我知道这是不正确的,但有人可以告诉我为什么吗?子类汉堡包是仅继承方法还是什么?
答案 0 :(得分:2)
有几个问题:
itemName
等人private
,所以即使他们继承,他们也不会可见到子类。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)
}
}
最后,我要说的是,不是使用抽象基类和一堆具体类,而是使用MenuItem
的单个具体类并使Hamburger
等等更好>该类的实例。
答案 1 :(得分:1)
问题在于MenuItem
父类中字段的可见性。 private
可见性意味着任何其他类(包括自己的子类)都看不到它们。
为了使您的文件可见于子类,您必须将其可见性更改为protected
。请注意,这使得字段对同一个包中的所有类都可见。
更详细地介绍了所有memeber可见性问题in this article
答案 2 :(得分:1)
根据我的理解,子类继承了抽象中的所有方法和变量,但我认为我误解了这个
是的,您对错误理解的理解是正确的。 : - )
java中的子类不继承私有成员变量。他们只受公众和受保护的成员。答案 3 :(得分:0)
itemName
,costPer
和ct
被声明为私人访问字段。它们只能在定义的类中访问。如果您使用protected
访问权限声明它们,您将能够访问它们。
如Java语言规范中的定义,6.6 Access Control
部分引用(类,接口或数组)类型的成员(类,接口,字段或方法)或类类型的构造函数只有在类型可访问且成员或构造函数声明为允许访问:
- ...
- (否则,)如果成员或构造函数被声明为private,则当且仅当它发生在包含成员或构造函数声明的顶级类(第7.6节)的主体内时才允许访问。
- ...
答案 4 :(得分:0)
在开始研究抽象类型之前,先从封装的概念开始,并尝试理解它,因为它(被许多人)认为是面向对象设计中最重要的概念,其次是多态和继承。如果类成员是私有的,则没有子类可以直接访问它们。
答案 5 :(得分: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;
}
}
答案 6 :(得分:0)
永远不能实例化抽象类。其唯一目的是延长。在抽象类中,如果将至少一个方法指定为抽象,则需要将整个类指定为抽象。抽象类允许您在同一个类中实现和未实现(抽象)方法。如果类中的所有方法都是抽象的,那么您实际上有一个接口,并且在接口中声明的任何变量都被视为常量。您的问题中的变量不会被继承,因为它们是抽象类的私有。您必须通过抽象类的方法访问它们。