• ベストアンサー

クラスのインスタンスの生成

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(); --------------------------------------------------------------------

  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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 コンストラクタ」と書くことはできません。その場合、自身のクラスのオブジェクトを返すメソッドが用意されていたりします。今までに自分が使ったことのあるクラスをチェックしてみて下さい。

参考URL:
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/index.html

その他の回答 (1)

  • sire
  • ベストアンサー率62% (22/35)
回答No.1

【質問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】の回答)

関連するQ&A

  • インスタンスとオブジェクト 生成

    クラスのオブジェクトを生成するときに(newをつかって) ●インスタンスを生成する。 ●オブジェクトを生成する。 と参考書に書いてありますが、言い方はどちらでもいいそうです。 でも、2種類の言い方がるということは厳密には意味が違うような気がするのですが、皆さんはどう思いますか? またどちらの言い方を使っていますか? どちらが正しいのでしょうか?

    • ベストアンサー
    • Java
  • インスタンス生成について

    いつもお世話になっております。 今回はインスタンス生成について質問させて下さい。 String クラスのインスタンス生成は、 String str1 = new String(); のように明示的に new 演算子を用いる方法と、 String str2 = "hoge"; のように生成する方法がありますよね。 str2 の方は、JVM が(?) 勝手にコンストラクタを呼び出してくれて、 インスタンスを生成してくれる、という認識でよいのでしょうか? また、明示的に「 new 演算子 + コンストラクタ」でインスタンスを生成する場合と、 そうでない場合の使い分けなどはあるのでしょうか? そもそも String 以外に、このような複数のパターンでインスタンスを生成することができる クラスは他にもあるのでしょうか? 以上、ご教授宜しくお願い致します。

    • ベストアンサー
    • Java
  • クラスの生成の仕方

    PHP Version 5.1.6を使っています。 よくクラスのオブジェクトを生成する時に「=&」で生成する記述を 多く見かけるのですが、自分はまだ「&」を付けることによる メリットがよく分からないので教えてもらえないでしょうか? また逆にデメリットなどもあるのでしょうか? 分かりやすい例などあったら是非知りたいです。 $obj1 = new Hoge() $obj2 =& new Hoge()

    • 締切済み
    • PHP
  • このクラスをもとに…。

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列をそのまま出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

  • このクラスをもとに2

    import java.lang.*; import java.io.*; import java.util.*; class SimpleReader{ public static void main(String[] argv) throws IOException{ InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); String s; System.out.print("Input: "); System.out.flush(); s = br.readLine(); } } このクラスをもとにプロンプト「Input: 」を出力して、文字列を入力させ、その文字列を反転(例えば"abc"→"cba")させて出力しつづけ、「end」と入力すると終わるプログラムを教えてください。

    • ベストアンサー
    • Java
  • javaでのBufferedOutputStreamクラス

    javaプログラミングで、あるURLからBufferedOutputStreamを用いてhtmlファイルを生成し、その生成したhtmlファイルをBufferedReaderで読み込みし、出力してみると文字化けが起こってしまいます。日本語を文字化けさせずに読み込む方法などあるのでしょうか。 以下の方法だと文字化けしてしまいます。 <ファイル生成方法> URL url = new URL( str[i] ); InputStream in = url.openStream(); BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(args[0])); while ((len2 = in.read(buf2)) != -1) { for (int j = 0; j < len2; j++) { bo2.write(buf2[j]); } } <ファイル読み込み方法> BufferedReader br = new BufferedReader(new FileReader(args[0])); while((str = br.readLine()) != null){ // 出力 System.out.println(str); } よろしくお願いします。

    • ベストアンサー
    • Java
  • 標準入力 System.in について

    いつもお世話になっております。 標準入力についての質問です。 標準入力からデータを入力し、そのデータを表示させる以下のプログラムを作りました。 ------ import java.io.*; class InputTest{ public static void main(String args[]) throws IOException{ String moji; InputStreamReader isr = new InputStreamReader(System.in); BufferedReader br = new BufferedReader(isr); System.out.print("文字列を入力してください。 文字 = "); moji = br.readLine(); System.out.println("\n入力した文字列は" + moji + "です。"); } } ------ 上記のソースの「System.in」なのですが、私が参考にしているテキストには 「InputStream クラスのオブジェクト」という説明になっていました。 これまで、オブジェクトは new 演算を使って生成しないと使えないと思っていたのですが… ここでは、事前に java.io を import しているから使えるのでしょうか? それとも、in は System クラスのフィールド(=定数?) なので、使えるのでしょうか? (java.lang のクラスである System クラスは、明示的に import しなくても使えるから) いずれにしても、「java.lang.System.in が、java.io.InputStream のオブジェクト」 ということが理解できません。 分かりにくい説明で申し訳ありませんが、ご教授お願い致します。

    • ベストアンサー
    • Java
  • クラスとインスタンスについて

    入社1年目のプログラミング経験0のSEです! Javaのクラスとインスタンスについてぜんぜん理解できません! 下のソースをどうしたらいいのかわからないです。 import java.io.*; class SumAndAvgMain{ public static void main(String argv[]){ BufferedReader r = new BufferedReader(new InputStreamReader(System.in),1); try{ //3教科の得点を入力しintに変換 //SumAndAvgクラスのインスタンスを作成 //合計点及び平均点を出力する。 }catch(IOException e){ System.out.println("例外発生"+e); } } } class SunAudAvg{ public static void main(String args[]){ //各教科の得点用のフィールド int kokugo; int suugaku; int eigo; //SumAndAvgクラスのコンストラクタ SumAndAvg(int kokugo,int suugaku,int eigo){ //フィールドに国語の点数を代入 //フィールドに数学の点数を代入 //フィールドに英語の点数を代入 } //3教科の合計点を求める int getGoukei(){ } //3教科の平均点を求める double getHeikin(){ } }

  • インスタンス化について(ポリモーフィズムについて)

    Java初心者です。 Javaの書籍で、ポリモーフィズムを説明している箇所において オブジェクトを生成する際に、以下のような書き方をしているのを見ます。 1.----- スーパークラス名 オブジェクト名 = new サブクラスのコンストラクタ名(); -------- 上記は、 何を実現する為に、左辺と右辺のクラス名とコンストラクタ名を変えているのでしょうか? (もちろん詳細は実際に書かれたメソッドや変数によると思いますが、一般的な話として。) また併せて、 2.----- サブクラス名 オブジェクト名 = new サブクラスのコンストラクタ名(); ------- と書いた時とでは、使用(アクセス)出来るメソッドや変数、 生成されたオブジェクトの中身が、どのように変わってくるのでしょうか? 2.の方法では、何が実現出来ないのでしょうか? 教えて下さい!

    • ベストアンサー
    • Java
  • Javaプログラミング インスタンス生成時の疑問

    現在Javaを学習中の者です。 一通り入門編を終えたところで、テトリス自作に挑戦している最中です。 // 利用クラスのインスタンス生成 block = new Block(); field = new Field(); gui = new GUI(field); proc = new Proc(gui, field, block); 本体Tetrisクラスのコンストラクタ内でこのような記述をしております。 ここで疑問に感じたのですが、例えばFieldクラスにguiオブジェクトを渡したいとなった場合、どう対処するのでしょうか。 field = new Field(gui); gui = new GUI(field); これではおそらくguiインスタンス生成前にオブジェクトを渡しているためおかしな事になってしまいますよね? 実際にやりたい訳ではなく、「こうしたいときどうすればいいんだろう」と思っただけなのですが、気になったので質問させて頂きました。 模索しながら作成中のため、記述自体に突っ込みどころがあるかもしれません…。

    • ベストアンサー
    • Java

専門家に質問してみよう