• ベストアンサー

newは明示的にした方が良いのか?

rythm3455の回答

  • rythm3455
  • ベストアンサー率36% (4/11)
回答No.1

「""」で囲った構文というのは "hoge" と、new String("hoge") は、まったく同じ意味として解釈されます。 "hoge"と書くと、自動的にString型の実体をnewで作っているのと同じです。 つまり、(1)の一行目、 String str = new String(); は、少しムダな処理をしていることになります。 ここでメモリを確保してString型の新しい実体を生成していますが、 次の行ではメモリの別の場所に確保された別の実体が割り当てられ、 結果的に、1行目で作ったほうの実体はガベージコレクションで破棄されてしまいます。 (1)のように書くのなら、 String str = null; str = "hoge"; このようにするのが良いです。

realmover
質問者

お礼

ありがとうございます。では(2)のほうが良いのですねー。 勉強になりました!

関連するQ&A

  • インスタンス生成について

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

    • ベストアンサー
    • Java
  • C++のnewの使い道

    最近C++を勉強しているのですが、new演算子はどういうときに使うべきでしょうか? メモリを動的確保できるのはわかります。 Cのmallocのようなものと考えていいのでしょうか? つまり、関数内でメモリを確保してそのアドレスを返すとか、コンパイル時に不明なサイズのメモリを実行時に確保するとか、任意のタイミングでメモリを開放したい場合などに使うものでしょうか。 ある参考書を読んでいると「引数つきコンストラクタを呼び出す場合はnewでインスタンス生成する」と書いてありました。 デフォルトコントラスタならnewなし、引数付きならnewあり、ということらしいです。 なぜこんなことをする必要があるのでしょうか?

  • インスタンス

    String s1 = new String(str1.getBytes("8859_1"), "x-euc-jp"); s1 = new String(str2.getBytes("8859_1"), "x-euc-jp"); s1 = new String(str3.getBytes("8859_1"), "x-euc-jp"); のように同じ変数にたいして new演算子で新たにインスタンスを確保した際 前に確保したインスタンスは開放されているのでしょうか? 基礎的な質問かと思いますが宜しくお願い致します。

    • ベストアンサー
    • Java
  • リフレクション 可変長引数メソッドの取得

    リフレクションで、(1)の方のメソッドインスタンスを得たいとき、どういった方法が考えられますか? //JDK 6.0 public Hoge { void method1(String str, Object ...objs){}//(1) void method1(String str, String str2){}//(2) } Hoge hoge = new Hoge(); Class c = hoge.getClass(); Method m12 = c.getMethod("method", String.class, String.class); Method m11 = c.getMethod("method", ?? );

    • ベストアンサー
    • Java
  • newしないオブジェクトについて

    C++で オブジェクト生成時、NEW しない場合、 どこにメモリ領域が作られているのでしょうか? また、newはmallocと同じで、動的にメモリを確保ということはわかるのですが、 では、newしない場合、静的ということになるのでしょうか? そうだとすると、静的なオブジェクトとは一体どのようなものをいうのでしょうか? よろしくおねがいします。

  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • クラスインスタンスとクラス型変数の配列

    C++からシフトしてきた若輩JAVAプログラマですが、微妙に理解しきれない部分があるため、お知恵をお借りしにきました。 最初にC++のサンプルを書かせていただきます。 ----- C++ ----- class Hoge {  /* 実装省略 */ } int main( void ) {  Hoge *hoge = new Hoge ;  Hoge *hoge = new Hoge[10] ; } --------------- これをJAVAで実装した場合、以下のようになると思います。 ----- JAVA ----- class Hoge {  /* 実装省略 */ } class Test {  public static void main( String[] args )  {   Hoge hoge = new Hoge() ; /* 1 */   Hoge[] hoge = new Hoge[10] ; /* 2 */  } } --------------- JAVAの場合、2ではクラスのインスタンスが確保されていないことを知りました。C++ではnewの役割が「何かをメモリ上に確保する(malloc)」という意味合いであったのに対し、JAVAの場合は考え方が違うものだということでしょうか。 そうすると、 int[] a = new int[10] ; と、 Hoge[] hoge = new Hoge[10] ; のnewは、意味が違うという認識にたどり着いてしまうのですが、そうなると『妙な』気持ちがしてしまいます。そんな面倒な言語仕様では無い気もしますし。 私の考え方が間違っている可能性が高いと思いますので、教唆していただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • Java
  • インスタンス?new?オブジェクト? の意味

    String [ ] sa = new String [3] ; この一文の意味が全くわかりません。 この時いったい何が起きているのでしょうか。 String 型 というのは特にサイズが決まっていませんよね。 C言語で int a[5];  なら aという名前で int型のサイズの分だけ5個メモリが確保された、という意味になりますね。 領域が確保できるのは、int型のサイズが決定しているからです。 では String [ ] sa = new String [3] ; は? new はいったい何をしているのか。 仮にメモリに何かをロードしているのなら何をロードしているのか。 そしてそのロードしたものの役割は何なのか。 よろしくおねがいします

    • ベストアンサー
    • Java
  • newから始まる場合がわからなくて困ってます

    以下のプログラムでわからないことがあります。 new BadBankTest(bank).start(); はnewから始まっており、2つ使ってますが、そのインスタンス生成の仕組みはどうなってるのでしょうか? 省略しない場合は、BadBankTest bt1 = new BadBankTest(bank); のように作ったインスタンスをbt1に代入になると思いますが、 newから始まった場合に左に代入しないことでの、インスタンス生成のその仕組みがわからなくて困ってます。 class BadBank { //省略 } public class BadBankTest extends Thread { BadBank bank; public BadBankTest(BadBank bank) { this.bank = bank; } public void run() { while(true) { bank.addMoney(100); bank.addMoney(-100); } } public static void main(String[] args) { BadBank bank = new BadBank(); new BadBankTest(bank).start(); new BadBankTest(bank).start(); /* 上と同じ動作 BadBank bank = new BadBank(); BadBankTest bt1 = new BadBankTest(bank); bt1.start(); BadBankTest bt2 = new BadBankTest(bank); bt2.start(); */ } }

    • ベストアンサー
    • Java
  • newを書く場所とか挙動について、分からないので

    newについて、幾つか分からないことがあるので、教えてください ■newしたら、その状態はどこまで保持されるのでしょうか? あるサイトに、 >PHPスクリプトは、処理が全て終了すると共に、メモリは開放されます と書かれていたのですが、 この場合の「処理」は、何を意味するのでしょうか? ファイルの一番最後まで来たら、newで確保した何かは自動的に解放される、 という意味でしょうか? <例> ・a.php ・b.php ・c.php … クラス記述 ・aからbへPOST ・aでもbでも、cのクラスを利用したい この場合、a、b両方のファイルに、必ず、new C と書かなければいけないのでしょうか? それとも、ファイルaにだけ、new C と書いて、 bで、require_once("a.php");としてもよいのでしょうか? あるいは、他に何か書き方があるのでしょうか? <選択肢> ・使いたいファイルで必ずnewする必要がある ・使いたいファイルで必ずしもnewする必要はない ■インスタンス名は違ってもよいのでしょうか? 上記例で、 ・ファイルaに、hoge1=new C; ・ファイルbに、hoge2=new C; とやってみたらエラーにならなかったのですが、 ということは、例えば同じクラスを複数のファイルで利用したい場合、 どうするのがいいのでしょうか? <選択肢> ・new する際、常に同じインスタンス名を利用 ・new する際、ファイル毎に異なるインスタンス名を利用 ・new する際のインスタンス名は、同じでも違っても、どっちでもよい

    • ベストアンサー
    • PHP