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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
java大好き

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

#1

投稿記事 by java大好き » 8年前

コード:

class p
{

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

}
 


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

かずま

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

#2

投稿記事 by かずま » 8年前

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

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

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

Math

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

#3

投稿記事 by Math » 8年前

エラーになると思ったのですが?。(eclipse MARS)
画像

Math

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

#4

投稿記事 by Math » 8年前


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

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

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

java大好き

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

#5

投稿記事 by java大好き » 8年前

良く分かりませんが、クラス変数にアクセスしたらクラスが初期化されるってことですか?

Math

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

#6

投稿記事 by Math » 8年前

>クラス変数にアクセスしたらクラスが初期化されるってことですか
その通りです。
static とはそう言うものです。


かずま

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

#8

投稿記事 by かずま » 8年前

java大好き さんが書きました:良く分かりませんが、クラス変数にアクセスしたらクラスが初期化されるってことですか?
クラスp には、クラス変数はありませんよ。
あるのは、クラスメソッド x です。

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

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

返信

“C言語何でも質問掲示板” へ戻る