- ベストアンサー
コンストラクタ
恐れ入ります。 たとえばSample classを定義するとして class Sample{ int a=0; int b=0; Sample(){ //まあ、この場合は通常省略ですが。 } } とコンストラクタの前に処理を書く場合と、 class Sample{ Sample(){ int a=0; int b=0; } とコンストラクタに書く場合とでは何か違いがあるのでしょうか?本を見ると「コンストラクタはインスタンスが生成されたときに呼び出される処理」とありますが、上のような記述でも「生成されたときに処理」されますよね・・・? インスタンスを生成するときに引数を使う場合には違いはわかるのですが・・・? 引数がない場合には「コンストラクタには意味はない」であっていますか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まず、質問文にある二つの例ですが、後者は以下ようにしないと前者と意味が違ってしまいます。 class Sample{ int a; int b; Sample(){ a = 0; b = 0; } } さて、引数が無い場合にコンストラクタの意味が無いわけではありません。 そもそも、コンストラクタの役割はインスタンスを初期化することであって、フィールドを初期化するだけではないのです。 次の例を見てください。 class Sample { Sample() { this(10); // 10 はデフォルト } Sample(int a) { // コンストラクタの中身をここに書きます。 } } この例では、引数が無いコンストラクタが使われると、引数を10として引数ありのコンストラクタが呼び出されます。 class Sample2 { Sample() { method(); } void method() { // メソッドの中身をここに書きます。 } } この例では、コンストラクタで自動的にメソッドを呼び出すようになっています。 class Sample3 { private Sample3() {} } この例では、外部からインスタンスの生成ができなくなっています。コンストラクタをプライベートにするためには、コンストラクタの記述を省略することはできません。 class Sample4 { int i; Sample4() { int j = new Random.nextInt(); // 乱数を取得 for (int k = 0; k < 10; k++) { j = j * j; } i = j; } } この例でも、コンストラクタは欠かせません。初期化の方法がこのように複雑なときは、コンストラクタなしにフィールド i を初期化できません。
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
> コンストラクタを、privateにする場合にはその内部で、mainメソッドを書いて、利用するという方法にてしか使えないですよね? 確かに、インスタンスを作成するには同じクラスの中からコンストラクタを呼び出すしかありません。しかし、それが main メソッドであるとは限りません。(下の例) class SampleA { private static SampleA instance = new SampleA(); private SampleA() {} static SampleA getInstance() { return instance; } } class SampleB { public static void main(String[] xxx) { SampleA a = SampleA.getInstance(); // この後、SampleA のインスタンスを使って作業を行います。 } } この例では、SampleA のコンストラクタがプライベートになっているので、よそのクラスから自由にインスタンスを作ることはできません。代わりに、getInstance というメソッドを使うようにさせています。 さて、前回の私の回答にあったミスについては、ごめんなさい。こういうときはいつも即興でプログラムを作るので、エラーの確認はしていなかったのです。 また何かあったら補足してください。
- ranx
- ベストアンサー率24% (357/1463)
> おかしいところが見当たりません・・・・ エラーの内容をよく検討しましょう。 多分以下2点。 i=j; がメソッドの外に出ている。 int j = new Random.nextInt(); は int j = new Random().nextInt(); が正解。
お礼
ありがとうございますm(__)m なるほどぉ、呼び出されたときに実行される、という特性を利用していろいろなことができるのですね。 コンストラクタを、privateにする場合にはその内部で、mainメソッドを書いて、利用するという方法にてしか使えないですよね?あっていますか?(-_-;) ええ~~と・・・ あと最後のなんですけど、初期化とおっしゃられている部分は int i; の部分ですよね? ちょっと、いろいろコーディングして実行してみます。
補足
すみません!!m(__)m import java.util.*; class S1{ int i; S1(){ int j = new Random.nextInt(); for(int k=0 ; k < 10 ;k++){ j *= j; } } i = j; } このように、プログラムを作り、とりあえずコンパイルしてみようと思ったのですがエラー続発です・・・ おかしいところが見当たりません・・・・