java - 调用构造函数并初始化数据库名称
问题描述
我不明白以下代码片段是如何工作的:
public class GroceryDBHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "grocerylist.db";
public static final int DATABASE_VERSION = 1;
public GroceryDBHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
}
即:首先,继承自SQLiteOpenHelper类应该调用构造函数,与该类的构造函数相同。在这种情况下,构造函数只接受上下文变量。但仍然可以正常工作。
其次:我的类继承自 SQLiteOpenHelper 类。在 SQLiteOpenHelper 类中,成员变量是私有的,所以它们不会被我的类继承。所以我没有负责数据库名称的成员变量。另外,我之前给出的构造函数没有初始化数据库名称,但是当我使用方法dbHelper.getDatabaseName();
时,我实际上得到了正确的数据库名称。这是怎么回事?
解决方案
这一行:super(context, DATABASE_NAME, null, DATABASE_VERSION);
正在调用父类的构造函数SQLiteOpenHelper
。
您的类中有两个常量DATABASE_NAME
,DATABASE_VERSION
它们被传递给父构造函数,这意味着构造函数不需要它们GroceryDBHelper
。构造函数不需要这些变量,因为无论在何处实例化此类,它们都将保持不变。
SQLiteOpenHelper
当您通过super()
调用 将这些变量传递给时,SQLiteOpenHelper
正在设置私有成员,这就是dbHelper.getDatabaseName();
返回正确结果的原因。
推荐阅读
- inno-setup - Inno Setup 语言文件 (isl) 中的完整预处理器支持
- python - 使用 BurpSuite 时 Python 请求 https:没有但代码 200 的代码 403
- javascript - 在 Angular 8 中,哪一种是 DOM 操作的最佳方式
- python - 来自 jupyter notebook 的漂亮打印 python 代码
- jquery - 如何将单击的元素定义为 $(this)?
- .net - 检查用户输入是否是 NeutralCultures 列表的一部分
- json - 如何从 LUIS V3 预测端点 json 反序列化 dateTimeV2 实体
- string - 字符串替换不适用于 if 语句
- groovy - 访问配置文件中的复杂键
- grafana - Oauth 用户的星型仪表板