なぜこの文はStackOverflowErrorを投げないのですか?
質問
私はちょうどこれを見ました
奇妙な
の部分を見ました。私は、それが結果的に
StackOverflowError
が投げられると思ったのですが、そうではありませんでした...。
public class Node {
private Object one;
private Object two;
public static Node NIL = new Node(Node.NIL, Node.NIL);
public Node(Object one, Object two) {
this.one = one;
this.two = two;
}
}
例外が発生すると思っていたのですが、その理由は
Node.NIL
が自分自身を参照して構築しているため、例外が発生すると思っていました。
なぜそうならないのか、それがわからないのです。
どのように解決するのですか?
NIL
は静的変数です。クラスが初期化されるときに一度だけ初期化されます。初期化されるとき、1つの
Node
のインスタンスが作成されます。その作成された
Node
が作成されても、他の
Node
のインスタンスを生成しないので、呼び出しの無限連鎖は起こりません。渡される
Node.NIL
を渡すと、コンストラクタの呼び出しに
null
を渡すのと同じ効果があります。
Node.NIL
はコンストラクタが呼ばれたときにはまだ初期化されていないからです。したがって
public static Node NIL = new Node(Node.NIL, Node.NIL);
と同じです。
public static Node NIL = new Node(null, null);
.
一方、もし
NIL
がインスタンス変数であった場合(そして、引数として
Node
のインスタンスが生成されるたびに初期化されることになります(コンパイラがそれをコンストラクタに渡すことを禁止していたため)。
Node
のインスタンスが作成されるたびに初期化され、その結果、新しい
Node
インスタンスが作成され、その作成によって別の
NIL
インスタンス変数が初期化され、コンストラクタ呼び出しの無限連鎖が起こり、最後は
StackOverflowError
.
関連
-
Java の double データ型における 0.0 と -0.0 の問題
-
アクセス制限の解決方法: ---- in Java
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] B "の印刷が "#"の印刷より劇的に遅いのはなぜですか?
-
[解決済み] リフレクションとは何か、なぜ有用なのか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Collections.sortがdoubleでソートできない問題を完璧に解決する。
-
Solve モジュールのビルドに失敗しました。Error: ENOENT: no such file or directory エラー
-
ApplicationContextの起動エラーです。条件レポートを表示するには、アプリケーションを'de'で再実行します。
-
Jsoup-Crawlingの動作
-
keytool error: java.io.FileNotFoundException: cacerts (アクセス拒否されました。)
-
ジャバアレイ
-
アノテーション「@Retention」の役割
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
アクセス制限の解決方法: ---- in Java