0

我有这两个类:

class Parent
{ 
   protected static String table;

   public static long getRow()
   {
      String query = "SELECT * FROM " + table + " WHERE id =? " ;
      //other code...
   }
}

然后我扩展这个类:

class Child extends Parent
{
    protected static String table = "tableName";
   //other code..
}

但是,当我尝试这样做时:

long id = Child.getRow();

我收到一个错误,因为查询正在将“null”放入table应该是值的位置。即SELECT * FROM null

我认为table在子类中设置的值会导致它在它继承的方法中也被更新,但显然不是。我需要做什么来解决这个问题?

4

4 回答 4

1

实例变量(也是静态变量)是not overridden in your subclass. 如果它们被标记为受保护、公共或默认,它们仅在您的子类中可见。多态性和继承不适用于实例变量。为了让您的代码正常工作,唯一的选择是让您的 getRow() 方法在您的子类中公开覆盖它

于 2013-02-10T23:10:05.017 回答
1

您不能以这种方式覆盖变量。在您的示例中,每个类都有自己的table变量版本,并且在getRow定义方法的父级中,变量未定义。这是您可以使用的更好的设计:

abstract class Parent {

   public abstract String getTable();

   public static long getRow() {
      String query = String.format("SELECT * FROM %s WHERE id = ?", getTable()) ;
      //other code...
   }
}

class Child extends Parent {
    public String getTable() {
        return "tableName";
    }
}
于 2013-02-10T23:13:14.080 回答
0

用 getter/setter 方法替换裸字段访问。

当您覆盖子类中的 getter/setter 时,您可以控制它读取和写入的变量。

Java 不提供对字段访问的这种级别的控制。

于 2013-02-10T23:09:49.590 回答
0

只是一件小事。在方法内部,您可以使用 super 访问阴影字段。如果将此代码放在 Child 类中:

public void foo() {

    this.table="this belongs to the child";
    super.table="this belongs to the parent";
}

请注意 this.table 和 super.table 是不同的。无论如何,不​​建议使用阴影字段。

于 2013-02-10T23:16:16.377 回答