6

誰かが私に次のことを説明できますか?

public class Stuff
{
    static
    {
        try
        {
            Class.forName("com.mysql.jdbc.Driver");
        }
        catch ( ClassNotFoundException exception )
        {
            log.error( "ClassNotFoundException " + exception.getMessage( ) );
        }
...
}

この静的な{...}は何をしますか?

C ++の静的変数について知っていますが、それは静的ブロックか何かですか?

このようなものはいつ実行されますか?

4

6 に答える 6

14

静的ブロックはクラス静的初期化子と呼ばれます-クラスが最初にロードされたときに実行されます(そしてそれが実行されるのは[脚注]だけです)。

その特定のブロックの目的は、MySQLドライバーがクラスパス上にあるかどうかを確認することです(そうでない場合はエラーをスロー/ログに記録します)。


[脚注]静的ブロックは、クラスをロードするクラスローダーごとに1回実行されます(したがって、互いに異なる複数のクラスローダーがある場合(たとえば、委任しない場合)、それぞれ1回実行されます。

于 2009-11-15T10:59:56.803 に答える
1

クラスロード時に静的変数と静的イニシャライザが出現順に実行されることを追記したい。したがって、静的イニシャライザが静的変数に依存している場合、特定の静的ブロックの前に初期化する必要があります。

final static String JDBC_DRIVER = getJdbcDriver( );

static
{
  try
  {
    Class.forName(JDBC_DRIVER);
  }
  catch ( ClassNotFoundException exception )
  {
    log.error( "ClassNotFoundException " + exception.getMessage( ) );
  }
}

この例getJdbcDriverでは、静的初期化子の前に実行されます。また、クラスには複数の静的初期化子が存在する場合があります。繰り返しますが、それらは出現順に実行されます。

また、ここでインスタンス初期化子の存在についても言及したいと思います。初めて見たときは驚かされるからです。このように、クラス本体内のコード ブロックのように見えます。

class MyClass
{
  final int intVar;

  {
    intVar = 1;
  }
}

一般に、コンストラクターがあるため、それらの使用は多少不必要ですが、Java のバージョンのクロージャーを実装するのに役立ちます。

于 2009-11-15T12:36:02.750 に答える
1

上記のすべてに加えて、クラス コンストラクターとクラス初期化子の使用にはわずかな違いがあります。通常、オブジェクトの初期化に使用されることがわかっているコンストラクターと、静的変数がある場合、クラスがロードされるときにそれらを初期化するために、通常静的ブロックが使用されます。

静的変数と静的ブロックがある場合、静的変数が最初に初期化され、次にブロックが初期化されます。

クラスが最初にロードされると、静的ブロックはクラス コンストラクターの前に初期化されます。

于 2012-06-02T05:25:10.637 に答える