
Objectクラスを抽象クラスとするサブクラスに
Stringというクラスがあります。
ストリングオブジェクトの宣言は下記のようにします。
String[] url = new String[2];
ストリングクラスは以下のように宣言時に初期化が可能です。
String[] url = {"honyahonya.com","0"};
また、以下のような指定も出来ます。
this.method( new String[]{"honyahonya.com","0"} );
そこで質問ですが
Stringとはなぜこのような扱い方ができるのですか?
他のクラスとは、例外的に扱いが違うだけなのですか?
初期化で指定した文字列はどのように解釈されて、どういう
扱いがされているのでしょうか?
普段はなんとも思わず使っていますが
なんとなく気になりませんか・・・。
No.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クラスを使わなければならない不便も改善して欲しいですね。
No.3
- 回答日時:
この辺に詳しい解説があります。
参考にしてくださいhttp://www.lcv.ne.jp/~kenmio/yomimono/yomimono10 …
http://www.nextindex.net/java/class/String.html
下段のページの API仕様 というアンカからリファレンスに
飛びましたが、その中の記述に
「Java 言語は、文字列連結演算子 ( + )、およびその他のオブジェクトから文字列への変換に対する特別なサポートを提供します。」
特別なサポートってありますね・・・。
何を指しているのかよく意味がわかりませんでしたが
そのへん理解しないと駄目なんだろか。
No.2
- 回答日時:
Javadocでは『String クラスは文字列を表します。
Java プログラム内の「abc」などのリテラル文字列はすべて、このクラスのインスタンスとして実行されます。』と記載されています。これで解決だと思いますが、以下に補足します。
>String[] url = {"honyahonya.com","0"};
はStringインスタンス"honyahonya.com"と"0"を初期化子としてString配列をインスタンス化しています。
>new String[]{"honyahonya.com","0"}
は、明示的にString配列を宣言して、初期化しています。
これだけの違いです。インスタンス化する方法がいくつかあるという程度です。
また、String以外にも同様の手順でインスタンスを生成することが可能です。
すみません、質問の例については自分の誤りに気づきました。
確かに、他のクラスでも同様に生成できますね・・・。
例えば、Stringクラスと同じ働きのクラスを
自作することって可能なんでしょうか?
Stringクラスについて特殊性が
あるのか、ないのかが知りたい内容です。
No.1
- 回答日時:
>Stringとはなぜこのような扱い方ができるのですか?
>他のクラスとは、例外的に扱いが違うだけなのですか?
どう扱いが違うと思っておられるのか良くわかりません。
例として挙げられているのが String の配列になっていますが、何か意図があるのですか?
単純に文字列リテラル "honyahonya.com" が String のコンストラクタに与えられることがわからないということではないんですよね?
すみません、質問の仕方がおかしかったです。
根本的に私は上級プログラマではないので
理解が途切れ途切れのところがあります。
扱いとして分からなかったのが
String url = "honyarara.com";
と、した場合に url自体 が設定した文字列を
現せることが不思議に感じています。
コンストラクタに与えた文字列に対して
url.toString();で現すというなら分かりますが
urlとしただけでも文字列を表現できる点が
特殊で例外的なクラスなのかと思いました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java javaのクラスの分け方について質問です。 APIの内部用と外部用でクラスを分けたいのですがインター 2 2022/04/26 16:06
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- Java リレーションエンティティクラスとは何ですか? 2 2023/02/10 00:02
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- C言語・C++・C# クラスのメンバ変数を基準に並べ替えをしたい 5 2022/12/25 17:40
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
クラスの宣言でのメモリ使用サ...
-
Java「デフォルトのパッケージ...
-
クラス宣言とアクセス制御
-
NotClassDefFoundExceptionにつ...
-
superの使い方
-
重複エラーを解決するには
-
中学生です。 私は教室の黒板に...
-
クラスの利点について
-
Netscape 6.1/6.2 IE6(win)でAp...
-
eclipse でクラスに色
-
遺伝的アルゴリズムによる繰り...
-
「隣の芝生は青く見える」現象...
-
配列の重複する値とその個数を...
-
ドラクエの「復活の呪文」的な...
-
C++でのアップロードの方法(初...
-
VB.netのコンテナークラスとは...
-
Stringクラスは他のクラスとど...
-
JAVAにおけるパッケージとライ...
-
3年間同じクラスになる確率
-
Eclipseを入れたら、Swingは使...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同じクラスにならない確率を教...
-
そんなにお金がなくても年に1度...
-
河合塾のクラス分けについて
-
今回のクラス替え最悪でした、...
-
3年間同じクラスになる確率
-
java eclipse 型に解決できません
-
恋愛
-
同一パッケージにあるクラスが...
-
小学4年の頃、好きな同級生にス...
-
配列の重複する値とその個数を...
-
main()を持つクラスが2つ以上...
-
EclipseでJSPのコンパイルエラー
-
共通で使う関数を集めたクラス...
-
他クラスのすごくかっこいい同...
-
どこからも呼ばれていない無意...
-
中学生です。 私は教室の黒板に...
-
ネスカフェ エクセラ と UCCク...
-
dllと同じプロジェクトにする方法
-
「隣の芝生は青く見える」現象...
-
コンボボックスのマウスホイー...
おすすめ情報