thisによると、コンストラクターは実際には初期化子です。そして、this answer オブジェクトによると、new
キーワードが呼び出された後のコンストラクターの前に既に作成されています。
new
だから私の質問は、何かを初期化したくない場合、キーワードの後にコンストラクターを配置する必要があるのは何ですか。
このように考えてみてください...
変数を初期化したくない場合は、次のように宣言できます。
MyObject myObject;
ただし、 で何でもできるようにしたい場合はmyObject
、変数が指すことができるオブジェクトを作成する必要があり、それはnew
キーワードで行われます。それ以外の場合myObject
は、大きな何も指していません。
何年にもわたって、Java のアップストリーム言語の用語が Java 言語に侵入してきました。
以前は (C) 割り当ては初期化とは別のステップでした。これらは C++ で結合され、現在は同じものと見なされています。技術的には、「建設」における作業の順序は、
これらの手順は、オブジェクトの親クラスに対して複数回実行できます。重要なのは、割り当ては常に初期化の前に行われ、2 つが密接に結合されていることです。割り当ては初期化の前に行う必要があります。そうしないと、初期化に初期化するメモリがありません。コンストラクターは、プログラムが割り当てられたが初期化されていないアイテムにアクセスすることによってランダムデータにアクセスする他の言語での以前の問題を回避するために、両方が行われることを保証します。コンストラクターは、このようなバグから保護するために作成されました。
ここで、割り当てるものは変数であり、変数は値への参照を保持します (Java では、オブジェクトの場合)。したがって、変数は、値に逆参照できる単なる名前と見なすことができます。新しい名前が必要だが、何も参照しないようにしたい場合は、Keppil の回答が最適です。
MyType myName;
これにより、値なし (null) への参照を持つ名前が作成されます。
ただし、Java では、オブジェクトの値を初期化する必要があります。これは、ランダムな内部状態を持つオブジェクトを持つことと同等であるため、「初期化なしの割り当て」はありません。ランダムな内部状態とは、オブジェクトを使用すると (せいぜい) ランダムな結果が得られ、(最悪の場合) 存在しないオブジェクトへの参照が発生することを意味します。割り当てと初期化の構築における密結合により、型システムは機能します。それがなければ、理論的には存在しないオブジェクトへの参照を持つことができ、Java で C のセグメンテーション違反を再現できます。
そうです、Java構文は
String str = new
それ以外の
String str = new String()
空の文字列を提供します。問題は、次のようにパラメーターをコンストラクターに渡したい場合があることです。
String str = new String("text")
これが、コンストラクターを呼び出す理由です。構文の一貫性を保つには、デフォルトのコンストラクターも呼び出す必要がありますString()
。この場合String
は不変クラスなので、初期値を設定する他の方法はありません。
オブジェクトにメモリを割り当てるなど、オブジェクト自体を初期化したい。同様に実行する必要がある他のハウスキーピング内部もあります。
投稿したリンクを引用するには:
コンストラクターの仕事は、新しいオブジェクトが有効な状態であることを確認することです...
オブジェクトを作成して、有効な状態にしないでよろしいですか?
ただし、オブジェクト参照だけが必要な場合は、宣言するだけで、new を呼び出さないでください。
MyClass mc;