Java中的抽象variables?

我来自C#这很容易,可能的。

我有这个代码:

public abstract class clsAbstractTable { public abstract String TAG; public abstract void init(); } 

但Eclipse告诉我我使用非法修饰符。

我有这个class级:

 public class clsContactGroups extends clsAbstractTable { } 

我想以这种方式定义variables和方法,即Eclipse来提示我 ,我没有实现抽象variables和方法。

我如何定义我的抽象类,以便提示实现摘要?

编辑1

我将为不同的数据库表创build不同的类。 每个类应该有它自己的TABLENAMEvariables,没有例外。 当我创build一个扩展抽象类的新类时,我必须确保这个variables是静态的。

然后在抽象类中,我将有一个方法,例如:init();

如果在这个init()方法中我调用TABLENAME,它应该从子类中取值。

像这样的事情也应该解决

 String tablename=(clsAbstract)objItem.TABLENAME; // where objItem can be any class that extended clsAbstract; 

编辑2

我想在每个类中定义一个常量(静态),它的名称在抽象中定义。

  • 我在抽象中定义variablesTABLENAME,但没有给出值。
  • 我创build了一个clsContactGroups,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME =“contactgroups”;
  • 我创build了第二个类clsContacts,我应该提示实现TABLENAME,这是获取一些数据的地方。 例如:TABLENAME =“联系人”;
    等等…

我认为你的困惑是与C#属性与字段/variables。 在C#中,不能定义抽象字段,即使在抽象类中也是如此。 但是,您可以定义抽象属性,因为这些属性是有效的方法(例如编译为get_TAG()set_TAG(...) )。

正如有些人提醒的那样,即使在C#中,也不应该在类中使用公共字段/variables。 有几个答案暗示了我会推荐的内容,但还没有说清楚。 您应该使用getTAG()将您的想法作为JavaBean属性转换为Java。 那么你的子类将不得不实现这个(我也写了一个表类的项目这样做)。

所以你可以有一个像这样定义的抽象类…

 public abstract class AbstractTable { public abstract String getTag(); public abstract void init(); ... } 

然后,在任何具体的子类中,你需要定义一个静态的最终variables(常量),并从getTag()返回,如下所示:

 public class SalesTable extends AbstractTable { private static final String TABLE_NAME = "Sales"; public String getTag() { return TABLE_NAME; } public void init() { ... String tableName = getTag(); ... } } 

编辑

您不能覆盖inheritance的字段(在C#或Java中)。 你也不能重写静态成员,不pipe它们是字段还是方法。 所以这也是最好的解决scheme。 我改变了上面的init方法示例,以显示如何使用这个方法 – 同样,将getXXX方法看作一个属性。

在抽象类中定义一个构造函数来设置字段,以便具体实现按照调用/覆盖构造函数所需的规范。

例如

 public abstract class AbstractTable { protected String name; public AbstractTable(String name) { this.name = name; } } 

扩展AbstractTable ,只有在添加调用super("somename")的构造函数时才能编译该类。

 public class ConcreteTable extends AbstractTable { private static final String NAME = "concreteTable"; public ConcreteTable() { super(NAME); } } 

这样实现者需要设置name 。 通过这种方式,您也可以在抽象类的构造函数中进行(空)检查,使其更加健壮。 例如:

 public AbstractTable(String name) { if (name == null) throw new NullPointerException("Name may not be null"); this.name = name; } 

没有Java(或C ++)中的抽象variables。

如果父类有一个variables,并且一个子类扩展了父类,那么孩子不需要实现这个variables。 它只需要访问父项的实例。 获取/设置或保护访问将做。

“…所以我应该提示执行摘要”? 如果你扩展一个抽象类而不能实现一个抽象方法,编译器会告诉你要么实现它,要么把子类标记为抽象类。 这就是你会得到的所有提示。

只需将此方法添加到基类

 public abstract class clsAbstractTable { public abstract String getTAG(); public abstract void init(); } 

现在每个扩展基类的类(不想抽象)都应该提供一个TAG

你也可以用BalusC的答案

你可以做的最好的是有variables的访问器/增变器。
getTAG()
这样,所有的实施类将不得不执行它们。

抽象类用于定义抽象行为而不是数据。

由于没有variables的实现,所以不能抽象;)

为什么你想要所有的子类来定义variables? 如果每个子类都应该有它,只需在超类中定义它。 顺便说一下,考虑到不pipe怎么说,不要暴露田地是好的OOP练习,你的问题就更没有意义了。

将代码更改为:

 public abstract class clsAbstractTable { protected String TAG; public abstract void init(); } public class clsContactGroups extends clsAbstractTable { public String doSomething() { return TAG + "<something else>"; } } 

这样,所有inheritance这个类的类都会有这个variables。 你可以做200个子类,每个子类都有这个variables。

注意:不要使用CAPS作为variables名; 普遍的看法是所有的标识符都是指常量,即不可改变的数据。

要添加每类元数据,也许注释可能是正确的方法。

但是,不能在接口中强制实现注释,就像无法强制使用静态成员或存在特定的构造函数一样。

在java中定义抽象属性有两种方法, 没有将属性标记为抽象。

第一种方法:在抽象类中定义一个参数化的构造函数,如下所示:

 public abstract class clsAbstractTable { private String TAG; public clsAbstractTable (String TAG) { this.TAG= TAG; } } 

在抽象类中定义参数化构造函数时,子类被迫定义自己的构造函数并调用超级构造函数,从而传递它们自己的TAG

第二种方法:将属性定义为getter方法,如下所示:

 public abstract class clsAbstractTable { public abstract String getTAG(); } 

这样TAG属性的值就被委托给每个具体类定义了。

来源: 在java中定义一个抽象属性

不,Java不支持抽象variables。 这也没有什么意义。

variables的“实现”到底需要一个子类来做什么具体的改变?

当我在基类中有一个abstract Stringvariables时,子类应该做些什么来使其非抽象?