ページ 11

[java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月09日(木) 22:44
by java大好き

コード:

class p
{

static
{
system.out.println("hello world");
}
static void x()
{
system.out.println("x()メソッド");
}

}
 


mainメソッドからp.x()として
静的メソッドx()を呼び出しただけなのに、何故かhello worldまで出力されます。
これは実行環境が壊れているのでしょうか?pクラスを作ったわけではありません。
それなのに何故初期化子が実行されるのでしょうか?

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月09日(木) 23:26
by かずま
java大好き さんが書きました:クラスを作ったわけではありません。
それなのに何故初期化子が実行されるのでしょうか?
pクラスの main メソッドを実行するということは、
pクラスを作ったということです。
pクラスが出来たので、pクラスのクラスメソッドを実行したり、
クラス変数にアクセスできます。

new で作るのは pクラスのインスタンスです。
インスタンスが出来ると、インスタンス変数にアクセスできます。

static { .... } は、静的初期化子(static initializer)で、
クラスを初期化します。
インスタンスの初期化は、コンストラクタで行います。

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月10日(金) 00:28
by Math
エラーになると思ったのですが?。(eclipse MARS)
画像

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月10日(金) 00:36
by Math

[クラス変数の場合はインスタンスを生成しなくても使用できるので、コンストラクタは必要ありません。クラスが初期化される直後にクラス変数を初期化したいのであれば、コンストラクタではなく「スタティックイニシャライザ(静的初期化子)」を使用します。イニシャライザを記述する箇所は、初期化の対象となるクラスフィールド宣言の後(下)であり、そのクラスのフィールドやメソッドを記述できる箇所なら記述できます。

static {
//ここにクラス変数を初期化する処理を記述します。
}

■ スタティックイニシャライザ(Static Initializer)は他にも「クラス初期化子」・「静的初期化子」「静的ブロック」・「staticブロック」とも呼ばれています。]

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月10日(金) 19:57
by java大好き
良く分かりませんが、クラス変数にアクセスしたらクラスが初期化されるってことですか?

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月10日(金) 20:41
by Math
>クラス変数にアクセスしたらクラスが初期化されるってことですか
その通りです。
static とはそう言うものです。

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月10日(金) 21:57
by java大好き
ありがとうございます。

Re: [java]初期化子の処理が勝手に行われることについて

Posted: 2017年3月11日(土) 16:40
by かずま
java大好き さんが書きました:良く分かりませんが、クラス変数にアクセスしたらクラスが初期化されるってことですか?
クラスp には、クラス変数はありませんよ。
あるのは、クラスメソッド x です。

クラスが初期化されるのは、クラスメソッドを呼び出したとき、
またはクラス変数にアクセスしたときです。

クラスメソッドを呼び出さず、クラス変数にアクセスしなくても、
クラスのインスタンスを初めて作った時には初期化されます。