HOです。


前回、参照型変数と実データをどのように作成するか考えてみました。

今回は、参照型のひとつString型についてもう少し詳しく見ていきたいと思います。





さて、前回以下の記述がどうなるか課題を作ってみました。

【プログラム1】

----------------------------------------

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


    String myString;

    myString = new String("Test1"); //①

    System.out.println(myString);


    System.out.println("Test2"); //②


  }

}

---------------------------------------






いつもどおり、以上のプログラムを実行すると、
ドリームサポートネットーワークのブログ-g02 String2
となりました。


・・・まぁ、予想通りですよね!




ところで、ここで考えたい点が、

通常「参照型」の変数と実データを作成する場合、

------------------------------------

型名 変数名;

変数名 = new 型名();
------------------------------------

と記述すると前回取り上げました。

それで【プログラム1】の①でもそのように記述しているわけです。




しかし、②にある文字列はどうでしょうか。

「new」の文字は見当たりません。

しかし、同じように文字を表示させることができているのです。

なぜ、このようなことができるのでしょうか?


ここがString型の特殊な部分です。




特殊な参照型変数「String」型


今まで取り上げてきたとおり、

通常、実データを作成するには「new」キーワードを使います。



しかし、Stringが扱う文字列というのは、

プログラムが扱う型の中でも、特に重要な型です。



それで、「String」は参照型ではあるのですが、

Javaでは、このきわめて重要な「String」型に対して、

実データを作成する特別な文法が使えるようにしています。


それは、文字列をダブルクォート(” ”)で囲むという方法です。







では、次の記述を実行してみましょう。

【プログラム2】

----------------------------------------

class TestString{

  public static void main(String[] args) {


    String myString1 = new String("Test1"); //①
    System.out.println(myString1);

    String myString2 = "Test2"; //②
    System.out.println(myString2);


  }
}

---------------------------------------

どうなったでしょうか?





ドリームサポートネットーワークのブログ-g02 String2


・・・やはり、予想通りの結果となりましたね!





では、このプログラムを分析していきたいと思いますが、


【プログラム2】の①について

----------------------------------------------

  String myString1 = new String("Test1"); //①

----------------------------------------------

としました。




【プログラム1】の①では、「参照型」の変数と実データを作成する場合、

------------------------------------

型名 変数名;

変数名 = new 型名();
------------------------------------

と書きましたが、これを省略して、

------------------------------------

型名 変数名 = new 型名();
------------------------------------

と1行で2行分書く方法にしています






続いて、②について

---------------------------------------

  String myString2 = "Test2"; //②

---------------------------------------

と書くことで、

実データ「Test2」が、どこかの場所に作成され、

その場所(メモリアドレス)を、参照型変数「myString2」に入れています。


このような特殊な記述をJavaが提供しているために、

「String」は参照型変数であるにもかかわらず、

基本データ型のような記述ができてしまうわけです。


そして、かなり大雑把な説明をすると、

「"Test2"」は、「new String("Test2")」と同じ動作と言えます。

厳密にJavaを理解している方には、

全く同じ動作とは言えないと指摘されることと思いますが、

少なくとも現時点ではそのように考えることとします。


それで、最後に次の記述を考えてみましょう。

【プログラム3】

-----------------------------------

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


    System.out.println(new String("Test1")); //①

    System.out.println("Test2"); //②


  }
}

---------------------------------------

このプログラムを実行すると・・・



ドリームサポートネットーワークのブログ-g02 String2

・・・結果はいつも同じなので、もう見飽きましたね!(=_=;)



ただ、【プログラム3】の①②ともに、

実データがどこにあるかを示す「"ロッカーの鍵"を入れる"ロッカー"」を作成することなく

つまり、「参照型変数」を作成することなく、直接文字を表示させているという点で、

いままでとは違うパターンと言えます。




これで、長かった"Stringの森"ハイキング初心者コースは何とか踏破したこととしたいと思います。

実際には、"Stringの森"はもっと深い部分があるのですが、

わたしの今の実力では、遭難の恐れがあるので(^-^;)、今回はここまでとしたいと思います。



それで、この森を入るきっかけとなった次の文をまとめたいと思います。

もう忘れかけているのですが・・・(こちら の記事のことです)

--------------------------------------

String myStringA = myReader.readLine();

--------------------------------------

という記述ですが、


この「myStringA」というのは、文字列を入れる「String」型の変数ということでした。

この中には実データが入っているのではなく、実データの場所がどこかを示す"鍵"が入っていました。


そして、「myString」を「myStringA」に変えたのは、

1度目に入力されたデータを入れる場所(myStringA)と、

そのあと2度目に入力されたデータを入れる場所(myStringB)を

別個に用意する必要があったからでした。


それでは、これまでしばらく"Stringの森"に寄り道しましたが、

次回は、本題に戻って、料理分量ツールのアレンジの続きをしていきたいと思います。







久しぶりですが、今日のポイントです!


「String」型は、参照型変数ではあるが、

よく使う変数なので、ダブルクォート("")で囲むことによって、

実データが作成され、かつ基本データ型のように記述することができる。

HOです。


前回までで、変数には「基本データ型」と「参照型」の2種類があると説明しました。

今回は、参照型変数と実データについてもう少し詳しく考えて行きたいと思います。



「参照型変数」と「実データ」の作成


前回、参照型変数は「"ロッカーの鍵"を入れる」タイプと説明しました。

つまり、参照型変数の中には「実際のデータがどこにあるかを示すメモリ番号」が入ります。




この場合、大きく分けて2種類のロッカーを取り分けることになります。


①「"ロッカーの鍵"を入れる」ためのロッカー。

②「その鍵に対応する"ロッカー"」自身。


という2つです。




もう少し、具体的に言うと、

①「メモリアドレス」を入れる変数

②「実データ(実体)」を入れる場所

を、パソコンのメモリ上に取り分けることになります。



これを記述すると、

------------------------------------

型名 変数名; //(1)

変数名 = new 型名(); //(2)
------------------------------------

となります。


(1)で、メモリアドレスを入れる変数を用意しています。

(2)で、実データを作成し、

そのメモリアドレスを、(1)で用意した変数に入れるわけです。




例えば、型名として、「String」型を使用する場合、次のように記述できます。

------------------------------------

String myString; //(3)

myString = new String("Test"); //(4)

------------------------------------


この場合、

(3)で、変数「myString」を、Stringの参照型変数として作成しています。

そして(4)で、文字列「Test」という実データをメモリ上に確保し、

そのメモリアドレスを、「myString」に入れていることになります。




では、次の記述はどうでしょうか。

----------------------------------------

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


String myString; //(5)
myString = new String("Test1"); //(6)

System.out.println(myString); //(7)


}
}

----------------------------------------


(5)(6)で、参照型変数と実データ「文字列"Test1"」を作成し、

実データの場所を、参照型変数「myString」に入れています。


(7)で、その「myString」を、画面に文字を表示させる命令文に入れています。



いつもどおり、①プログラムを保存し、②コマンドプロンプトの設定をし、

③コンパイルし、④実行します。

(※上記の方法を復習されたい方は、①こちら 、②こちら 、③こちら 、④こちらこちら



結果どうなるでしょうか。


ドリームサポートネットーワークのブログ-g01 String1

(7)で、参照型変数を指定すると、

その実データがある場所が参照され、文字列「Test1」が表示されました。





では、次の記述はどうなるでしょうか。

----------------------------------------

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


String myString;
myString = new String("Test1");

System.out.println(myString);


System.out.println("Test2");


}
}

---------------------------------------


次回は、この点を取り上げます。

HOです。


大変お待たせいたしましたm(_ _)m

急ぎの作業があったことと、

今回の記事をまとめることがなかなかできず遅くなってしまいました。


まだ完成形ではないのですが、

ある程度まとめましたので記事を公開したいと思います。



前回、「基本データ型」と呼ばれる変数の型について取り上げ、

最後に「String」型の正体は何か?という疑問を提起しました。

今回は、その点について取り上げたいと思います。

それを理解するための第1歩は、

変数の型には大きく分けて前回取り上げた「基本データ型」とは別に、

「参照型」というものがあることを理解する必要があります。




「参照型」変数


では「参照型」とはどんなものでしょうか。


変数を"ロッカー"に例えると、

「基本データ型」は、ロッカーに「直接"荷物"(値)を入れる」タイプであるのに対し、

それに対し、「参照型」は、「"ロッカーの鍵"を入れる」タイプと言えます。


もう少し具体的に説明すると、

「基本データ型」変数の中には、「直接数字や文字等が入る」のに対し、

「参照型」変数の中には、「実際のデータがあるメモリ番号という"鍵"」が入ります。


つまり参照型の場合、実際のデータは別"ロッカー"に保管されることになります。




例えば、今考えているキーボード入力の一文を取り上げてみましょう。

--------------------------------------------------------------------

  java.io.BufferedReader myReader =

   new java.io.BufferedReader( new java.io.InputStreamReader(System.in),1);

--------------------------------------------------------------------

ここで「myReader」というのが「BufferedReader」という型の変数です


そして、続く「new~」の部分で、実際のデータを入れる場所を作成しています。

そして、その場所がどこかを「myReader」という変数に入れることになります。



「String」型変数もこの参照型変数になります。



次回この点をさらに詳しく考えたいと思います。
次回の更新目標は9日(火)23時頃です。




実は、わたしはVBA・C言語を学んでから、Javaを学んだときに、

この部分が大変苦労した点でした。

しかし、Javaの道を踏破するには、避けては通れない部分です。

この苦手意識を克服することを目指してまとめていきたいと思います。


レッツゴー7&8(七転び八起きの略です(苦しい略ですかね汗))!!