dポイントプレゼントキャンペーン実施中!

Objectクラスを抽象クラスとするサブクラスに
Stringというクラスがあります。

ストリングオブジェクトの宣言は下記のようにします。
String[] url = new String[2];

ストリングクラスは以下のように宣言時に初期化が可能です。
String[] url = {"honyahonya.com","0"};

また、以下のような指定も出来ます。
this.method( new String[]{"honyahonya.com","0"} );

そこで質問ですが
Stringとはなぜこのような扱い方ができるのですか?
他のクラスとは、例外的に扱いが違うだけなのですか?
初期化で指定した文字列はどのように解釈されて、どういう
扱いがされているのでしょうか?

普段はなんとも思わず使っていますが
なんとなく気になりませんか・・・。

A 回答 (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クラスを使わなければならない不便も改善して欲しいですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
もやもやしたものがスッキリしました。

お礼日時:2007/11/10 10:21

この辺に詳しい解説があります。

参考にしてください

http://www.lcv.ne.jp/~kenmio/yomimono/yomimono10 …
http://www.nextindex.net/java/class/String.html
    • good
    • 0
この回答へのお礼

下段のページの API仕様 というアンカからリファレンスに
飛びましたが、その中の記述に
「Java 言語は、文字列連結演算子 ( + )、およびその他のオブジェクトから文字列への変換に対する特別なサポートを提供します。」

特別なサポートってありますね・・・。
何を指しているのかよく意味がわかりませんでしたが
そのへん理解しないと駄目なんだろか。

お礼日時:2007/11/08 00:32

Javadocでは『String クラスは文字列を表します。

Java プログラム内の「abc」などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。』と記載されています。

これで解決だと思いますが、以下に補足します。

>String[] url = {"honyahonya.com","0"};
はStringインスタンス"honyahonya.com"と"0"を初期化子としてString配列をインスタンス化しています。

>new String[]{"honyahonya.com","0"}
は、明示的にString配列を宣言して、初期化しています。

これだけの違いです。インスタンス化する方法がいくつかあるという程度です。
また、String以外にも同様の手順でインスタンスを生成することが可能です。
    • good
    • 0
この回答へのお礼

すみません、質問の例については自分の誤りに気づきました。
確かに、他のクラスでも同様に生成できますね・・・。
例えば、Stringクラスと同じ働きのクラスを
自作することって可能なんでしょうか?
Stringクラスについて特殊性が
あるのか、ないのかが知りたい内容です。

お礼日時:2007/11/08 00:27

>Stringとはなぜこのような扱い方ができるのですか?


>他のクラスとは、例外的に扱いが違うだけなのですか?
どう扱いが違うと思っておられるのか良くわかりません。
例として挙げられているのが String の配列になっていますが、何か意図があるのですか?
単純に文字列リテラル "honyahonya.com" が String のコンストラクタに与えられることがわからないということではないんですよね?
    • good
    • 0
この回答へのお礼

すみません、質問の仕方がおかしかったです。
根本的に私は上級プログラマではないので
理解が途切れ途切れのところがあります。

扱いとして分からなかったのが
String url = "honyarara.com";
と、した場合に url自体 が設定した文字列を
現せることが不思議に感じています。

コンストラクタに与えた文字列に対して
url.toString();で現すというなら分かりますが
urlとしただけでも文字列を表現できる点が
特殊で例外的なクラスなのかと思いました。

お礼日時:2007/11/08 00:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!