• ベストアンサー

Staticイニシャライズについて質問

JAVA初心者です、宜しくお願いします。 Staticについて質問します。 ある本には、「static変数の初期化方法は、変数の初期化と同じステートメントで実行する方法と、JVMによってクラスがロードされるときに実行される特別なコードブロックを作成して変数を初期化する方法があります」とかかれていました。 ・ 「変数の初期化と同じステートメントで実行する方法」と「クラスがロードされ るときに初期化する方法」とは、どのように違うのでしょうか。   クラスがロードされる時とはどのような時なのでしょうか。 ・ 「変数の初期化と同じステートメントで実行する方法」については通常の方法な ので理解できるのですが、「クラスがロードされるときに初期化する方法」を行う と、どのようなメリットがあるのでしょうか。   何故このような方法があるのでしょうか。 以上、宜しくお願いします。

  • Java
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> 「変数の初期化と同じステートメントで実行する方法」と「クラスがロードされるときに初期化する方法」とは、どのように違うのでしょうか。 下の二つのような単純な例であれば、javacでコンパイルした結果は全く同じです。どちらで書くかは好みの問題。 public class A { public static int x=1; } public class A { public static int x; static { x=1; } } 下の書き方だと、変数の初期化以外のコード(途中でprintln()するとか、条件によって分岐するとか)を混ぜて書くことができます。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

メリットかどうかわかりませんが、 >「クラスがロードされるときに初期化する方法」 この方法でないと初期化できないのでしょう。

関連するQ&A

  • staticのメモリ共有について

    staticについて調べたのですが、その内容があっているのかどうか 間違い・アドバイスなどありましたら是非伺いたいと思います。 よろしくお願い致します。 ------------------------------------------------------------  シェルから起動されるJavaでバッチ処理を行うアプリケーションを  作成していまして、サーバマシンの複数のプロセスから起動されます。  (つまりjavaコマンドが複数回同時に実行されます)  1回の実行の間保持しておきたい値をstaticなクラス変数に格納しています。  そしてそれは、1回の実行の間はずっと同じなのですが、  プロセスごとに異なる値です 。  この時、この1回の実行の間に保持しておきたい"static"な変数は  次のプロセスから実行された時に書き換えられるのか?  という疑問がでたのが始まりです。  マルチスレッドの処理はありません。 ------------------------------------------------------------ 調べたところ、 ■1台で2つ以上のJavaアプリケーションを実行する場合、  それぞれのアプリケーションを個別にjavaコマンドで起動・・・  =>javaコマンド毎に"個別のJVMが"それぞれのプロセス上で動作する。 ■フィールドをstatic指定するとクラス変数となり、  ロードされたクラスごとに"JVM上に"1つしか存在しない変数となる。 ・以上の2点から、staticの変数がメモリ上で共有されるのは  1つのJVM(1プロセス)内での話しであり、他のプロセスから  その値を書き換えられる事はないと考えています。  そして、1プロセス内でのマルチスレッドな処理を行っている場合、  staticな変数の値は注意が必要だけど、  複数プロセスでシングルスレッドな処理を行っている場合、  (性能などの問題上staticにするかどうか良し悪しはあるとしても)  staticな変数の値の不整合について  考慮は不要と考えても宜しいのでしょうか? 経験が浅い為、確信が持てずにいる状況です。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • static 変数について

    static 変数について 今、C++を勉強しているのですか、static変数がどのように動くのかよくわかりません。 下のプログラムのint a はローカル変数だから、ブロックを抜けたら、初期化されるためstatic変数にして、ブロックを抜けても値を保持するようにすってことはわかるのですが 毎回このブロックに入る度、static int a = 0;を読むことになり、その前に入っていた値はなくなるのではないでしょうか?それとも,static int a と書かれていると,1度しか実行されないから、値が保持され続けるのでしょうか? int add (int x ) { int a = 0; a += x; return a; }

  • Static Initializerについて

    JavaWorld Online - Javaの“常識”、“非常識” 第3回 http://www.javaworld.jp/technology_and_programming/-/27074-5.html 上記のURL内の記述によると 「static変数の初期化は、そのstatic変数を宣言する際、同時に行うことができます。しかし、宣言時ではなく、実行時に初期化したいというケースもあるでしょう。そのような場合に、この静的初期化子を使用します。」 とあり、宣言時の初期化とStatic Initializerを使用した場合でタイミングが異なると読み取れる記述があります。 が、意味がよく分かりませんでした。Date型を現在日付で初期化する簡単なプログラムで確認したのですが、同じタイミングで初期化されるように見えました。正確には変数が初期化された直後にStatic Initializerが動いてました。 そしてこの順番は(私のプログラムでは)インスタンス化する場合と、インスタンス化せずにstatic publicで定義しているクラス変数にアクセスする場合ともに結果は同じでした。 もしかしたらHPの記述が間違っているのかなーとも思いますがよく分かりません。 知りたいのは両者のタイミングの違いです。 Static Initializerについてご存知の方よろしくお願いします。 ※字数の関係から今回はソースを添付できませんでしたが、ご希望があれば質問の補足で添付します。

  • クラス内の関数内static変数について

    クラス内の「staticではないメンバ関数内で定義される」static変数の初期化タイミングはいつでしょうか? 自分としてはクラスのインスタンス生成時に初期化されるものだと思っていたのですが、どうもそうでは無さそうだという現象に出会ったもので。 例えば以下のようなサンプルプログラムがあるとします。 --------------------------------------- class TA { public: void func(int i); }; void TA::func(int i) { static int d=0; d += i; std::cout << d << std::endl; } int main() { for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); } } --------------------------------------- これを実行した時、自分としては 1 2 3 2 4 6 という結果を期待していた訳ですが、実際には 1 2 3 5 7 9 という結果になりました。 ということは、もしかしてメンバ変数ではなくともクラス内に現れるstatic変数はstaticなメンバ変数と同等ということなのでしょうか? 実際、上記ソースのforループ内にもう一つclass TAのインスタンスtbを追加してみると、 --------------------------------------- for(int i=1; i < 3;i++) { TA ta; ta.func(i); ta.func(i); ta.func(i); TA tb; tb.func(i); tb.func(i); tb.func(i); } --------------------------------------- 1 2 3 4 5 6 8 10 12 14 16 18 となりました。 (まぁstaticではないメンバ変数に置き換えれば一応解決するのですが、個人的に何か凄く気持ち悪く感じて・・・)

  • staticのメリット、デメリット

    こんばんは。 staticについて、だんだんわからなくなってきました・・・。 例えばあるクラスの変数で、 static int i = 10; とあった場合、参照クラスからiの値を見ると、必ず10ですよね? static修飾子がついているメソッドの場合、挙動はどうなるのでしょう? staticなメソッドはインスタンス化しなくても呼び出せる。 つまり、メモリ上に1箇所しか存在しないので、同時にアクセスされた場合(synchronizedしていない場合)はどうなるのかがわかりません・・・。 メソッドには引数が存在し、returnがStringやintなどの場合です。 returnは保証(参照側にとって望む値と言う意味で)されるのでしょうか? インスタンス化をしない事によって、パフォーマンスが向上するのでしょうけれど、いまいちメリットがわかりません・・・。 public、privateにかかわらず、メソッドをstatic修飾するメリットを教えてください。 同時にデメリットもお願いします。 以上、下手くそな文章ですみません・・・。 (^^ゞ

    • ベストアンサー
    • Java
  • static修飾子の使いどころ

    現在、Java言語でネットワークプログラムを作っています。 このプログラムでは、どのIPが自分のPCとつながっているかを全て把握することが必要になってきます。 しかしながら、作り込んでいくうちにクラスが増えてきました。 そこで、IPアドレスなどのネットワーク情報を一気に管理できないかと考えた末、staticメンバを持ったクラスを作ろうという考えに至りました。インスタンスに依存しない、いわばDBのような形式を以て、管理できると考えたからです。 そこで、いくつか質問があります。 ・「DBのような形式」というニュアンスで間違っていないか ・↑の質問とほぼ同じですが、staticフィールドは「グローバル変数の代わり」としてみてもよいか 以上の2点です。 ちなみに、そのstaticメンバを持つクラス内のメソッドは、staticフィールドの内容に関わるものなので、一応、オブジェクト指向の線からは外れていないと思います。 また、もし使い方が間違っているということでしたら、どのように全体的な情報を管理していくべきかご教授頂けると嬉しいです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 関数外からstatic変数を再度初期化できるのでしょうか?

    以下の静的変数?についてA,Bのメモリは別でしょうか? test関数外からBの変数を再度初期化できるのでしょうか? staticの仕組みがわからないのでstaticのメモリの初期化のタイミングとメモリアクセス方法について知りたいです。 static x = 1; // ---A int test() { static int x = 0; // --- B } またexternの働きも知りたいです。

  • static constメンバ変数(配列)の初期化について

    C++初心者です。 constメンバ変数の初期化について教えてください。 クラスの中に、static constメンバ変数(配列)を持ちたいのですが、 <コード1> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2] = {1, 2}; }; とすると、VC++ 2005では、 error C2059: 構文エラー : '{' error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます というエラーが発生します。 何がいけないのでしょうか? また、下の様にするとOKでした。 <コード2> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2]; }; const int hoge::fuga[2] = {1,2}; こうすればコンパイルが通る事は分かったのですが、なぜこんな面倒な事をしないといけないのかが分かりません。 コード1では何がいけないのでしょうか? 以上、よろしくお願いします。

  • 分割ファイルでstatic変数はどのようにすれば良いのでしょうか?

    1つのファイルでstatic変数を使っている場合は気にしていなかったのですが、分割ファイルにした場合、static変数はどのようにすれば各ファイルで利用できるのでしょうか? 通常のグローバル変数の場合はexternとすれば良かったのですが方法がかわりません。 ** test1.cpp static int a; ** test2.cpp ?????? (二重定義になる) あと1ファイルから分割ファイルにした場合に気をつけるべき点など詳しい方教えて下さい。

  • SAStrutsでServiceのStatic変数

    SAStrutsでServiceのStatic変数の動作で疑問があります。 Eclipse+TomcatでサンプルWebアプリを作成し、以下のサービスをActionから呼び出しています。 これは、Staticなint型の変数に、インスタンスを生成した回数を格納する物です。 public class SampleService{ private static int instanceCnt = 0; public SampleService(){ instanceCnt++; System.out.println(instanceCnt); } } これを何度も呼び出すと、何故かある時突然、出力する数値が1にリセットされるのです。 Static変数はスレッド間で共通で使われているはずなので、これは起こらないはずではないでしょうか? 考えられるとすれば、Tomcatが複数のJavaVMを呼び出して、Webアプリケーションを実行しているのでは、と思うのですが、いまいち確信が持てないのです。 なぜこういう事が起こるのか、詳しい方、教えてもらえないでしょうか。

    • ベストアンサー
    • Java

専門家に質問してみよう