多くの場合、インスタンス化するときに、例えばshitumonクラスがあったときに、
shitumon q= new shitumon();
という形をとっています。そして、これがインスタンスを作る方法だと思ってましたが、newしない次のような形も見かけました
shitumon q=shitumon.getInstance();・・・①
さらに、上の場合、shitumonクラスという共通点があるのですが
matashitumon qq=new matashitumon();
shitumon q=qq.taihen();・・・②
という風に、新しくshitumon型qを準備しても、shitumonクラスとは関係のないクラスが来ています。
初心者のため、かなり抽象的な質問になっているのは理解していますが、
具体性を持たせることも難しいです。
質問したいことは、何故、インスタンス化するときに、右辺はnewする以外に、①、②のような場合があるのですか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
①や②はメソッドを使ってその結果をshitumon型のオブジェクトで返すものというだけであり、**これが直接インスタンスを生成しているとは限りません。**どういうshitumonオブジェクトを返すかはそのメソッド次第です。Calendarのようにnewでインスタンス化しているかもしれませんし、あるいは別途に作成してあったインスタンスを返すだけかもしれません。
確かなのはこれら①②のメソッドが内部で何かをし、shitumon型のオブジェクトを返す、ただそれだけです。
###=
とは何か
そもそも質問者がインスタンスを作る方法としてnewを解釈し、それ以外の各メソッドをインスタンス化と理解しているようですが、それぞれの前についている=
とは何を意味しているのでしょうか?
=
は右辺の要素を左辺に代入するという演算子です。右辺の結果、あるいは右辺が参照している何か、それがプリミティブ値ならばその値を、左辺の変数に代入するという意味なのです。ここに、インスタンスを生成するなどの意味が全くないことに注意して下さい。
###メソッドの型と返り値
メソッドを宣言する際、void(返り値なし)でない限り返り値の型を宣言します。この宣言をすることで、そのメソッドを実行した際にどんな型の値が返ってくるかが呼び出し側からわかります。だからこそ、
java
1shitumon q = shitumon.getInstance(); //・・・① 2 3shitumon q = qq.taihen(); //・・・②
のような書き方ができるのです。返り値がshitumon型だとわかっているから、shitumon型の変数に代入できるのです。ここでも、これらのメソッドが新規にインスタンスを生成するということは意味していないことに気をつけて下さい。あくまで「shitumon型を返す」だけで、それが「このために新たに生成する」ということは全く言っていません。
この返すshitumon型の値(オブジェクト)は完全にメソッドの中身任せです。新規にそのインスタンスを生成して返しているかもしれないし、どこかですでに生成していたインスタンスかもしれない。はたまたnullの可能性だってありえます。それはメソッドの中身を見ない限り決してわかりません。とにかく、①や②はインスタンス化しているとは限らないことを念押ししておきます。
投稿2016/09/19 06:58
編集2016/09/19 15:25総合スコア20675
0
いいえ new しないでいいクラスは基本ありません。
たとえば Calendar
java
1963 public static Calendar getInstance() { 2965 Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault()); 3966 cal.sharedZone = true; 4967 return cal; 5968 } 6 71013 private static Calendar createCalendar(TimeZone zone, 81014 Locale aLocale) { 91016 // If the specified locale is a Thai locale, returns a BuddhistCalendar 101017 // instance. 111018 if ("th".equals(aLocale.getLanguage()) 121019 && ("TH".equals(aLocale.getCountry()))) { 131020 return new sun.util.BuddhistCalendar(zone, aLocale); 141021 } else if ("JP".equals(aLocale.getVariant()) 151022 && "JP".equals(aLocale.getCountry()) 161023 && "ja".equals(aLocale.getLanguage())) { 171024 return new JapaneseImperialCalendar(zone, aLocale); 181025 } 191026 201027 // else create the default calendar 211028 return new GregorianCalendar(zone, aLocale); 221029 } 23
となり new をしてないわけじゃありません。
投稿2016/09/19 06:41
編集2016/09/19 06:43
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

退会済みユーザー
2016/09/19 09:08

0
デザインパターンでいう FactoryMethodパターンですね。
実際にはどこかで new しています。
普通に
Test test = new Test();
とすると
Testクラスしか生成できませんが、
ITest ( インターフェース, abstract ) を継承し、
Test1, Test2 クラスがあるとします。
これを
Java
1ITest Create( int n ){ 2 if( n == 1 ){ 3 return new Test1(); 4 }else{ 5 return new Test2(); 6 ] 7}
とすると、
引数しだいで 生成するオブジェクトを切り替えることができます。
あとは別のパターン適用のため、楽にするために、「間接的に」生成する。
みたいな感じだと思います。
投稿2016/09/19 07:14
総合スコア4962
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/09/19 15:49