第十八章 Stringクラス
文字列リテラル
文字列リテラルはStringクラスのインスタンスを生成しています。
String str = "abc";
目次
1.文字列リテラルはインスタンスの生成
文字列リテラルはStringクラスのインスタンスを生成しています。
重要
String str = "abc";
||
char data[] = {'a', 'b', 'c'};
String str = new String(data);
Stringはクラスなので、基本型(プリミティブ型)変数と違って、メモリアドレスに直接値が入っているわけではありません。
本来は、new演算子でインスタンスを生成するところですが、
コンパイラが、文字列リテラルを「インスタンスの生成」と読み替えているのです。
これによって、Stringクラスは基本型の様な感覚で使用できるのです。
「Stringはクラス」ってどうも
しっくり来なかったんスけど、
そうゆうことだったんですね。
じゃあやっぱり
クラスとして意識する必要は
あるの?
ん~。
せっかく基本型のように
使えるようにしてくれたのだから、
普通に騙されていればいいと思うよ。
ただ、Stringはクラスなので
便利なメソッドが
多数用意されている。
これを使わない手は無い。
2.インスタンス変数 value
private final char value[];
Stringのインスタンス変数は、charの配列「value」です。
文字列リテラルで与えられた文字列を、charの配列として保存します。
valueには、final修飾子が付与されているので、変更できません。
このため、Stringの多くのメソッドは、結果を戻り値として受け取る必要があります。
あれ?
値を変えられないって
どうゆうことっスか?
例えばこんなプログラムの場合、
インスタンスの上書きが起こっている。
//Sample18_01.java
class Sample18_01{
public static void main(String[] args){
String str;
str = "abc"; //「"abc"」はインスタンス
System.out.println(str);
str = "def"; //「"def"」はインスタンス
System.out.println(str);
}
}
コマンドライン
>cd ws
ws>javac Sample18_01.java
ws>java Sample18_01
abc
def
最初の初期化で、valueに['a','b','c'] の値を持つインスタンスが生成されて、strにそのアドレスが記載されます。
二回目の初期化で、valueに['d','e','f'] の値を持つ新しいインスタンスが生成されて、strにそのアドレスが上書きされたのです。
valueの書き換えではなく、
インスタンスごと上書きされて
前の"abc"のインスタンスは
ガベージコレクションによって
削除されたんだ。
そう言えば
まえにそうゆうの
あったわね。
Stringのメソッドは、
自分自身の値を変更しないことだけ
覚えておいてくれればいいよ。
次のページからメソッドを説明しますね。
お疲れ様でした。