質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

49286閲覧

インスタンス化する時に、newしないときの仕組み

shichihukujin

総合スコア18

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

3クリップ

投稿2016/09/19 06:30

多くの場合、インスタンス化するときに、例えばshitumonクラスがあったときに、
shitumon q= new shitumon();
という形をとっています。そして、これがインスタンスを作る方法だと思ってましたが、newしない次のような形も見かけました
shitumon q=shitumon.getInstance();・・・①
さらに、上の場合、shitumonクラスという共通点があるのですが
matashitumon qq=new matashitumon();
shitumon q=qq.taihen();・・・②
という風に、新しくshitumon型qを準備しても、shitumonクラスとは関係のないクラスが来ています。

初心者のため、かなり抽象的な質問になっているのは理解していますが、
具体性を持たせることも難しいです。
質問したいことは、何故、インスタンス化するときに、右辺はnewする以外に、①、②のような場合があるのですか。

SuibotuKing👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichihukujin

2016/09/19 15:49

バイト終わりで眠くて、明日理解して返事を返そうと思っていたのですが、的確で分かりやすい回答だったために、すぐに腑に落ちました。 ありがとうございます。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LLman

2016/09/19 09:04

>new しないでいいクラスは基本ありません 生成する場合はnewが必須だけど、クラスメソッドはnewせずに使えますね。 細かいことだし、べつに多用するものでもないですが。
退会済みユーザー

退会済みユーザー

2016/09/19 09:08

インスタンス化するときに~という質問ですから
shichihukujin

2016/09/19 15:52

インスタンスを生成するときはnewする必要があるということが伝わりました。 確かに、newしなくても、インスタンスが生成される?と思ってしまった節がありました。 理解が固くなりました、ありがとうございます。
guest

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

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shichihukujin

2016/09/19 15:53

どこかでnewされている このことを理解していなかったから、疑問が出てきてしまいました。 ご協力ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問