Java中的抽象变量?

2022-08-31 15:34:06

我来自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,这是获取一些数据的地方。例如:表名=“联系人”;
    等。。。

答案 1

在抽象类中定义一个构造函数,该构造函数设置字段,以便具体实现符合调用/重写构造函数所需的规范。

例如:

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

扩展 时,该类将不会编译,直到您添加一个调用 的构造函数。AbstractTablesuper("somename")

public class ConcreteTable extends AbstractTable {
    private static final String NAME = "concreteTable";

    public ConcreteTable() {
        super(NAME);
    }
}

这样,实现者就需要设置 。这样,您还可以在抽象类的构造函数中执行(null)检查,以使其更加可靠。例如:name

public AbstractTable(String name) {
    Objects.requireNonNull(name, "Name may not be null");
    this.name = name;
}

答案 2

我认为您的困惑在于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 中)。也不能重写静态成员,无论它们是字段还是方法。因此,这也是最好的解决方案。我更改了上面的初始化方法示例以演示如何使用它 - 再次,将getXXX方法视为属性。