コンテンツにスキップ

参照型と文字列型(String型)

01−2では、基本データ型について多くの説明をしました。
本章では、先の章で紹介した参照型について説明します。
参照型は、基本的にそれぞれクラスが用意されているオブジェクト指向のものです。

イメージ

参考: オラクルのドキュメント

用語

POINTER(ポインタ)

ポインタ (pointer) とは、あるオブジェクトがなんらかの論理的位置情報でアクセスできるとき、それを参照する(指し示す)ものである。 有名な例としてはC/C でのメモリアドレスを表すポインタが挙げられる。(from Wikipedia 2020/05)

/*
それぞれ変数があり、変数はさし示しているだけで、どこかに実体(インスタンス)がある。

str1 (ポインタ) ------> ["Good Morning!"](実体)
str2 (ポインタ) ------> ["Good Afternoon!"](実体)
str3 (ポインタ) ------> ["Good Evening!"](実体)
*/

String str1 = "Good Morning!";
String str2 = "Good Afternoon!";
String str3 = "Good Evening!";

// 3のポインタを2にも入れる

str2 = str3; // str2 <- str3のPOINTER

// 上記を実行すると、2と3は以下の通りになる。

/*
str1 (POINTER) ------> ["Good Morning!"](INSTANCE)
str2 (POINTER) --      ["Good Afternoon!"](INSTANCE) => System.gc(); ガーベージコレクション(メモリ解放)対象
                 \
str3 (POINTER) ---- -> ["Good Evening!"](INSTANCE)
*/

レーザーポインターとかマウスの矢印(ポインター)と同じ考え。

レーザーポインターは、パワポのある部分を指し示すけど、レーザーポインター自体に指し示した先の情報はない。

マウスも文字などにカーソルを合わせるけど、マウスが文字情報を持っているわけではない。

String型について

文字列の型です。

様々なメソッドを持ちます。

参照型は==で判断することができません。

そのため、変数str1str2に対し、str1.equals(str2)というメソッドで判定させます。

テストプログラム

同じ文字列型の0にしているのに、==で確認すると、falseが出るときがあります。確認してみてください!

class StringTest{
    public static void main(String[] args){

        int intd = 0;
        int byted = 0;
        char chard = '0';
        String str0 = "0";
        String str1 = "0";
        String str2 = new String("0");
        String str3 = String.valueOf(chard);
        String str4 = String.valueOf(intd);
        String str5 = String.valueOf(intd);
        String str6 = String.valueOf(byted);

        System.out.println("intd :"+intd+" <- DEFINE INT");
        System.out.println("byted:"+byted+" <- DEFINE BYTE");
        System.out.println("chard:"+chard+" <- DEFINE CHAR");
        System.out.println("---------------------");
        System.out.println("str0:"+str0+" <- DEFINE STRING");
        System.out.println("str1:"+str1+" <- DEFINE STRING");
        System.out.println("str2:"+str2+" <- DEFINE STRING");
        System.out.println("str3:"+str3+" <- CONVERT FROM CHAR 'chard'");
        System.out.println("str4:"+str4+" <- CONVERT FROM INT 'intd'");
        System.out.println("str5:"+str5+" <- CONVERT FROM INT 'intd'");
        System.out.println("str6:"+str6+" <- CONVERT FROM BYTE 'byted'");
        System.out.println("---------------------");
        System.out.println("intd == byted     : "+(intd == byted));
        System.out.println("intd == chard     : "+(intd == chard));
        System.out.println("str0 == str1      : "+(str0 == str1));
        System.out.println("str1 == str2      : "+(str1 == str2));
        System.out.println("str1 == str3      : "+(str1 == str3));
        System.out.println("str1 == str4      : "+(str1 == str4));
        System.out.println("str4 == str5      : "+(str4 == str5));
        System.out.println("str4 == str6      : "+(str4 == str6));
        System.out.println("str1 equals str3  : "+(str1.equals(str3)));
    }
}

最終更新日: 2021年4月30日