Java Android教程包含一个静态代码块,其原因是什么?

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本身被声明为静态的。对吗?

我正在努力

我已经让它工作了,但在第9.4节中,我们构建了一个扩展ContentProvider的类。 如果您查看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);
   }