- ベストアンサー
Stringクラスは他のクラスとどう違う?
Objectクラスを抽象クラスとするサブクラスに Stringというクラスがあります。 ストリングオブジェクトの宣言は下記のようにします。 String[] url = new String[2]; ストリングクラスは以下のように宣言時に初期化が可能です。 String[] url = {"honyahonya.com","0"}; また、以下のような指定も出来ます。 this.method( new String[]{"honyahonya.com","0"} ); そこで質問ですが Stringとはなぜこのような扱い方ができるのですか? 他のクラスとは、例外的に扱いが違うだけなのですか? 初期化で指定した文字列はどのように解釈されて、どういう 扱いがされているのでしょうか? 普段はなんとも思わず使っていますが なんとなく気になりませんか・・・。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Stringクラスは特別ですね。 ダブルクォーテーションで挟まれた文字列はそれだけでStringクラスのインスタンスとして扱われますし、『+』で連結していける、というような点も他のクラスとは異なります。 参照型変数でありながら、基本データ型変数のような利便性が提供されているんですね。 ただ、これはJava言語の仕様なので、自作クラスをこのように優遇することはできません。 例えば、どう頑張っても MyClass myClass = "abc"; のような形にする事はできません。 MyClass myClass = new MyClass("abc"); の形でなければなりません。 String型のこのような優遇はおそらく、プログラミングにおいて文字列を使う機会が圧倒的に多い事から規定された仕様なのでしょう。 String型は結構紆余曲折のあるクラスです。 以前は、文字列の連結を行う際には String st = "abc" st += "def" のような形は、使うことこそできるものの、『処理が遅くなる』という理由で推奨されませんでした。 文字列の連結を行う場合は、代わりにStringBufferクラスを使うように、というような説明がちょっと古いJavaの本やインターネット上の情報には出ていますね。 しかし現在では(1.5からだったかな?)、コンパイラの性能が上昇したらしく、むしろString型のまま連結していく事が推奨されています。 個人的には、桁の多い小数点計算でBigDecimalクラスを使わなければならない不便も改善して欲しいですね。
その他の回答 (3)
- lumba_lumb
- ベストアンサー率26% (4/15)
この辺に詳しい解説があります。参考にしてください http://www.lcv.ne.jp/~kenmio/yomimono/yomimono103.htm http://www.nextindex.net/java/class/String.html
お礼
下段のページの API仕様 というアンカからリファレンスに 飛びましたが、その中の記述に 「Java 言語は、文字列連結演算子 ( + )、およびその他のオブジェクトから文字列への変換に対する特別なサポートを提供します。」 特別なサポートってありますね・・・。 何を指しているのかよく意味がわかりませんでしたが そのへん理解しないと駄目なんだろか。
- m-oosgi
- ベストアンサー率62% (10/16)
Javadocでは『String クラスは文字列を表します。Java プログラム内の「abc」などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。』と記載されています。 これで解決だと思いますが、以下に補足します。 >String[] url = {"honyahonya.com","0"}; はStringインスタンス"honyahonya.com"と"0"を初期化子としてString配列をインスタンス化しています。 >new String[]{"honyahonya.com","0"} は、明示的にString配列を宣言して、初期化しています。 これだけの違いです。インスタンス化する方法がいくつかあるという程度です。 また、String以外にも同様の手順でインスタンスを生成することが可能です。
お礼
すみません、質問の例については自分の誤りに気づきました。 確かに、他のクラスでも同様に生成できますね・・・。 例えば、Stringクラスと同じ働きのクラスを 自作することって可能なんでしょうか? Stringクラスについて特殊性が あるのか、ないのかが知りたい内容です。
- koko_u_
- ベストアンサー率18% (459/2509)
>Stringとはなぜこのような扱い方ができるのですか? >他のクラスとは、例外的に扱いが違うだけなのですか? どう扱いが違うと思っておられるのか良くわかりません。 例として挙げられているのが String の配列になっていますが、何か意図があるのですか? 単純に文字列リテラル "honyahonya.com" が String のコンストラクタに与えられることがわからないということではないんですよね?
お礼
すみません、質問の仕方がおかしかったです。 根本的に私は上級プログラマではないので 理解が途切れ途切れのところがあります。 扱いとして分からなかったのが String url = "honyarara.com"; と、した場合に url自体 が設定した文字列を 現せることが不思議に感じています。 コンストラクタに与えた文字列に対して url.toString();で現すというなら分かりますが urlとしただけでも文字列を表現できる点が 特殊で例外的なクラスなのかと思いました。
お礼
ご回答ありがとうございます。 もやもやしたものがスッキリしました。