Java:重写父类的静态变量?

我有以下类别,将其用作项目中所有模型的基础:

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 = ?",它生成查询:“从空WHERE id =?中选择SELECT

ID”。因此,覆盖类中的table字段User似乎没有任何效果。

我该如何克服呢?如果我setTable()在BaseModel中添加了一个方法,并setTable()在的构造函数Usertable对其进行了调用,那么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(每个模型类一个)来相应地设置字段。然后,您创建所有dao的单例实例。

以上是 Java:重写父类的静态变量? 的全部内容, 来源链接: utcz.com/qa/408391.html

回到顶部