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()
在的构造函数User
中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
(每个模型类一个)来相应地设置字段。然后,您创建所有dao的单例实例。
以上是 Java:重写父类的静态变量? 的全部内容, 来源链接: utcz.com/qa/408391.html