当前位置: 首页 > 面试题库 >

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

桑坚
2023-03-14
问题内容

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

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类X中不使用任何setter/getter。当一个线程a具有类X的类级锁时,另一个线程B是否可以直接更改我的静态变量?? 假设线程A现在有类级锁。我可以从另一个线程B执行X.static\u variable=11吗? 我正在编写一段代码,以在java中获得死锁。 公共类A实现Runnable{ } } 公共类B实现Runnable{ } 但得到以下结果: 第二个有对象b的钥匙和等

  • 为什么输出是"静态A"?

  • rank ▲ ✰ vote url 26 568 149 609 url 类里的静态变量 有可能在python中类有静态变量或方法?用什么语法实现? 变量是在类定义时声明的,不是在类方法或静态变量中: >>> class MyClass: ... i = 3 ... >>> MyClass.i 3 上面的"i"变量是类级别的,所以它是和所有实体级的"i"变量是不一样的,你可以: >>>

  • 问题内容: 根据Java,静态变量可以通过类名访问,但是即使Java不建议使用静态变量,类对象也可以访问它们,并且给出相同的答案。 我知道该变量只有一个副本,并且所有对象和其他事物的值都相同。Java为什么建议使用类名而不是类对象? 问题答案: 因为可能会造成混淆!静态成员上没有动态调度。 看一下这个令人困惑的代码:(可能是语法错误;我的Java生锈了) 看起来很混乱,因为方法似乎是多态的,所以输

  • 本文向大家介绍C++之类的静态变量,包括了C++之类的静态变量的使用技巧和注意事项,需要的朋友参考一下 成员变量 通过对象名能够访问public成员变量 每个对象都可以有只属于自己的成员变量 成员变量不能在对象之间共享 类的静态成员 静态成员变量 存储在 全局数据区 以上所述就是本文的全部内容了,希望大家能够喜欢。