- ベストアンサー
クラスのインスタンスの生成
javaの勉強を始めたばかりの初心者です。 クラスのオブジェクトの生成方法は(1)の方法だけだと思っていたのですが, 本を読んでいると以下の(1)~(3)の3種類の生成の方法がでてきます。 オブジェクトの生成方法について以下の質問にお答えいただきたいです。 【質問1】 (2)のオブジェクトの生成方法は以下のような考え方でしょうか? BufferedReader br = new BufferedReader(); InputStreamRader k = InputStream(); BufferedRader br = new BufferdRader(k); これを省略して・・・ BufferedReader br = new BufferedReader(new InputStreamReader ()); 【質問2】 (3)のオブジェクト生成方法は以下の考え方でしょうか Container ct = new Container(); ct = frame.getContentPane(); これを省略して・・・・ Container ct = frame.getContentPane(); 【質問3】 オブジェクト生成方法はこの3種類の他にもあるのでしょうか 【質問4】 (1)~(3)の方法には使い分け(ルール)があるのでしょうか? 例えば「このクラスの場合この方法」というような -------------------------------------------------------------------- (1)MyClass br = new MyClass(); クラス名 オブジェクト = new コンストラクタ; -------------------------------------------------------------------- (2)BufferedReader br = new BufferedReader(new InputStreamReader ()); -------------------------------------------------------------------- (3)Container ct = frame.getContentPane(); --------------------------------------------------------------------
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
BufferedReader br = new BufferedReader(new InputStreamReader ()); をよく見てみましょう。 あなたが(1)で書いている クラス名 オブジェクト = new コンストラクタ; の形になっていますね? BufferedReaderのコンストラクタが引数を取っている形になっているだけです。(そしてそのコンストラクタの引数としてnewしているオブジェクトを入れているだけ) つまり、 InputStreamRader k = new InputStream(); BufferedRader br = new BufferdRader(k); を略しているだけですね。 これは、両方とも クラス名 オブジェクト = new コンストラクタ; の形になっていますね? オブジェクトの生成方法は基本的に クラス名 オブジェクト = new コンストラクタ; の1通りです。(コンストラクタには引数あり、なしがあります) ただし、いろいろな理由(抽象クラスだからnewできない、シングルトンにしたい等)で<簡単には>new コンストラクタとかけない場合があります。その場合に、そのクラスにオブジェクトをとってくるメソッドがある場合があります。例えば、 java.util.Calendar.getInstance() などです。(注:シングルトンではありません) ただし、これらは実は<そのメソッドの中身で>newしているのです。だから、基本は クラス名 オブジェクト = new コンストラクタ; であると言う理屈は変わりません。どうしてこのように中身でnewしたりしているのかは勉強を続けていけばわかるようになるでしょう。 最後に、No.1さんが書いている通り ct = frame.getContentPane(); はオブジェクトを生成しているわけではありません。これはJFrameクラスがすでに持っているオブジェクトを返しているだけです。「カプセル化」や「セッター、ゲッター」を学べば考え方がわかるのではないかと思います。 最後に【質問4】の答えですが、これはクラスにより異なりますので、参考URLのページで見てもらうしかありません。コンストラクタのところにprotectedなどの文字が書かれていない場合、そのコンストラクタを普通に「new コンストラクタ」と書くことにより呼び出すことができます。(もちろん、引数は指定されているものに合わせてください) しかし、protectedなどの修飾子がある場合はあなたが利用するときに「new コンストラクタ」と書くことはできません。その場合、自身のクラスのオブジェクトを返すメソッドが用意されていたりします。今までに自分が使ったことのあるクラスをチェックしてみて下さい。
その他の回答 (1)
- sire
- ベストアンサー率62% (22/35)
【質問1】 BufferedReader br = new BufferedReader(new InputStreamReader ()); は、始めにInputStreamReaderを生成し、そのオブジェクトを引数にBufferedReaderを生成するということで、 InputStreamRader k = InputStream(); BufferedRader br = new BufferdRader(k); を1行にしたものです。 BufferedReader br = new BufferedReader(); InputStreamRader k = InputStream(); BufferedRader br = new BufferdRader(k); を省略して・・・ とありましたが、一番上の行は必要ありません。 引数なしのBufferedReaderのコンストラクタは(確か)ありませんし、1行目で生成されたbrオブジェクトは3行目に生成されたオブジェクトに置き換わってどこからも参照されなくなりますので、意味がありません。 【質問2】 こちらも質問1と同じで、1行目の Container ct = new Container(); は必要ありません。 Container ct = frame.getContentPane(); はこの行でオブジェクトが生成されるのではなく、frameが"元々"持っているオブジェクトを取得しているに過ぎませんので、生成の種類には入らないと思います。 【質問3】 基本的には (1)XXClass obj = new XXClass(); (2)XXClass obj = new XXClass(arg1, arg2,・・); の2種類で 引数なしのコンストラクタ (これをデフォルトコンストラクタといいます) と 引数ありのコンストラクタ ということになると思います。 あと (3)XXClass obj = new factoryMethod(); (4)XXClass obj = XXClass.getInstance(); なるもの等もあり、 (3)をファクトリメソッド (Container ct = frame.getContentPane();はこれに似てます) (4)をシングルトンといいますが、 kaito1980さんには、まだ難しいのかもしれません。。 がんばって勉強されているのだと思いますが、 ただ、アドバイスとして、あまり生成の"種類"を考えなくてもいいように思えます。 基本は上の(1)、(2)だということで。 (↑【質問4】の回答)