文字列リテラル - 萌えJava超入門
第十八章 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のメソッドは、
自分自身の値を変更しないことだけ
覚えておいてくれればいいよ。



次のページからメソッドを説明しますね。

お疲れ様でした。


© 2019 awasekagami