• ベストアンサー

コンストラクタ

UKYの回答

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

> コンストラクタを、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 というメソッドを使うようにさせています。 さて、前回の私の回答にあったミスについては、ごめんなさい。こういうときはいつも即興でプログラムを作るので、エラーの確認はしていなかったのです。 また何かあったら補足してください。

関連するQ&A

  • 継承における暗黙のデフォルトコンストラクター

    ”継承の際、スーパークラスで引数なしのコンストラクターが省略せずにきちんと記述されるなら、そのサブクラスでコンストラクターを記述しなくても、スーパークラスの引数なしのコンストラクターが受け継がれるためコンパイルエラーがおきない。”のは分かりますが”スーパークラスで引数なしのコンストラクターが省略され、かつサブクラスでコンストラクターを省略した場合”はなぜコンパイルエラーがおきるのでしょうか? 暗黙の内にスーパークラスにコンストラクターが生成され、それがサブクラスに受け継がれることは出来ないのでしょうか? 宜しく願います。

  • スーパークラスのコンストラクタの呼び出し

    こんにちは。 スーパークラスに引数のあるコンストラクタと引数のないコンストラクタをサブクラスで継承する際の質問です。 具体的に書くと下記になります。 class A { A () {} A (int i) {} } class B extends A { } 何がわからないかというと 『スーパークラスのA()は、サブクラスのBでわざわざ明示的にスーパークラスのコンストラクタ呼び出しをしなくても問題ないというのはわかるのですが、なぜスーパークラスのA(int)は、呼び出さなくても良いのかということです。』 もしかしたら基礎中の基礎かもしれませんが、ご教授よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 計算してからコンストラクタに渡すか

    メインクラスAからクラスBをインスタンス化します。 Bクラスが持つ変数Cには1~100までの数値がランダムで入ります。 ここで、AクラスであらかじめCを計算しておいてBクラスのコンストラクタに引数として渡すのか それともAクラスではBクラスを生成するだけで、 Bクラスのコンストラクタ内で変数Cの値を計算するのか どちらが良いでしょうか? お教えください。

    • ベストアンサー
    • Java
  • コンストラクタ内で定義したインスタンスの呼び出し。

    以下のようなソースを書いてみたのですが、 コンストラクタで定義したインスタンスehogeを set_vのところで使おうとすると”ehogeを解決できません” というエラーが出てしまいます。 初歩的な質問ですが、 ehogeをコンストラクタ外でも使えるようにするにはどうすればいいのでしょうか? public class sample { void sample(){ hoge ehoge=new hoge(); } public static void main(String[] args) { } void set_v(){ int num=ehoge.value(); } } class hoge{ int value=1; }

    • ベストアンサー
    • Java
  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

  • コンストラクタの使い方?

    僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{   public B(String stitle){    super(stitle);  } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car {   private int num;   private double gas;   public Car()   {    System.out.println(車を作成しました。)   } } class C { ....main...   {    Car car1=new Car();   } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

    • ベストアンサー
    • Java
  • PHP5 コンストラクタや初期化の意味がわからない

    プログラミング初心者です。本を参考にしてPHPを勉強しています。 クラスの章でコンストラクタについて以下のように書かれていました。 コンストラクタはインスタンス化のタイミングで実行されるという性質上、 プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化 といった処理を記述するのが一般的です。 初期化処理が不要な場合、コンストラクタは省略可能。 ここで質問です。 インスタンス化を行うのは初期化するためということでしょうか? 「~といった処理を記述するのが一般的」ということは、初期化が 本来の目的ではないという意味にもとれますがどうなんでしょうか。 また静的メソッドについては、 「インスタンス化を行わなくても利用できるメソッド」 と書かれていましたが、何がどう違うのか分かりません。 初期化とは何でしょうか?またなぜ初期化を行うのでしょうか? 静的メソッドと何が違うのでしょうか?

    • ベストアンサー
    • PHP
  • コンストラクタ内で別のコンストラクタは呼べますか?

    こんにちは。 class CFoo {     CFoo( int a ){}            // 1     CFoo( float b ){}           // 2     CFoo( bool c ){}           // 3     CFoo( int a, float b, bool c )    // 4     {     } } ; 上記のようなクラスで 4 番目のコンストラクタが呼ばれた場合に、 a, b, c のパラメータを使って、1、2、3 を呼ぶようなことは可能でしょうか ? もしご存じの方がいらっしゃいましたら教えて頂けないでしょうか。

  • Java初心者です、エラーの意味が理解できません

    今晩は。Java初心者です、宜しくお願いします。 下のようなコードを書きましたが、 「コンストラクタ'sub(int)'は未定義です」、 「/型subのメソッド'disp(int)'は引数()に適用出来ません」というエラーが出ます。 エラーの意味が理解できません。 1.メソッドのみを持ったクラスSubに値をこのような渡し方は不可なのでしょうか。 2.Subには自動的にコンストラクタが生成されないのでしょうか。   されないとすれば、どの部分の書き方が悪いのでしょうか。 3.「型subのメソッド'disp(int)'への引数の渡し方」は、文法的にまずいということでしょうか。 それとも全てコンストラクタの生成が原因なのでしょうか。 ========================================================================= class Sub { void disp(int a) { System.out.println("a = " + a ); } } public class クラス { public static void main(String[] args) { Sub s = new Sub(10); //コンストラクタ'sub(int)'は未定義です s.disp();     //型subのメソッド'disp(int)'は引数()に適用出来ません  } }

    • ベストアンサー
    • Java
  • クラス中でコンストラクタを使わず変数に代入をする理由は?

    JAVAやJavascript、最近オブジェクト指向的な記述が可能になったphpなどの言語で次のようなクラス定義が可能です。 <JAVAの場合> class A { public int i1 = 1; public int i2; A() { i2 = 2; } } しかし最近覚えたC++では、例の「public int i1 = 1;」のようなクラスのスコープ内で代入を行うことは出来ず、その場所では「public int i2;」のように宣言のみ、代入はコンストラクタで行うようになっています。この場合はなぜ「public int i1 = 1;」はダメなのかと疑問に思っても「そういう仕様だ」と言われれば納得できます(やり方が1つだけなので)。 ではJAVAなどの言語で、例のような場所で「public int i1 = 1;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?