Java Android教程包含一个静态代码块,其原因是什么?
我正在努力 我已经让它工作了,但在第9.4节中,我们构建了一个扩展ContentProvider的类。 如果您查看UriMatcher的声明和实例化位置,您将看到一个静态代码块Java Android教程包含一个静态代码块,其原因是什么?,java,android,static,Java,Android,Static,我正在努力 我已经让它工作了,但在第9.4节中,我们构建了一个扩展ContentProvider的类。 如果您查看UriMatcher的声明和实例化位置,您将看到一个静态代码块 static { sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS); sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID); } 我猜这是因为UriMatcher本身被声明为静态的。对吗?
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}
我猜这是因为UriMatcher本身被声明为静态的。对吗?
为什么在onCreate方法中不能调用静态代码块中的这两行代码?最后,像这样的静态代码块的一般用途是什么
下面是本课程的一个较大部分,用于一些上下文:
public class MyTodoContentProvider extends ContentProvider {
// database
private TodoDatabaseHelper database;
// used for the UriMacher
private static final int TODOS = 10;
private static final int TODO_ID = 20;
private static final String AUTHORITY = "de.vogella.android.todos.contentprovider";
private static final String BASE_PATH = "todos";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
+ "/" + BASE_PATH);
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE
+ "/todos";
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE
+ "/todo";
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}
@Override
public boolean onCreate() {
database = new TodoDatabaseHelper(getContext());
return false;
}
静态变量用于静态上下文,即静态块或静态方法。本教程的作者没有创建必须在某个地方调用的静态方法,而是创建了一个静态块,该静态块将在初始化类时调用,而不是在方法中显式调用。静态代码块在初始化类时(即加载类后)仅执行一次。但是
不会在调用onCreate时执行,因为该类已经初始化。在第一次使用该类时,静态块只执行一次。当不必为每个新实例执行代码时,可以将代码放入静态块中 它被称为静态初始值设定项。它可以为静态事物添加额外的初始化。
static {
sURIMatcher.addURI(AUTHORITY, BASE_PATH, TODOS);
sURIMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TODO_ID);
}