Java:覆盖父类的静态变量?

标签 java oop static static-members

我有以下类作为项目中所有模型的基础:

public abstract class BaseModel
{
    static String table;
    static String idField = "id";       

    public static boolean exists(long id) throws Exception
    {
        Db db = Util.getDb();
        Query q = db.query();
        q.select( idField ).whereLong(idField, id).limit(1).get(table);

        return q.hasResults();
    }

    //snip..
}

然后我尝试通过以下方式从中扩展:

public class User extends BaseModel
{
    static String table = "user";
    //snip
}

但是,如果我尝试执行以下操作:

if ( User.exists( 4 ) )
   //do something

然后,它不是查询:“SELECT id FROM user WHERE id = ?”,而是生成查询:“SELECT id from null WHERE id = ?”。因此,覆盖 User 类中的 table 字段似乎没有任何效果。

我该如何克服这个问题?如果我向 BaseModel 添加一个 setTable() 方法,并在 User 的构造函数中调用 setTable(),那么 的新值将code>table 也可用于 User 类的所有方法吗?

最佳答案

您不能覆盖 Java 中任何类型的静态方法或字段。

public class User extends BaseModel
{
    static String table = "user";
    //snip
}

这将创建一个新字段 User#table,它恰好与 BaseModel#table 同名。大多数 IDE 都会对此发出警告。

如果您更改 BaseModel 中字段的值,它也将应用于所有其他模型类。

一种方法是使用通用的基方法

protected static boolean exists(String table, long id) throws Exception
{
    Db db = Util.getDb();
    Query q = db.query();
    q.select( idField ).whereLong(idField, id).limit(1).get(table);

    return q.hasResults();
}

并在子类中使用

public static boolean exists(long id)
{
    return exists("user", id);
}

如果你想使用字段方法,你必须创建一个 BaseDAO 类并有一个 UserDAO(每个模型类一个)来相应地设置字段。然后创建所有 daos 的单例实例。

关于Java:覆盖父类的静态变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19457114/

相关文章:

java - 表没有保存到我的解析服务器上?

javascript - 原型(prototype)数组参数

php - 从 PHP 类中的静态函数访问静态数组的正确方法

java - 关于Java类的问题

C# 从注册表中获取不带参数的值

python - 服务器启动时在 Django 中创建一次对象并在整个过程中使用它

java - 计算随机尝试

java - Oracle 序列可以为空吗?

java - 从方法中获取恒定的错误值

java - 我的电磁 java 应用程序的明智的 OO 设计? (有点数学)