Java中的抽象变量?


问题内容

我来自c#,这很容易而且可能。

我有以下代码:

public abstract class clsAbstractTable {

    public abstract String TAG;
    public abstract void init();

}

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

我有这个课:

public class clsContactGroups extends clsAbstractTable {


}

我想要以这样的方式定义变量和方法,以使Eclipse 提示我 ,我没有实现抽象 变量 和方法。

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

编辑1

我将为不同的数据库表创建不同的类。每个类都应具有自己的TABLENAME变量,也不例外。每次创建扩展抽象类的新类时,都必须确保此变量是静态的。

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

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

这样的事情也应该解决

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

编辑2

我想要在每个类中定义的常量(静态),其名称以抽象形式定义。

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

问题答案:

我认为您的困惑在于C#属性与字段/变量。在C#中,即使在抽象类中,也无法定义抽象字段。但是,您可以定义抽象属性,因为它们是有效的方法(例如,编译为get_TAG()set_TAG(...))。

正如某些人提醒的那样,即使在C#中,您也不应该在类中包含公共字段/变量。有几个答案暗示了我的建议,但并不清楚。您应该使用getTAG()将您的想法转换为JavaBean属性的Java。然后,您的子类将必须实现这一点(我还编写了一个具有表类的项目来执行此操作)。

因此,您可以像这样定义一个抽象类…

public abstract class AbstractTable {

    public abstract String getTag();
    public abstract void init();

    ...
}

然后,在任何具体的子类中,您都需要定义一个静态最终变量(常量),并从中返回它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();
        ...
    }

}

编辑

您不能覆盖继承的字段(在C#或Java中)。您也不能覆盖静态成员,无论它们是字段还是方法。因此,这也是最佳解决方案。我更改了上面的init方法示例,以显示该方法的用法-
再次将getXXX方法视为属性。