<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/longwoodbow/">
    <title>long wood bow @ ウィキ</title>
    <link>http://w.atwiki.jp/longwoodbow/</link>
    <atom:link href="https://w.atwiki.jp/longwoodbow/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>long wood bow @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2021-09-20T22:49:48+09:00</dc:date>
    <utime>1632145788</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/3.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/2.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/longwoodbow/pages/1.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/21.html">
    <title>Java独学ノート/その3:条件で分岐や繰り返しを行う</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/21.html</link>
    <description>
      #contents
*この内容をやって行く前に...
ここで、命令文を新しくお教えします。もっと早く教えても良かったかもしれないですが、一応十分演算と変数の知識が付いてからが良いかと思ったので...
今までSystem.out.println()だけを使っていましたが、ここから先、変数の初期数値を変えて検証するためにわざわざコンパイルを繰り返すのは面倒かと思います。そのため、変数と初期化を行っている部分で使ってみてください。
実行して、その文に差し掛かった際に数値を入力できるようになって、入力した数値が変数に入るという命令です。
 int x = new java.util.Scanner(System.in).nextInt();
 
 例:
 public class ScannerTest0
 {
  public static void main(String[] args)
  {
   int x = new java.util.Scanner(System.in).nextInt();
   int y = new java.util.Scanner(System.in).nextInt();
   System.out.println(x + y);
  }
 }
例のコードを実行すると、コマンドプロンプトで数値を入力出来るようになり、入力してエンターキーを押す(xに入力した数字を代入)ともう一度数値を入力出来て、また数値を入力してエンターキーを押す(yに入力した数字を代入)と、その2つの数字を足した数字を表示するはずです。

また、この命令文自体が、変数のようにその型のリテラルに変化するという性質があるので、上記と同じ事をこんな感じでやる事も可能です。
 public class ScannerTest1
 {
  public static void main(String[] args)//メインメソッド
  {
   System.out.println(new java.util.Scanner(System.in).nextInt() + new java.util.Scanner(System.in).nextInt());
  }
 }

これは他の型用の命令も存在します。ただしchar型用の命令は存在しません。
 boolean x = new java.util.Scanner(System.in).nextBoolean();
 byte x = new java.util.Scanner(System.in).nextByte();
 short x = new java.util.Scanner(System.in).nextShort();
 long x = new java.util.Scanner(System.in).nextLong();
 float x = new java.util.Scanner(System.in).nextFloat();
 double x = new java.util.Scanner(System.in).nextDouble();
 String x = new java.util.Scanner(System.in).nextLine();
longの場合、10のようにlを付けずに入力してください。
floatの場合、1.1のようにfを付けずに入力してください。
float、doubleは10のように整数を入れても機能します。

所で、配列と同様new演算子を使っていますが、これはオブジェクト指向の知識が必要なのでその際お教えします。
また、ちゃんとした入力をしないと例外と呼ばれるエラーを起こして途中で終了してしまいます。この例外と対策方法についてもその際お教えしますので、今は気を付けてくださいとだけ言っておきます。

さて、プログラムの流れ(制御構造、制御フロー)は、順番通り処理を行う順次、その時点での条件によってする処理を変える分岐、条件を満たすまで処理を繰り返す繰り返しの3つが代表的で、その3つで全ての事ができるとされています。
その中の分岐と繰り返しについてやっていきます。
*条件分岐
**分岐の基本と条件の定義
もしこのようになっていたら、この中の文を実行する、そうでなかったら中の文は実行しないという文の事を&amp;color(#F54738){&amp;bold(){if文}}と言い、Javaではこのように書きます(C言語を祖先に持つものは基本これだったりします)。
 if(条件){条件がtrueの時に実行して欲しい文}

&amp;u(){条件は(最終的に)boolean型(になるもの)を使います。}以下は原理をそのまま使ったコードです。
 public class If0
 {
  public static void main(String[] args)
  {
   if(true)//()の中にboolean型のリテラルを入れた
   {
    System.out.println(&quot;trueなのでメッセージを表示します&quot;);//この中にはいくらでも文を入れられる、trueの場合は入れた文をすべて順番通りに行う
   }//何か処理をする文ではないので;はいらない
   System.out.println(&quot;プログラムを終了します&quot;);
  }
 }
これをコンパイルして実行すると、
 trueなのでメッセージを表示します
 プログラムを終了します
と表示されるはずです。
一方、trueをfalseにするとプログラムを終了しますとだけ出てきます。&amp;u(){ifの後の()の中がfalseの場合、中括弧の中の文は実行されません。}

さて、今trueかfalseが入ってる部分に、その文を実行したい時にはtrue、したくない時にはfalseになるようにする事で条件によってやることが変わるようになります。これが条件分岐です。
試しに2つの数字を足し算して10になるときにメッセージを表示するように条件分岐してみましょう。変数を足し算して10になるときはtrue、そうでなければfalseになる演算をして、それをif文の()の中に入れます。
 public class If1
 {
  public static void main(String[] args)
  {
   int x = 6;//1つ目の数字
   int y = 4;//二つ目の数字
   boolean b = x + y == 10;//xとyを足し、関係演算子==で10であるならtrue、それ以外ならfalseに変化し、代入演算子=でbに代入
   if(b)//boolean型の変数を入れた、この例ではtrue
   {
    System.out.println(&quot;trueなのでメッセージを表示します&quot;);
   }
  }
 }
この場合xは6、yは4なので6+4で10、つまりbにtrueが入ります。
そしてifの()の中で変数bは中身であるtrueに変化し、if文の内容を実行させた感じです。
試しにx、yの数字を変えてみましょう、足して10以外になる数字では文章が表示されず終了するはずです。

また、()の中でも演算は可能なので、このようにも表現できます。というかこれが基本形だったりします。
もちろん結果は上記と同じです。
 public class If2
 {
  public static void main(String[] args)
  {
   int x = 6;//1つ目の数字
   int y = 4;//二つ目の数字
   if(x + y == 10)//中で演算、例の場合は関係演算子==で最終的にtrueになる、()の中の場合は;はいらない
   {
    System.out.println(&quot;trueなのでメッセージを表示します&quot;);
   }
  }
 }
逆に上記のようにboolean型の変数を使う場合は稀です、途中の条件分岐で他の処理をしつつtrueやfalseに変化していって、最後の処理をどうするかがその変数で決まる、
あるいは色々条件分岐があって、どれかが引っかかったらfalseにして最後の条件分岐を行わない、などなど...有用なテクニックなので覚えて損はない...と思います。

演算の復習になりますが、もし10以外の時だけ文章を表示させたい時は、この場合は以下の方法があります。
 boolean b = x + y == 10; if(!b)//boolean型の変数がtrueに変化し、論理演算子!でfalseに変化
 if(x + y != 10)//合っている場合はfalseになる関係演算子
 if(!(x + y == 10))//!は加減乗除の演算子より優先されるので評価後boolean型になる式を()で囲いその前に付ける、&amp;&amp;や||を使った複雑な式をまとめて反転させるときなどに使うテクニック
**条件と違う場合にも何か実行する
if文を使う上で、条件と違っていたら違っていたで、別の事をして欲しい時っていうのは多くあります。
論理演算子!を使って反転させた条件文を入れたif文を付けても良いのですが(非推奨)、この時使うのは&amp;color(#F54738){&amp;bold(){else文}}です。

以下のように、else{}をif文の後に付ける事で、&amp;u(){if文の条件が成立しない時に中括弧の中の内容を実行します。}
 public class If3
 {
  public static void main(String[] args)
  {
   int x = 6;
   int y = 4;
   if(x + y == 10)
   {
    System.out.println(&quot;結果はtrueです&quot;);
   }
   else//x + y == 10がfalseになる場合
   {
    System.out.println(&quot;結果はfalseです&quot;);
   }
  }
 }
これをこのままコンパイルして実行すると結果はtrueですと表示されます。
逆に、たとえばx = 5にするとx + yは9、9 == 10という演算が行われてfalseになりif文の内容は実行されず、代わりにelse文の内容である、結果はfalseですという文章が表示されます。

ちなみに、else(条件){内容}と書いて条件がfalseだと実行されるみたいにする事は出来ませんのであしからず(コンパイルエラーになる)。

また、これもif文で出来るっちゃあ出来るのですが、便利な書き方で&amp;color(#F54738){&amp;bold(){else-if文}}というものがあります。
これは、最初のif文に付けることで、&amp;u(){最初のif文の条件に当てはまらず(false)、&amp;bold(){なおかつ}else-if文の条件には合う(true)場合にその内容が実行される文です。}
このelse-if文の後にさらにelse文、もしくはelse-if文をつなげる事もできます。
前者は最初のif文から後続のelse-if文全ての条件で全てfalseが出た場合にだけ実行されます。
後者は最初のif文から後続の、自分自身より前のelse-if文までの条件でfalseが出て、自分自身の条件でtrueが出た時のみ実行し、後に続くelse文、もしくはelse-if文は無視されます。
以下は一例です。変数xに入っている数字が5を基準に大きいか小さいかを表示します。
 public class If4
 {
  public static void main(String[] args)
  {
   int x = 6;
   if(x &lt; 5)//xが5より小さい
   {
    System.out.println(&quot;xは5より小さい数字です&quot;);//x &lt; 5がfalse、つまり5以上ならこの文は表示されず、trueならこれだけ表示されて後の繋がってる2つの文はelse文まで無視される
   }
   else if(x &gt; 5)//xが5より大きい場合、なおかつxが5より小さくない場合(小さかったらif文の内容を実行してここをスルーしているはずなので)
   {
    System.out.println(&quot;xは5より大きい数字です&quot;);//これが表示されて繋がっているelse文は無視
   }
   else//xが5より小さくなく、さらに大きくなかった場合
   {
    System.out.println(&quot;xは5です&quot;);
   }
  }
 }
このままコンパイルして実行すると、xが6なので、if文は、条件がxが5未満の時なのでfalseになり内容は無視され、次のelse-if文、条件がxが5を超える時なのでtrueになり、xは5より大きい数字ですと表示、ここでtrueが出たので後のelse文は無視されます。
仮にxが4の場合、if文の条件でtrueが出る(4 &lt; 5が成立する)のでif文の内容である、xは5より小さい数字ですという文を表示する処理がされ、以降のelse-if文とelse文はtrueが出たので無視されます。
xが5の場合、if文の条件はfalseで次に行き、次のelse-if文の条件もfalseなので、次のelse文の内容である、xは5ですという文を表示する処理が行われます。

ここまでをまとめると、&amp;u(){条件分岐は、if文から始まり場合によってelse-if文が連なり、最終的に場合によってelse文で締める}、これが一まとまりとして見ることができます。

所で、今までやった&amp;u(){if文、if-else文、else文は、もしも&amp;bold(){中身の文が一つだった場合}、つまり終端の&quot;;&quot;が1つだけの場合は&amp;bold(){中括弧を省略することができます。}}
推奨していない参考書等もありますが、うまく使えばよりすっきりとしたコードを書くことができます。

上記二つの内容を踏まえ、以下のコードを見てください。...参考程度に。

 public class If5
 {
  public static void main(String[] args)
  {
   int x = new java.util.Scanner(System.in).nextInt();
 
   //条件分岐その1、この中のどれかが必ず行われる
   if(x &lt; 0)
    System.out.println(&quot;xは負の数です。&quot;);
   else if(x &gt;= 10)
    System.out.println(&quot;xは二桁以上の数です。&quot;);
   else if(x &lt; 5)
    System.out.println(&quot;xは5より小さい一桁の数です。&quot;);
   else
    System.out.println(&quot;xは5以上の一桁の数です。&quot;);
   //ここまでのどれかが行われる
 
   //条件分岐その2、else文が無いため、これらの条件のどれにも一致しない場合は何も起きない
   //上記とは違う書き方だが見やすさの違いだけ
   //この章の終わりに詳しく解説するが、コードの書き方って意外と自由
   if(x &lt;= 0)           System.out.println(&quot;xについての情報は特にありません。&quot;);
   else if (x % 10 == 0)System.out.println(&quot;xは10の倍数です。&quot;);
   else if(x % 5  == 0) System.out.println(&quot;xは2の倍数ではなく5の倍数です。&quot;);//10 = 2 * 5なので最初の条件に引っかからなければ2の倍数ではない
   //ここまでの条件に全て当てはまらない場合は何も起きない
 
   //条件分岐その3、最後にelseがあるが、条件で行う内容が空の部分もあるので何も起きない事も
   if(x &lt;= 0)         ; //;だけ書くと何もしない(内容の無い文)、この記載法で後に何も書かないと後の文を条件でやる内容にしたり、if文なら入れ子にしてしまったりしてしまう、この書き方は特に非推奨
   else if(x % 2 == 0)System.out.println(&quot;xは偶数です。&quot;);
   else               System.out.println(&quot;xは奇数です。&quot;);
   //xが0以下でなければどっちかが表示される
  }
 }
これをコンパイルして実行すると、始めに紹介した命令により、数字が入力できるようになると思います。
数を入力してエンターキーを押すと、その数がxに代入されます。
色々な数で試して、想像した通りの表示がされるか確認し、条件分岐の理解が深まったら...と思います。
**変数の内容に応じた処理をする
if文はその内容を実行するべきか、関係演算子や論理演算子で確かめて決める方法でした。
一方、&amp;u(){変数の中身によって実行する事を変える}という条件分岐も存在します。その方法で実行内容を分岐するには&amp;color(#F54738){&amp;bold(){switch文}}を使います。

switch文で&amp;u(){使えるのはbyte、short、int、char、String型}((相当後で説明する列挙型も使えます))で、逆に&amp;u(){long、float、doubleは使えません。}

switch文は以下の文を中に入れて使います。
-&amp;color(#F54738){&amp;bold(){caseラベル}}
--変数の中身が表記されたリテラルと同じ場合そこから始める
--if文やif-else文のポジションで、(基本型でいう)変数==リテラルが条件
 case リテラル:
 例)
 case 0:
 case &#039;字&#039;:
 case &quot;文字列&quot;:
-&amp;color(#F54738){&amp;bold(){defaultラベル}}
--switch文内のすべてのラベルと一致しない場合ここから始める
--else文のポジション
 default:
-&amp;color(#F54738){&amp;bold(){break文}}
--ここに到達した場合、現在処理してるswitch文の中から出る
 break;
ラベルはコロン(:)、break文はセミコロン(;)なので気を付けてください。

以上を踏まえ、こちらをご覧ください。
 public class SwitchTest
 {
  public static void main(String[] args)
  {
   System.out.println(&quot;0～9の数を入力してください&quot;);
   int x = new java.util.Scanner(System.in).nextInt();//xに入力した数字を代入
 
   switch(x)
   {
    case 0://xが0の場合ここから開始
    System.out.println(&quot;xの中身は0です&quot;);
    break;//break文により、xが0の場合はここまでの文を実行してswitch文から出る
 
    case 1://xが1の場合ここから開始、途中caseラベルがあるが、あくまで開始の目印なのでswitch文を抜けたりはしない、以下同様
    case 2://xが2の場合ここから開始
    case 3://xが3の場合ここから開始
    case 4://xが4の場合ここから開始
    System.out.println(&quot;xの中身は5未満です&quot;);
    System.out.println(&quot;5以上だったら偶数かどうかも判定します&quot;);
    break;//1～4の場合ラベルからここまでの文、つまりこの2つの文が実行されてswitch文から出る
 
    case 6://xが6の場合ここから開始
    case 8://xが8の場合ここから開始
    System.out.println(&quot;xの中身は偶数です&quot;);
    //break文が無いので、6か8の場合でもここで止まらない
    case 5://xが5の場合ここから開始
    case 7://xが7の場合ここから開始
    case 9://xが9の場合ここから開始
    System.out.println(&quot;xの中身は5以上です&quot;);//6か8の場合でもこの文が読まれる(break文がないため)
    break;//5～9の場合ラベルからここまでの文、つまり1つか2つの文が実行されてswitch文から出る
 
    default://ここのcaseラベルに無い、0～9までの数字だった場合。この下にcaseラベルがあっても問題なく、defaultの条件から除外される条件を増やす
    System.out.println(&quot;範囲外です&quot;);//終端なのでわざわざbreak文を書かなくてもここから出る
   }
   System.out.println(&quot;プログラムを終了します&quot;);//switch文を出た後なので変数に関係なく表示
  }
 }
これの実行結果は以下になります。
 0～9の数を入力してください
 (数が入力できるようになる)
 
 (0を入れた場合)
 xの中身は0です
 プログラムを終了します
 
 (1、2、3、4のどれかを入れた場合)
 xの中身は5未満です
 5以上だったら偶数かどうかも判定します
 プログラムを終了します
 
 (5、7、9のどれかを入れた場合)
 xの中身は5以上です
 プログラムを終了します
 
 (6、8のどれかを入れた場合)
 xの中身は偶数です
 xの中身は5以上です
 プログラムを終了します
 
 (10や-1など範囲外の数を入れた場合)
 範囲外です
 プログラムを終了します

このように、&amp;u(){switch文はcaseラベルやdefaultラベルを開始位置として付け、停止したい所でbreak文を置くという構造になっています。}

理解を深めるために一応...というかもっと分かりやすい形で...今まで
 if(x == 0){(内容)}
 else if(x == 1){(内容)}
 else if(x == 2){(内容)}
 else{(内容)}
とやっていたものを、
 switch(x){
 case 0: (内容) break;
 case 1: (内容) break;
 case 2: (内容) break;
 default: (内容)}
とやることができます。

ちなみに開始位置であるdefaultラベルや同じ内容のcaseラベルを複数一つのswitch文に入れる事はできません。
あと、他のプログラミング言語で存在する、ここにきた時点で別のラベルに移動してそこから処理するgoto文はjavaでは存在しません。

変数によって停止位置を変えたい場合、中にif文を入れ込むという形で実現することが可能です(後述)。
あとbreak文ですが、これは繰り返しでも使います。&amp;u(){&amp;bold(){break文は現在いる階層}(if文などならその上、一番下のswitch文か繰り返し)&amp;bold(){から抜け出す}という性質をよく理解しておいてください。}
*繰り返し
**条件が満たされている間繰り返す
繰り返しのやり方の一つに、&amp;color(#F54738){&amp;bold(){while文}}があります。
 while(条件){条件がtrueの時に実行して欲しい文}
このように、形状はif文と同じですが、if文と違い&amp;u(){&amp;bold(){もう一度条件の所に戻る}という特徴があります。}

以上を踏まえ、まずは基本的な使い方を見てみましょう。
 public class While0
 {
  public static void main(String[] args)
  {
   System.out.println(&quot;0と入力してください&quot;);
   int x = new java.util.Scanner(System.in).nextInt();
 
   while(x != 0)//最初に0を入れたらfalseなのでスルー、それ以外ならtrueでif文のように中身を実行、終端でここに戻ってtrueならまた実行
   {
    //条件でtrueが出たら中身を実行
    System.out.println(&quot;0と入力するまで終わりません&quot;);
    x = new java.util.Scanner(System.in).nextInt();//入力しなおし、ここで終端なので、条件の所に戻ってx != 0を演算してループするかどうか判定
   }
 
   //while文から出た場合。while文の終端にたどり着いて、条件の部分に来てfalseだったらループを抜け出しここに来る
   System.out.println(&quot;プログラムを終了します&quot;);
  }
 }
さて、実行したら0と入力してくださいと表示され、数字の入力を求めて来ます。
-&amp;bold(){最初に0を入れる}
--プログラムを終了しますと表示して終了
---while文の条件でfalseが出たので中身をスルーしてその後を実行
-&amp;bold(){最初に1など別の数字を入れる}
--&amp;u(){0と入力するまで終わりませんと表示して入力を再度求める}※
---条件でtrueが出たので中身を実行
--&amp;bold(){次に0と入力する}
---&amp;u(){プログラムを終了しますと表示して終了}
----入力を求める命令の次が終端で条件の部分に戻り、falseが出るのでwhile文の内容はスルーして次の内容を実行
--&amp;bold(){次にまた0以外の数字を入力する}
---&amp;u(){0と入力するまで終わりませんと表示して入力を再度求める}(※に戻る)
----入力を求める命令の次が終端で条件の部分に戻り、trueが出るのでwhile文の内容を再度実行
このようなフローチャートになります。

所で、while文は終端で条件の部分に戻る、あとif文では括弧の中で演算している(while文も同じ)と書きましたが、それが分かるコードをもしよろしければ見てみてください。
&amp;u(){実際は代入演算子を条件文の中で使う事は推奨しません。}
 public class While1
 {
  public static void main(String[] args)
  {
   int x = 0;
 
   while((x += 1) &lt;= 5)//xに1追加した後5以下かどうか確認、代入演算子の方が後で判定されるので括弧を付ける
   {
    System.out.println(x);
   }
  }
 }
実行結果はこのようになります。
 1
 2
 3
 4
 5

原理的には、最初は0の数にwhile文の条件で&amp;u(){&amp;color(#3B4EF0){xに1足すという演算をして、それが5以下かどうかを演算してtrueが出るので、while文の中身であるxの内容を表示する処理をし、そしてwhile文の条件の所に戻ります。}}
したらまた条件の所に戻り、&amp;u(){&amp;color(#3B4EF0){xに1足すという演算をして、それが5以下かどうかを演算してtrueが出るので、while文の中身であるxの内容を表示する処理をし、そしてwhile文の条件の所に戻ります。}}
これを繰り返し、&amp;u(){xが条件に来た時点で5だった場合、xに1を足して6になり、}5以下という関係演算子で&amp;u(){falseになるのでwhile文の内容は行わず6とは表示されずに終了する}という感じです。

また、while文の派生で、&amp;u(){中身はかならず一回行われ、終端で条件演算がされる}&amp;color(#F54738){&amp;bold(){do-while文}}があります。

これがdo-while文の一例です。上記While1と同じ条件にしています。
 public class While2
 {
  public static void main(String[] args)
  {
   int x = 0;
 
   do//条件文に関係なくまずここの内容をやる
   {
    System.out.println(x);
   }
   while((x += 1) &lt;= 5);//do-while文の場合終端にセミコロン(;)が必要なので注意
  }
 }
実行結果は以下のようになります。
 0
 1
 2
 3
 4
 5

While1と違い0が出てきました。これは条件文を通らずにxの内容を画面に表示する命令に従ったため、1を追加されずにxの内容を表示したためです。
実行した後はxに1足して5以下か調べ、trueならdo文の最初に戻ります。最初はxは0で、1足してxの中身は1、それは5以下なのでtrueになりますね。
そしてxが5の時にwhile文に差し掛かると、xに1足されて6、5以下ではないのでfalseとなりdo文の最初には戻らずそのまま次の内容を行います。

ところで、do-while文は条件文に関係なく1回は内容を実行すると書きました。
そのため、
 while(false)
 {
  System.out.println(&quot;メッセージを表示&quot;);
 }
これは条件のfalseが引っかかり何も表示されませんが、
 do
 {
  System.out.println(&quot;メッセージを表示&quot;);
 }
 while(false);
この場合は一度｢メッセージを表示｣と表示します。
その後はwhile(false)とあるため繰り返しません。
&amp;u(){元から条件を満たしてないと実行しないwhile文に対し、do-while文は条件を満たしてなくても必ず1回は実行します。}
**一定回数分繰り返す
繰り返しをやる上で、繰り返す回数自体はすでに(変数かリテラルで)数字として出ている場合というのは多くあります。
この時に使う文として&amp;color(#F54738){&amp;bold(){for文}}があります。
実際の所、繰り返しはこのfor文を一番多く使うと思います。

このfor文には3つの要素が存在し、最初にやる事(&amp;color(#F54738){&amp;bold(){初期化処理}})、繰り返しの条件(while文の括弧の中身と同じ)(&amp;color(#F54738){&amp;bold(){繰り返し条件}})、終端に差し掛かった時にやる事(&amp;color(#F54738){&amp;bold(){繰り返し時処理}})があります。

そして一般的なfor文では、それぞれ...
-&amp;bold(){初期化処理}
--例)int i = 0
---繰り返しのために整数型の変数を定義
---このような変数を(&amp;color(#F54738){&amp;bold(){ループ変数}})と言い、多くの場合はi、for文の中身でfor文を使うなどiが使えない時はjを充てる場合が多い
-&amp;bold(){繰り返し条件}
--例、3回繰り返す場合)i &lt; 3
---i &lt; (繰り返したい回数)が一般的、これで3回繰り返される原理は後述
-&amp;bold(){繰り返し時処理}
--i++
---終点でiの中身を1増やす
このように書かれます。

原理を言う上で、このコードを見てください。
 public class For0
 {
  public static void main(String[] args)
  {
   for(int i = 0; i &lt; 3; i++)
   {
    System.out.println(i);
   }
  }
 }
このように、&amp;color(#F54738){&amp;bold(){for文の括弧の中はセミコロン(;)で区切ります}}。

ちょっと形を変えて解説していきます。
 //1週目:
 for
 (
  int i = 0;//最初にiというint型の変数を定義、0で初期化
  i &lt; 3;//次にfor文の中身を行うか確認、iは0なので実行
  i++//ここはここの時点では何も行われない
 )
 {
  System.out.println(i);//iの内容を表示、i++が行われるのはこの後なので0と表示
 }
 //2週目:
 for
 (
  int i = 0;//最初だけなので何もしない、以下同様
  i &lt; 3;//下記繰り返し時処理(i++)実行後for文の中身を行うか確認、iは1なので実行
  i++//戻ってきたので上記繰り返し条件(i &lt; 3)より先に実行、iに1足して1に
 )
 {
  System.out.println(i);//iの内容、1と表示
 }
 //3週目:
 for
 (
  int i = 0;
  i &lt; 3;//i++の後で、iは2なので実行
  i++//戻ってきたのでiに1足して2に
 )
 {
  System.out.println(i);//iの内容、2と表示
 }
 //4週目:
 for
 (
  int i = 0;
  i &lt; 3;//i++の後で、この時点でiは3なので実行しない
  i++//iに1足して3に
 )
 {
  System.out.println(i);//繰り返し条件がfalseだったので実行されない
 }
このような原理で、i &lt; 3の数字の文だけ繰り返されます。

って事で、上記For0を実行するとこのように表示されるはずです。
 0
 1
 2

さて、この0から始めるというプログラマの風習ですが、慣れておいた方が良さそうです。何しろ色々なものが0から始まるように出来ているので...
たとえば配列、これも0で始まりますね。
このように配列の要素それぞれに何かを行うコードを書く時に0から始まる事が影響します。
まあ、これは次の節で特別でスマートな書き方がありますが...
 public class For1
 {
  public static void main(String[] args)
  {
   int[] array = {0, 1, 2, 3};
   //配列の中身を表示して配列の大きさ分足す
   for(int i = 0; i &lt; array.length; i++)//lengthは1から数えるのでこの例だと4になる
   {
    System.out.println(array[i]);//一週目はi = 0なので、array[0]の中身である0を表示、二週目はarray[1]の中身である1を表示
    array[i] += array.length;//この場合だと一週目にarray[0]に4を足す
   }
   //配列の中身を表示、上記で配列の大きさ分足したので中身は{4, 5, 6, 7}になる
   for(int i = 0; i &lt; array.length; i++)//for文で定義したiは上記のfor文までしか存在できないので競合しない、詳しくは後述
   {
    System.out.println(array[i]);//一週目はi = 0なので、array[0]の中身である4を表示、二週目はarray[1]の中身である5を表示
   }
  }
 }
この実行結果はこのようになります。
 0
 1
 2
 3
 4
 5
 6
 7
最初の配列を{0, 1, 2, 3, 4}にすれば9まで表示されます。原理は自力で解き明かしていただけたら...幸いです。
**配列で使える便利なfor文
配列などのデータ構造のそれぞれの内容に同じ処理をしたい時のために、&amp;color(#F54738){&amp;bold(){拡張For文}}と呼ばれる特殊なFor文が用意されています。これはJava5から実装された要素です。

拡張For文はこのように書き表します。
 for(要素の型 変数名: 配列の変数名){内容}
 例)
 int[] array = {0, 1, 2};
 for(int value: array){}
それぞれの内容を説明すると、&amp;u(){要素の型は}配列の要素、つまり&amp;u(){中身の型を記載}します。
変数名ですが特に規定はありません。&amp;u(){この変数は、例で言えばarray[i](iは何週目か0から数えた数)として扱われます。}
配列の変数名に関して何か言うとすると、もし多次元配列であれば、例えば二次元目の配列を扱うならarray[]と入力して、要素の型も二次元ならint[]、三次元ならint[][]と入力します。

それを踏まえて、For1と同じものを拡張For文で書いたものがこちらです。
 public class For2
 {
  public static void main(String[] args)
  {
   int[] array = {0, 1, 2, 3};
   //配列の中身を表示して配列の大きさ分足す
   for(int value: array)//array[i]がvalueという変数に置き換わる
   {
    System.out.println(value);//一週目はarray[0]の中身である0を表示、二週目はarray[1]の中身である1を表示
    value += array.length;//一週目にarray[0]に4を足す、二週目はarray[1]に4を足す
   }
   //配列の中身を表示、上記で配列の大きさ分足したので中身は{4, 5, 6, 7}になる
   for(int value: array)//for文で定義したvalueは上記のfor文までしか存在できないので競合しない、詳しくは後述
   {
    System.out.println(array);//一週目はarray[0]の中身である4を表示、二週目はarray[1]の中身である5を表示
   }
  }
 }

他のデータ構造に関してですが、それらはオブジェクト指向の知識が必要なのでその際改めてお教えします。
*入れ子構造、複雑な流れのプログラム
**スコープ
&amp;color(#F54738){&amp;bold(){スコープ}}とは、変数がどこまで存在できるかの範囲を言います。
ひとまず、こちらのコードをご覧ください。
 public class Scope0
 {
  public static void main(String[] args)
  {
   if(true)
   {
    int i = 0;
   }
   else
   {
    int i = 1;
   }
   i += 1;
   System.out.println(i);
  }
 }
これをコンパイルするとこんなエラーが発生します。
 Scope0.java:13: エラー: シンボルを見つけられません
   i += 1;
   ^
   シンボル:   変数 i
   場所: クラス Scope0
 Scope0.java:14: エラー: シンボルを見つけられません
   System.out.println(i);
                      ^
   シンボル:   変数 i
   場所: クラス Scope0
 エラー2個

シンボルを見つけられない、つまり、&amp;u(){iという変数が見当たらない}というエラーが出てきました。
if文とelse文、つまり必ずどちらかが行われる文でiという変数を宣言したので必ず変数iが存在するはずです。しかしその下ではiという変数を認識出来ていないって事です。
ここで重要なのは、
**break文とcontinue文
While文やFor文、その派生

*終わりに
**インデント
//----
//これでその3は終わりです。次は、変数というものを使っていきましょう。
//----
//*コメント
//指摘や質問等あったらここへ。
//#comment_num2    </description>
    <dc:date>2021-09-20T22:49:48+09:00</dc:date>
    <utime>1632145788</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/18.html">
    <title>Java独学ノート/その2:変数・配列の使用と計算</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/18.html</link>
    <description>
      #contents
*この内容を学ぶ前に...
やっていくと、コードの中にメモ書きをしたい時っていうのが出てくると思います。
というか、長いコードについて解説する上でこちらもコードに直接メモ書きしたいのですが、普通に文字列を入力すると、コンパイラが読み間違えてコンパイルエラーを起こします。
その時に使うのが&amp;color(#F54738){&amp;bold(){コメント}}です。
以下の書き方が存在します。
 //ここから行の最後まではコンパイラが無視するのでメモ書きできる
 
 /*ここから
 コメント扱いされるので
 終端まで何を書いても大丈夫
 終端はこれ→*/
 
 /**これは
 上記のように範囲内がコメントになるが
 アスタリスクが2つだと、JDKの機能の一つ、javadocでコードの説明として表示される
 一人でプログラミングする分にはおそらく使わない...
 終端のアスタリスクは1つでOK、コメントはここまで→*/
*変数を作る
**変数の宣言をする
&amp;color(#F54738){&amp;bold(){変数}}・・・といえば算数の授業でやったと思います。現時点で分からない数や、状況によって変わる数をxに置き換えて式を作り、両端を足したり掛けたりしてその数自体、もしくは他の変数との関わり(V=IRとか)を解き明かすのに使いますね。
プログラミングでの変数は、変数の中に数字だけでなく文字などの情報が入ります。
変数自体に種類があり、それらはよく形状の違う箱に例えられます。
では、実際に変数を使ってみましょう、次のコードを見てください。
 public class Math0
 {
  public static void main(String[] args)
  {
   int a;
   System.out.println(a);
  }
 }
5行目のint a;で、aという名前のint型の変数が作られました。
&amp;bold(){int型}というのは、整数を入れることのできる変数の事で、少数や文字列は入れられません。&amp;color(#F54738){&amp;bold(){型}}というのはいわゆる箱の形状で、どんなものが入れられるかを表していますが、他の型は後ほど紹介します。
今回aという変数名を使ってますが、これは&amp;u(){基本的に半角の英字か英字+数字がルールですが、英字と数字だけを使った名前であればどんな変数名でも大丈夫です。}全角文字も使って大丈夫ですが推奨しません。あと、変数名に半角スペース、括弧や数字だけの名前は使えません。
また、&amp;bold(){&amp;color(#F54738){予約語}}といって今のところ出てきたpublic、classなどその単語自体が特別な効果を持つ単語はそのまま変数名には使えません。[[メモ書き&gt;Java独学ノート/メモ書き]]に予約語を書いておきます。
次に6行目、System.out.printlnの括弧の中が二重引用符&quot;で囲まれていません。この二重引用符、その値がどんな特徴を持つか(aaなら変数、&quot;aa&quot;なら文字列など)を表す記号です。
これも後ほど紹介しますが、今のところは二重引用符で囲まれてない数字は数値、文字列は変数として扱われると思ってください。
System.out.printlnは括弧の中の数値や文字列などを画面に表示しますが、変数を入れると、変数の中に入っている数値や文字列を表示します。
しかしこのコード、コンパイルしようとすると(するときはclassの後の言葉、ここではMath0と書いてください((この理由はその4で説明します)))エラーになります。
｢変数aは初期化されいない可能性があります｣というエラーが出てくると思います。なぜなら、まだ&amp;u(){変数aの中には何も入ってないから}です。
**変数の初期化・上書き
では、この変数の中に数値を入れましょう。次のコードを見てください。
 public class Math1
 {
  public static void main(String[] args)
  {
   int a;
   a = 10;
   System.out.println(a);
  }
 }
5行目、a = 10;という部分でint型の変数aに10という整数が入りました。次の行で、aの中に入っているものを画面に表示します。
これをコンパイルした後起動すると、10という数字が出て終わるはずです。
aは変数ですよね。=は&amp;color(#F54738){&amp;bold(){演算子}}というものの一種で、右にある数値や文字などを左の変数に入れるという役割をしています。
この文だと、10という数値を変数aに入れるという意味になるので、他の数値を入れて試してみてください。それをコンパイルして起動すると、その数が出てくるはずです((大きすぎるとコンパイルエラーになるので注意してください))。
変数に情報を入れることを代入と言いますが、特に何も入っていない変数に値を入れることを特に&amp;color(#F54738){&amp;bold(){初期化}}と言います。

変数は必ず初期化してから使うのですが、変数の作成と初期化を1行で行う事ができます。
=は左にある変数に右の変数を入れる性質を持ちますが、変数を作る宣言をする文に=でつなげて値(計算式もok)を書くことで変数の作成と初期化を同時にする事ができます。
以下はMath1と同じ処理がされるコードです。
 public crass Math2
 {
  public static void main(String[] args)
  {
   int a = 10;
   System.out.println(a);
  }
 }
ところで、次の場合はどうなるでしょう。
 public class Math3
 {
  public static void main(String[] args)
  {
   int a;
   a = 5;
   System.out.println(a);
   a = 10;
   System.out.println(a);
  }
 }
これの実行結果はこうなります。
 5
 10
とりあえずこれを先にお教えしましょう、&amp;color(#F54738){&amp;bold(){Javaは上から下へ書いてある事を順に実行していきます}}。
なので、これを上から翻訳していくと、
+変数aという箱を作る
+変数aに数値5を入れる
+変数aの中の数値を画面に出力する
+変数aに数値10を入れる
+変数aの中の数値を画面に出力する
となります。しかしこの翻訳だと疑問がわきます。なぜ5が入ってる箱に10を入れたら15ではなく10になるのか。
これは、=が&amp;color(#F54738){&amp;bold(){代入演算子}}であるからです。代入って覚えてますか?変数を(実際の数値が分かったため)実際の数値に置き換える事です。
リストの2でaを5と置き換えられるようにしたのを、4でaを10と置き換えられるようにする、箱の中を=の右の値と同じにする、等式を作るといえばどれかでピンと来るかと思います。
なので、今まで｢入れる｣と言っていましたが、それは一度も値を変化させないときはそう考えれば大丈夫という話で、=は左の変数に右の数値(もしくは変数の中身の値)を代入、つまり上書きを行う事を意味します。
**型とリテラル
型は以下に示す物が主に使われます。
|型|入れられる情報|リテラル|
|byte|1バイトの整数|整数|
|short|2バイトの整数|~|
|int|4バイトの整数|~|
|long|8バイトの整数|整数+L(l)|
|float|浮動小数点(点以下7桁)|小数+F(f)|
|double|倍精度の浮動小数点(点以下16桁)|小数|
|boolean|真偽値|true&amp;br()false|
|char|文字|引用符&#039;(shift+7)で囲む|
|String|文字列|二重引用符&quot;(shift+2)で囲む|
1バイトは2進数の一ケタ(0~1)を表す事のできるビットが8つあり、2の8乗である256の数字、0から始めれば0~255を表現可能なのですが、
どの数も1ビットを使って負の数を表現できるようにしてます。その分最大桁数、2進数の1桁が使えなくなり半分(2分の1)になります。
256の半分は128、byteの使用可能な数値の限界は127~-128になります。127~0で128、-1~-128で128で合計256の数字を使えます。
この負の数の方が1多いというのは整数型4種に当てはまります。

&amp;color(#F54738){&amp;bold(){リテラル}}は、数字や文字列などの値の事を表します。表記の仕方によって、それがどんな値かが変わります(trueなら真偽値、&quot;true&quot;は文字列など)。
変数には、同じ型のリテラルしか入れられません。しかし数の場合は例外があり、byte&lt;short&lt;int&lt;long&lt;float&lt;doubleと数が大きくなるこの種の型に、それ以下の大きさの型のリテラルを入れる(longにL(l)の付いてない整数など)事が可能です。
ただし、その際に変数の型と同じ型のリテラルになります。変数の値をそのまま他の変数に代入する時にそのままではできなくなる(int型をdouble型変数に入れてそれをint型変数に代入など)といった事が起こります。
これはキャストという方法でどうにかなりますが、それは代入演算子の所でやります。
ちなみに、float型やdouble型は小数点以上の数もlongと同程度のケタを扱えます。なのでlong型のリテラルをfloatやdoubleに入れることが可能です。もちろんlong型+小数点以下のケタを扱うので、long型よりメモリを多く食います。
実際、大規模なプログラムでもbyteやshort、floatを使わないとメモリを多く食うといった事はまずありません。
特にint型はコンピュータによってはbyteやshortより処理が早かったりするので、基本整数はint、少数はdoubleを使えば問題ありません。

数値のリテラルは、半角のアンダースコアで区切る事でケタ数を分かりやすくする事ができます。
例)123_456_789、1234_5678など
このアンダースコアの間隔にルールはありません。ただし、リテラルの性質を表す文字と数字を切り離したり(1._234_fなど)、アンダースコアを複数並べる事(1___2など)はできません。
また、先頭に0xをつけると16進数、0をつけると8進数、0bをつけると2進数として扱われます。
例)0xFF→(10進数の)255、010→8、0b100→8など

よく精度が低いといわれるJavaの小数ですが、これは通常の場合ケタを超える数は切り上げか切り捨てになり、それが積み重なると誤差が大きくなるだけで、循環しない小数になる割り算なら精度は気になりません。
しかし、一番大きい位が小数点から4つほど離れると特有の表示方法になる他、0でない桁数の範囲が大きくなると一番大きい位から16ケタより下の位は精度が鈍ります。
この小数型の性質は[[メモ書き&gt;Java独学ノート/メモ書き]]に検証したものを書いておきます。
余談になりますが、循環しない小数にするには、両端を約分した後、分母が、素数が2と5だけで構成される数になれば割り切れます。

boolean型ですが、その状態と、その反対の状態がある(ステージの中間地点を通過したかしてないかなど)時に使えますが、これは3つ以上の状態がある(キャラクターの属性など)時は整数型の方が良かったり、情報としては割りと使いにくかったりします。
しかし、この真偽値、条件によって分岐や繰り返しを行う文法をやる上で重要な型だったりします。

char型ですが、これは文字を整数の数値として扱っているので、足し算や引き算をしたりすると違う文字になったりします([[メモ書き&gt;Java独学ノート/メモ書き]]で詳しく解説します)。
リテラルを表す記号として引用符&#039;を使うので、char型の変数に引用符を入れたい場合はエスケープ文字を使う必要があります、二重引用符&quot;はそのままでもエスケープ文字でもエラーを起こしません。
正直使う事はほとんど無いのですが、これを使うAPI(詳しくはその7で)があったりします。

&amp;color(#F54738){&amp;bold(){エスケープ文字}}は、\((・・・済みません、全部バックスラッシュになってますね。これキーボードの一番右上か右下を押すと出る半角円記号\です。))の後に特定の文字を入れる事で、特殊な文字やそのままだとリテラルの終点扱いになってしまう文字を入力するのに使います。
これは覚えとくと良いのは4種類あり、&amp;bold(){\&quot;}(文中の&quot;として扱われる)、&amp;bold(){\&#039;}(文中の&#039;として扱われる)、&amp;bold(){\\}(文中の\として扱われる)、&amp;bold(){\n}(改行する((環境によって例外あり)))があります。他にもあるので[[メモ書き&gt;Java独学ノート/メモ書き]]に書いておきます。

String型はint型並みに多く使われる変数です。この型だけ最初が大文字な理由なのですが、これにはオブジェクト指向の知識が必要になるのでその時お教えします。
このString型、理由があって他の型と性質の違いがあったりします。主に代入した時に影響が出たりします。
char型に対し、こちらは二重引用符&quot;を文中に使う際にエスケープ文字が必要で、引用符&#039;を使う時はエスケープ文字であっても無くても大丈夫です。
**複数の変数を定義
これは知らなくても問題は無いのですが、使う人もいるので合わせて覚えておきましょう。
 public class Math4
 {
  public static void main(String[] args)
  {
   int a, b;
   a = 1;
   b = 10;
   System.out.println(a);
   System.out.println(b);
  }
 }
5行目、aとbという2つの変数を定義しています。それ以降は数を代入して表示という今までと同じ事をしていますね。もちろん実行結果はこうなります。
 1
 10

また、宣言と同時に初期化も可能です。以下は上記のコードと同じ実行結果になります。
aの後の&quot; = 1&quot;を消すと初期化されないのでコンパイルエラーになります。最後の&quot; = 10&quot;でまとめて初期化される訳ではありません。
 public class Math5
 {
  public static void main(String[] args)
  {
   int a = 1, b = 10;
   System.out.println(a);
   System.out.println(b);
  }
 }

この変数宣言と代入、つまり変数宣言する上で,で区切られた部分は、その中が解決してから次の区切りの部分を行います。
つまり、こんな芸当もできます。使う事は多分無いと思いますが...
これも上記と同じ実行結果になります。
 public class Math6
 {
  public static void main(String[] args)
  {
   int a = 2 - 1, b = a + 9;//+は左右の数を足す、詳しくは後術
   System.out.println(a);
   System.out.println(b);
  }
 }

以下はコンパイルエラーになる一例です。
 public class Math7
 {
  public static void main(String[] args)
  {
   int a = b, b = 10;//左から処理しているので、bがまだ宣言されてないのにbを使おうとしている
 
   int c, d = 10//全部10にしてくれるわけでは無いので次の文でコンパイルエラー
   System.out.println(c);
 
   int e = 2;
   int f = 1, e = f;//すでに宣言された変数eをまた宣言しようとしている
  }
 }
*演算子
**計算を行う演算子
単に箱に情報を入れて表示するだけでは意味が無いですね。ってことなので算術演算子と呼ばれる演算子の一種を使ってみましょう。
先に言っておきますと、変数やリテラル、要するに演算子以外の計算に関わっているものを&amp;color(#F54738){&amp;bold(){オペランド}}と言います。
もっとも単純なものを以下に表記しておきます。
|表記|効果|
|+|(この演算子の)左にあるオペランドに、右のオペランドを足す|
|-|左にあるオペランドから、右のオペランドを引く|
|*|左にあるオペランドを、右のオペランドで掛ける|
|/|左にあるオペランドを、右のオペランドで割る|
|%|左にあるオペランドを、右のオペランドで割った余り(整数同士の計算専用)|
また、+は文字列(String型)同士で計算する事が可能で、そうすると、左にあるオペランドの最後に、右のオペランドを繋げた文字列にします。
これをどう使うかをふまえ、以下のコードを見てみましょう。
 public class Math8{
  public static void main(String[] args)
  {
   int a = 10 + 3;
   int b = 10 - 3;
   int c = 10 * 3;
   int d = 10 / 3;
   int e = 10 / 3;
   String f = &quot;文字列を&quot; + &quot;つなげる&quot;;
   System.out.println(a);
   System.out.println(b);
   System.out.println(c);
   System.out.println(d);
   System.out.println(e);
   System.out.println(f);
  }
 }
このコードの実行結果は以下のようになります。
 13
 7
 30
 3
 1
 文字列をつなげる
10 / 3は3になりました。このように、整数型の割り算は、小数点以下は切り捨てるようになっています。
計算に変数を使う事もできますが、これは評価のところでやります。複雑な計算をする時のやり方(1+2*3など)もそちらでやります。
**計算の順番(評価)
演算子を多く使った計算や計算に変数を使うとどうなるのか、たとえば、以下の計算結果はどうなるでしょうか。
 a = 1 - 2 + 6 / 2
このような計算を、コンピュータは一つ一つの演算子を1つずつ行い、演算子と両端のオペランドを計算結果のリテラルに変化させ、その上でオペランド2つと演算子のトリオを見つけて計算します。このトリオを1つのリテラルにすることを&amp;color(#F54738){&amp;bold(){評価}}と言います。
演算子には1~15の評価の優先度が決まっており、少ないほどその演算子による演算は優先されます。今の所は、掛け算割り算と余り算、足し算引き算、代入の順で優先度が高いと覚えておきましょう。
で、まずこの式のどこを評価するかというと、この中でもっとも優先度の高い演算子である/と、その両端の6と2を評価します。
この演算子は左のオペランドを右のオペランドで割るので、計算結果は3です。6 / 2が3になり、以下の式と同等になります。
 a = 1 - 2 + 3
この6 / 2が3になるような事を評価というわけです。次は、次に優先度の高い演算子である-と+が評価されるわけですが、これはどう評価されるでしょうか。
これには法則があって、&amp;u(){同じ優先度の演算子は同じ方向に評価され、同じ優先度の演算子が並んだ場合、その方向の順番で評価されていきます。}
&amp;u(){足し算などの優先度と掛け算などの優先度の演算子は左から右に評価されます。}なので、以下のように評価されていきます(括弧は評価される部分)
 a = (1 - 2) + 3 ⇒ a = -1 + 3
 a = (-1 + 3) ⇒ a = 2
そして最後に代入演算子によりaに2が代入されます。

式の中に変数を使う事もできますが、この場合、&amp;u(){評価していく上で都合の良いリテラルに変化させる}という仕組みが作動します。これをふまえて以下の式を見てみましょう。
 a(int型の変数で10が入っている) = a + 10
まず最も優先度の高い+とその両端のオペランドを評価する訳ですが、算術演算子によって評価する際には、両端がリテラルである必要があります。
なので、&amp;u(){算術演算子を評価する際に変数を巻き込む場合、変数がその中身の値と同じリテラルに変化します。}
その結果右のaが10に変化して、式は以下と同等になります。
 a = 10 + 10
そして10 + 10が評価されて式は以下と同等になります。
 a = 20
そしてaに20が代入されます。

代入演算子は左に変数、右にリテラルがあると、左の変数に右のリテラルを代入するという演算子ですが、&amp;u(){この演算子は右から左に評価されます。}なので、
 a = b = 1
これだとまず最初にb = 1が評価されてbに1が代入されます。
次にa = bを評価するわけなのですが、右はリテラルでないといけないので、bが中身の1というリテラルに変化します。なので、
 a = 1
このような式と同等になるわけです。

都合の良いオペランドに変化させるという仕組みは異種の型のリテラルが演算子の両端に来たときにも発生する事なのですが、これはString&gt;double&gt;float&gt;long&gt;小さい整数という優先順位で変化していきます。次の式を見ていきましょう。
 100 + 900l + 1000 + 200.0f + 800.0 + &quot;点&quot; + 30 + 70
まず、+は左から右に評価されるので100 + 900lが評価されます。
左はint、右はlong型のリテラルなので都合が悪いですね。この時、int型のリテラル100は、long型よりも小さい整数なのでlong型に変化します。つまり100lになるわけですね。
結果この時点でできるリテラルは1000l、long型の1000です。つまり、現時点ではこうなります。
 1000l + 1000 + 200.0f + 800.0 + &quot;点&quot; + 30 + 70
次は1000l + 1000ですが、左から右へと評価してint型の2000となると思う人もいるかもしれません。この評価の結果は2000l、long型ですね。&amp;u(){左右は関係なく、どちらが優先順位が高いかによって型は決まります。}よってこれで式はこの状態になります。
 2000l + 200.0f + 800.0 + &quot;点&quot; + 30 + 70
後は2000l(long) + 200.0f(float)が2200.0f(float)、2200.0f(float) + 800.0(double)が3000.0(double)になるのは分かると思います。
これまでの結果、式はこうなります。
 3000.0 + &quot;点&quot; + 30 + 70
次は3000.0 + &quot;点&quot;ですが、優先順位の高いのは文字列のほうです。文字列の足し算は左に右をつなげるんでしたよね。なので式はこうなります。
 &quot;3000.0点&quot; + 30 + 70
その後の30と70ですが、これは順を追って評価すると以下のようになるはずです。
 &quot;3000.0点30&quot; + 70
 &quot;3000.0点3070&quot;
100 + 900l + 1000 + 200.0f + 800.0 + &quot;点&quot; + 30 + 70が&quot;3000.0点3070&quot;になりました。皆さん理解できたでしょうか。

上記の性質を理解したうえでこの式を見てください。
 3 / 2 + 3.5
 3 / 2.0 + 3.5
上は整数同士の割り算で、3 / 2が余り算の答えである1になり、結果4.5になります。
下は小数の計算になるため3 / 2.0が1.5になり、結果5.0になります。

二つ上の式で、評価の結果を&quot;3000.0点100&quot;にしたい、つまり30 + 70を計算させたいときはどうしたら良いでしょうか。
ここで使うのが&amp;bold(){括弧()}です。&amp;u(){括弧内の最も優先度の高い演算子を優先して評価し、括弧の中で1つのリテラルができるまで評価します。}
なので、以下のようにすれば&quot;3000.0点100&quot;という結果になります。
 100 + 900l + 1000 + 200.0f + 800.0 + &quot;点&quot; + (30 + 70)

&amp;u(){括弧には親子関係があり、中の括弧ほど優先されます。}優先度の高い演算子が優先されるということも含めて、この式を見てください。
 3 - ((1 + 2 * 3) * (4 / 5.0 * 6))
まず、二重に囲われている、左側を評価してみましょう。2 * 3が先に評価されて6、1 + 6で7なので式は以下のようになります。
 3 - (7 * (4 / 5.0 * 6))
次に右側を評価してみましょう。4 / 5.0が2.5(ついでに型の代わり方も見てみまましょうか)、2.5 * 6が15.0なので式は以下のようになります。
 3 - (7 * 15.0)
その後はカッコ内が優先され以下のようになります。
 3 - 105.0
 -102.0
**代入を行う演算子
代入を行う演算子、これは基本=ですが、=の前に基本演算子を付ける事で、a = a + 1のような式をa += 1という形で表現できます。
以下に演算子のリストを表記します。
|表記|効果|
|=|右のリテラルを左の変数に代入する&amp;br()(左の変数の中身を右のリテラルにする)|
|+=|右のリテラルと左の変数を足してその値を左の変数に代入する&amp;br()String型の場合、左の変数の最後尾に右のリテラルの内容をつなげて左の変数に代入する|
|-=|右のリテラルと左の変数を引いてその値を左の変数に代入する|
|*=|右のリテラルと左の変数を掛けてその値を左の変数に代入する|
|/=|右のリテラルと左の変数を割ってその値を左の変数に代入する|
|%=|右の整数のリテラルと左の整数の変数を割ってその余りを左の変数に代入する|

この代入演算子、&amp;u(){左の変数が右のリテラルよりも大きい型でないといけません。}たとえばint型の変数にlong型やdouble型のリテラルを代入させようとすると、たとえint型の範囲の整数でも精度が落ちる可能性を指摘してコンパイルさせてもらえません。
その時使うのが&amp;color(#F54738){&amp;bold(){キャスト演算子}}です。
これは&amp;u(){括弧()の中に型名を入れると機能します。}
 例) a = (int) 1.5
この機能、リテラルがString型だと基本型とは違う性質の関係でキャストできません。また、&amp;u(){小数から整数にキャストする場合、小数点以下は切り捨てられます。}この場合、aには1が代入されます。
ちなみに&amp;u(){キャスト演算子は*や/よりも優先度が高いです。}なので、以下の式ではコンパイルエラーになります。
 a(int型) = (int) 100 * 1.05
この時、キャスト演算子は100をキャストしてint型にします。なので結局aには100 * 1.05でできるdouble型のリテラルが入れられようとされます。
なので、括弧()を使ってキャスト演算子の後に続く式の優先度を上げましょう。
 a = (int) (100 * 1.05)
これで100 * 1.05が優先されて評価され、その値をint型にキャスト、aにその値が入るようになります。

キャスト、というよりはString型の注意点として、基本データ型は、キャストで他の型からString型、逆にString型から他の型に変化させる事ができません。これはオブジェクト指向の考え方が必要になるのでその時お伝えしますが、こう変化させる方法は存在します。

また、単純に数値型の変数に1追加したいときは&amp;color(#F54738){&amp;bold(){インクリメント演算子}}を使うと良いです。逆に1減らす&amp;color(#F54738){&amp;bold(){デクリメント演算子}}も存在します。
a++とするとa = a + 1やa += 1と同じ意味に、a--とするとa = a - 1やa -= 1と同じ意味になります。
式の途中に使うと変な動きをするので、[[メモ書き&gt;Java独学ノート/メモ書き]]に性質を詳しく書いておきますが、基本は単体で使用することが推奨されています。
 public class Math9
 {
  public static void main(String[] args)
  {
   int a = 1;
   a++;
   System.out.println(a);
   a--;
   System.out.println(a);
  }
 }
このコードの実行結果はこうなるはずです。
 2
 1
**trueかfalseに変化する演算子
この&amp;color(#F54738){&amp;bold(){関係演算子}}、基本は条件分岐や繰り返しの条件を表すのに使います。
これ自体の効果は、左右にあるオペランドの関係によってtrueかfalseに変化します。
優先度は*や+といった算術演算子より低く、=といった代入演算子より高いです。
以下に演算子のリストを表記します。
|表記|効果|
|==|(右と左のリテラルが)&amp;br()等しいときtrue、違うときはfalseに変化する|
|!=|違うときtrue、等しいときはfalseに変化する|
| &gt;|(右より、左のリテラルが)&amp;br()大きいときはtrue、等しいか小さいときはfalseに変化する|
|&lt;|小さいときはtrue、等しいか大きいときはfalseに変化する|
|&gt;=|大きいか等しいときはtrue、小さいときはfalseに変化する|
|&lt;=|小さいか等しいときはtrue、大きいときはfalseに変化する|
関係演算子は=が二つである事は覚えておきましょう。
また、+=などと同じように、&amp;u(){=の前に記号を入れると特殊な性質を持ち}、後に入れるとコンパイルエラーになる事はよく覚えておきましょう。順番は覚え間違いやすいです。

この使い方や評価のされ方を見てみましょう。
たとえば以下の式の場合はどうでしょうか。
 a(boolean型) = 1 + 2 == b
この場合、まず代入演算子や関係演算子より優先度の高い算術演算子が評価され、1 + 2が3になり、式は以下と同等になります。
 a = 3 == b
このbに入っている値が3と同等であればtrue、そうでなければfalseです。言うまでも無く、bがString型など3とは違う型の変数やリテラルであればfalseです。これがtrueになった場合は式はこうなります。
 a = true
そしてaにtrueかfalseが入ります。

両方が違う数値型である場合、算術演算子と同様に小さいほうの方を大きいほうの型に変化させて比較します。
 例)3.2 == 3は3.2 == 3.0として見られる
char型は数値で文字を表すので数値型と==などの関係演算子で比較する事ができます。使う事は無いと思いますが。
boolean型は言うまでも無くboolean型以外とは比較できません。
String型は基本データ型とは違う性質を持つ関係で==などの関係演算子では比較できません。しかし、オブジェクト指向の関係で、以下の文を書くことで、中に値を持つ変数が式の途中で中の値に変化するように、この文自体がtrueかfalseに変化します。
 a.equals(b)
 ※a:比較されるString型のリテラル、変数 b:比較するString型のリテラル、変数
String型以外と比べようとすると、どう合っていても結果がfalseになります。
String型以外と比べる場合は、比べるものに+ &quot;&quot;を最後につけて、何も無い文字列と足し合わせるという形でString型にしましょう。
 例) c(int型) + &quot;&quot;は可、(String)cはコンパイルエラーになるので不可
 例) a(String型)とb(int型)を比べる場合、a.equals(b + &quot;&quot;)

&amp;u(){関係演算子は算術演算子同様、左から右に評価されます。}そのため、
 1 == 1 == true
これはint型とint型が比較されてboolean型になった後、そのboolean型とboolean型が比較されるので大丈夫ですが、
 true == 1 == 1
これは最初にboolean型とint型が比較されるのでコンパイルエラーになります。

&amp;color(#F54738){&amp;bold(){論理演算子}}は、NOT、AND、OR回路のようにboolean型の変数(やリテラル)を比較したり、変化させる演算子です。
NOTとして!、ANDとして&amp;&amp;、ORとして||(Shift+キーボード一番右上2回)があります。
!はその右にあるboolean型の変数、リテラルを反転させます(!true⇒false、!false⇒true)。
この&amp;u(){!、==など関係演算子よりも優先度が高い}ので、
 !a.equals(c) !b(boolean型変数) !b == true
これらなどは大丈夫で
 !a(int型変数) == 1
これらなどはコンパイルエラーになります。なので、ここは式の優先度を上げる括弧を使って
 !(a == 1)
とすれば正常に機能します。
&amp;&amp;は、両端にあるboolean型の変数やリテラルの両方がtrueならtrue、片方でもfalseならfalseと評価します。
||は、両端にあるboolean型の変数やリテラルの片方でもtrueならtrue、両方がfalseならfalseと評価します。
この2つは、関係演算子よりも優先度が低く、代入演算子よりも高いです。
 例) a(boolean型変数) = true &amp;&amp; 1 + 1 == 2
 a = true &amp;&amp; (1 + 1) == 2 ⇒a = true &amp;&amp; 2 == 2
 a = true &amp;&amp; (2 == 2) ⇒a = true &amp;&amp; true
 a = (true &amp;&amp; true)
 a = true
また、&amp;u(){算術演算子同様左から右に評価されます。}
 例) true || true &amp;&amp; false
 (true || true) &amp;&amp; false ⇒ true &amp;&amp; false
 (true &amp;&amp; false) ⇒ false
ちなみに、この場合右から左だとtrueになります。

実際、式の中でこの関係演算子を使う事はあまりありません。その3で使うので、そのときに見直す程度で良いです。
*配列
**配列の目的
&amp;color(#F54738){&amp;bold(){配列}}は、同じ型のデータを、&amp;color(#F54738){&amp;bold(){添え字}}と呼ばれるIDのような番号で管理できる&amp;u(){変数の集合体}のようなものです。一つ一つの変数の事を&amp;color(#F54738){&amp;bold(){要素}}と言います。
このような変数の集合体を&amp;color(#F54738){&amp;bold(){データ構造}}と呼び、Javaには他の種類のデータ構造も存在します。
この配列の利点として、
-1つずつ変数の名称を指定して必要な分変数を作る今までに対し、｢○個の要素を持つ配列を作る｣と宣言するだけで必要な数の変数が出来上がる
-添え字を変数で指定できるので、いわゆるIDのような感じで情報を呼び出せる
--これを使えば違う型の配列でも、ID0の名称(文字列)と得点(数値)、ID1の名称と得点と言うように、どの人や物体の情報かを数字で指定することで情報を管理しやすくできる
-その3で学習する繰り返しを使う事で、配列のそれぞれの要素に同じ操作を同時に行う事ができる
--条件分岐を使えば30以下の数値の入った要素には5を追加するなど特定の要素のみ操作する事も可能
このように、&amp;u(){共通点を持った複数の変数を1つの配列として扱う事で特に管理がしやすいという利点を得る事が可能です。}
**配列の使い方・生成
では実際に配列を使っていきましょう。しかし、いままでの変数とは扱い方が少し違います。
いままでは変数という箱を作るという宣言をし、その箱に値を代入して使っていきました。
しかし配列は、以下の順序で作ります。
+配列の入る変数(=配列自体が1つ入る箱)を作る
+要素の集まりである配列自体を作成し、上記の配列の入る変数に入れる(箱に配列が入る、ボックスinボックス的な感じ)
+変数に対して配列の要素に値を入れる宣言をする
このように配列は専用の変数の中に配列があって、その配列の要素の中に値を入れるという、変数より一重かぶさった形をしています。

実際に作って使ってみましょう。
配列を入れる変数は以下のように定義します。
 型[] 変数名;
 例)int[] array;
これはこちらの書き方でもできますが、&amp;u(){公式的には上記の書き方を通常としているようです。}
 型 変数名[];
 例)int array[];
例の場合、これでint型の変数の情報群である配列を入れられる変数が定義されました。
次、配列自体を作成し、変数の中に入れる方法ですが、都合上これは同時に行う必要があります。
 変数名 = new 型[要素の数];
 例)array = new int[10];
配列を入れる変数を定義する際、下の方の書き方をした場合、変数名[]とは書かず変数名だけを書いてください。
 例)int array[];
 array = new int[10];
newというのは+や=と同じ演算子の一種で、これはメモリの中にデータ構造を作る事を意味しています。これはオブジェクト指向をやる上でも使うので、次項で認識を深めておきましょう。
例の場合、これにより、変数にはint型の10個のデータを入れられる配列が入りました。
変数の宣言と配列自体の作成、代入は通常の変数同様、一まとめにできます。
 型[] 変数名 = new 型[要素の数];
 例)int[] array = new int[10];
 型 変数名[] = new 型[要素の数];
 例)int array[] = new int[10];
最後、要素に値を入れる方法ですが、この時注意してもらいたいのは、&amp;u(){&amp;bold(){配列の要素の添え字は0から始まる事です。}}10個の要素を持つ配列を作ると0~9の添え字を持つ要素が作られ、添え字10の要素を使おうとすると、実際にjavaで起動した際にエラーになります(これは例外というエラーです、その7で教えます)。
以下がやり方と例です。
 変数名[要素の添え字] = 入れる値;
 例)array[0] = 2;
=は代入演算子なので、変数と同様右側で計算などをしても問題なく代入できます。
 例)a = 1 + 1;(aに2が入る)
 a[0] = 1 + 1;(aの中の配列の1つ目の要素に2が入る)

使用する際ですが、上記の式の左辺を見てください。通常の変数名が書かれた部分と配列の入った変数名[要素の添え字]が同じように機能しています。
配列の中の値を使用する際は、変数がその中身自体のリテラルに変化するように、&amp;u(){変数名[添え字]と書くと、配列の中の、その添え字の要素の中身のリテラルに変化します。}
 a=2、bの要素0=1、要素1=3の場合
 例)a = a + 1;⇒a=3
 b[0] = b[1] + 1;⇒b[0]=4
 例)System.out.println(a);⇒2と表示される
 System.out.println(b[1]);⇒3と表示される

とりあえずこの時点での配列の使い方をしたソースコードを見てみましょうか。
 public class ArrayTest0
 {
  public static void main(String[] args){
   int[] array = new int[3];
   array[0] = 3;
   array[1] = array[0] + 2
   array[2] = array[1] + 1
   System.out.println(array[0]);
   System.out.println(array[1]);
   System.out.println(array[2]);
  }
 }
このコードの実行結果は以下になります。
 3
 5
 6

最初に記載した配列の利点のように、&amp;u(){&amp;bold(){添え字には整数型の変数が使えます。}}上記と同じ動きをするコードを記載しておきますが、これはその3の条件分岐や繰り返しがあってこそ効果があるものだったりするので、そちらでもっと詳しくやります。
 public class ArrayTest1
 {
  public static void main(String[] args){
   int[] array = new int[3];
   int i = 0;
   array[i] = 3;
   i++;
   array[i] = array[i-1] + 2;
   i++;
   array[i] = array[i-1] + 1;
   i = 0;
   System.out.println(array[i]);
   i++;
   System.out.println(array[i]);
   i++;
   System.out.println(array[i]);
  }
 }

配列は初期化しなくてもあらかじめデフォルトの情報が入っています。
数値は0、文字は半角スペース(数値的には0)、真偽値はfalse、文字列はnullと入っています。

最初から入れる値が分かっている時、初期化の方法を知っておくと便利です。上記ソースコードを見ると分かるように、これを使わないと1文ずつ値を代入する文を書く必要が出てしまいます。
 public class ArrayTest2
 {
  public static void main(String[] args)
  {
   int[] array = {1, 2, 3, 4, 5};
   System.out.println(array[0]);
   System.out.println(array[1]);
   System.out.println(array[2]);
   System.out.println(array[3]);
   System.out.println(array[4]);
  }
 }
実行結果は以下になります。
 1
 2
 3
 4
 5

この、数学用語でいう&amp;u(){中括弧で配列の中身を指定する方法は、初期化の時しか使えません。}以下のコードはコンパイルエラーになります。
 public class ArrayTest3
 {
  public static void main(String[] args)
  {
   int[] array = {1, 2, 3};
   System.out.println(array[0] + &quot; &quot; + array[1] + &quot; &quot; + array [2]);//ここまでで止めれば1 2 3と画面に表示される
   array = {4, 5, 6};//この方法で中身をまとめて変える事は不可能(コンパイルエラーになる)
   System.out.println(array[0] + &quot; &quot; + array[1] + &quot; &quot; + array [2]);
  }
 }
**多次元配列
&amp;color(#F54738){&amp;bold(){多次元配列}}は、要素を表す添え字が複数存在する配列です。
&amp;u(){2つ添え字が存在するものは二次元配列とも呼ばれます。次元の数字は添え字の数です。}
これはコードを見た方が早いかもしれません。
 public class ArrayTest4
 {
  public static void main(String[] args)
  {
   //1つ目の添え字はキャラのID、2つ目の添え字は0から体力、攻撃力、防御力
   int[][] characterData = new int[4][3];
   characterData[0][0] = 100;//一人目の体力
   characterData[0][1] = 20;//一人目の攻撃力
   characterData[0][2] = 10;//一人目の防御力
 
   //int[4][3]はint[3]の配列が4つ並ぶ配列とも見れる
   int[] character2Data = new int[3];//二人目のステータスを一次元配列として作る
   character2Data[0] = 90;
   character2Data[1] = 25;
   character2Data[2] = 10;
   characterData[1] = character2Data;//二人目のステータスを二次元配列に入れる
 
   int[] character3Data = {120, 15, 5};//三人目のステータスを一次元配列として作る
   characterData[2] = character3Data;//三人目のステータスを二次元配列に入れる
 
   int[] character4Data = {80, 15, 15};//四人目のステータスを一次元配列として作る
   characterData[3] = character4Data;//四人目のステータスを二次元配列に入れる
 
   //これはできない模様
   //characterData[3] = {80, 15, 15};//四人目のステータスを直接配列を作って入れる
 
   int i = 0;
   //一人目
   System.out.println(&quot;キャラクター&quot; + (i + 1) + &quot; 体力:&quot; + characterData[i][0] + &quot; 攻撃力:&quot; + characterData[i][1] + &quot; 防御力:&quot; + characterData[i][2]);
   i++;//二人目
   System.out.println(&quot;キャラクター&quot; + (i + 1) + &quot; 体力:&quot; + characterData[i][0] + &quot; 攻撃力:&quot; + characterData[i][1] + &quot; 防御力:&quot; + characterData[i][2]);
   i++;//三人目
   System.out.println(&quot;キャラクター&quot; + (i + 1) + &quot; 体力:&quot; + characterData[i][0] + &quot; 攻撃力:&quot; + characterData[i][1] + &quot; 防御力:&quot; + characterData[i][2]);
   i++;//四人目
   System.out.println(&quot;キャラクター&quot; + (i + 1) + &quot; 体力:&quot; + characterData[i][0] + &quot; 攻撃力:&quot; + characterData[i][1] + &quot; 防御力:&quot; + characterData[i][2]);
  }
 }
実行結果は以下のようになるはずです。
 キャラクター1 体力:100 攻撃力:20 防御力:10
 キャラクター2 体力:90 攻撃力:25 防御力:10
 キャラクター3 体力:120 攻撃力:15 防御力:5
 キャラクター4 体力:80 攻撃力:15 防御力:15

&amp;u(){添え字が3つ以上、三次元以上の多次元配列を作る事もできます。}
また、多次元配列を一発で初期化する方法もあります。
ちょっと長いですが、多次元配列の事が一通り分かると思うのでもしよろしければご覧ください。
 public class ArrayTest5
 {
  public static void main(String[] args)
  {
   //両手の武器を定義、1つ目の添え字が左か右か、2つ目が攻撃力、射程、連射力
   //改行など書き方は人それぞれ、メモ書きに例を書いておきます
   int[][] newCharacter =
   {
    {10, 2, 3},//1次元の配列を&quot;,&quot;で区切る
    {5, 2, 6}
   };
   System.out.println(&quot;新規キャラクター&quot;);
   System.out.println(&quot;左手武器:攻撃力/&quot; + newCharacter[0][0] + &quot; 射程/&quot; + newCharacter[0][1] + &quot; 連射/&quot; + newCharacter[0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + newCharacter[1][0] + &quot; 射程/&quot; + newCharacter[1][1] + &quot; 連射/&quot; + newCharacter[1][2]);
   System.out.println(&quot;&quot;);//空行を入れる、\nでも良いけど...
 
   //1つ目の添え字は何人目かで、後は前の配列の添え字を一つずらした感じで2つ目の添え字が左か右か、3つ目が攻撃力、射程、連射力
   //ここはnew int[4][2][3]ってやっても良いが、一つずつ数字を代入するのは面倒なのでそのやり方は省略
   int[][][] party =
   {
    //一人目、添え字は0
    {
     {4, 1, 10},
     {7, 3, 4}
    },//配列の配列も&quot;,&quot;で区切る
    //二人目
    {
     {2, 5, 8},
     {20, 5, 1}
    },
    //三人目
    {
     {5, 4, 5},
     {6, 4, 4}
    },
    //四人目
    {
     {5, 1, 8},
     {10, 1, 4}
    }
   };
   int i = 0;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 1;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 2;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 3;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
 
   System.out.println(&quot;&quot;);
 
   //int[][][]はint[][]の配列としても見れる、例に漏れず二次元配列の初期化のように配列を直接作って入れる事は不可能
   party[0] = newCharacter;
   System.out.println(&quot;キャラクター1を新規キャラクターと交換しました&quot;);
   i = 0;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 1;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 2;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 3;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
 
   System.out.println(&quot;&quot;);
 
   //int[][][]はint[]の入る二次元配列とも見れる
   int[] newWeapon = {30, 3, 1};
   party[0][1] = newWeapon;
   party[1][1] = newWeapon;
   party[2][1] = newWeapon;
   party[3][1] = newWeapon;
   System.out.println(&quot;全キャラクターの右手武器を同じものに交換しました&quot;);
   i = 0;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 1;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 2;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
   i = 3;
   System.out.println(&quot;キャラクター&quot; + (i + 1));
   System.out.println(&quot;左手武器:攻撃力/&quot; + party[i][0][0] + &quot; 射程/&quot; + party[i][0][1] + &quot; 連射/&quot; + party[i][0][2]);
   System.out.println(&quot;右手武器:攻撃力/&quot; + party[i][1][0] + &quot; 射程/&quot; + party[i][1][1] + &quot; 連射/&quot; + party[i][1][2]);
  }
 }
実行結果はこうなります。
 新規キャラクター
 左手武器:攻撃力/10 射程/2 連射/3
 右手武器:攻撃力/5 射程/2 連射/6
 
 キャラクター1
 左手武器:攻撃力/4 射程/1 連射/10
 右手武器:攻撃力/7 射程/3 連射/4
 キャラクター2
 左手武器:攻撃力/2 射程/5 連射/8
 右手武器:攻撃力/20 射程/5 連射/1
 キャラクター3
 左手武器:攻撃力/5 射程/4 連射/5
 右手武器:攻撃力/6 射程/4 連射/4
 キャラクター4
 左手武器:攻撃力/5 射程/1 連射/8
 右手武器:攻撃力/10 射程/1 連射/4
 
 キャラクター1を新規キャラクターと交換しました
 キャラクター1
 左手武器:攻撃力/10 射程/2 連射/3
 右手武器:攻撃力/5 射程/2 連射/6
 キャラクター2
 左手武器:攻撃力/2 射程/5 連射/8
 右手武器:攻撃力/20 射程/5 連射/1
 キャラクター3
 左手武器:攻撃力/5 射程/4 連射/5
 右手武器:攻撃力/6 射程/4 連射/4
 キャラクター4
 左手武器:攻撃力/5 射程/1 連射/8
 右手武器:攻撃力/10 射程/1 連射/4
 
 全キャラクターの右手武器を同じものに交換しました
 キャラクター1
 左手武器:攻撃力/10 射程/2 連射/3
 右手武器:攻撃力/30 射程/3 連射/1
 キャラクター2
 左手武器:攻撃力/2 射程/5 連射/8
 右手武器:攻撃力/30 射程/3 連射/1
 キャラクター3
 左手武器:攻撃力/5 射程/4 連射/5
 右手武器:攻撃力/30 射程/3 連射/1
 キャラクター4
 左手武器:攻撃力/5 射程/1 連射/8
 右手武器:攻撃力/30 射程/3 連射/1

余談ですが、先ほど配列の宣言の仕方で、int a[]という方法もあると言いました(推奨しませんが)。
その上で、int[] a[][]と書くと三次元の配列が入る変数になります。
つまり型の部分と変数の部分の[]の数の合計の次元の配列が入る変数になります。
出来るというだけで非推奨です。冗談でもやらない方が良いかと思います...
**配列の大きさを数字に
これはその3でやる繰り返しなどで主に使うものなのですが、配列を使うと、配列の要素の数を数字として出したい時が出てきます。
その時は、変数の後に&amp;bold(){.length}と付けると、それが要素の数のint型のリテラルになります。なのでshort型やbyte型の変数にはそのまま入れられません(やりたいならキャストが必要)。
例えば、new int[10]と入れた変数aがあって、a.lengthと書くと、それが10というint型のリテラルになります。最後の要素の添え字(0から始まる)の9ではなく、&amp;u(){要素の数(1から始まる)}になるのでちょっと注意が必要かもです。
ちなみにオブジェクト指向をやっていくと、ついつい.length()と括弧を付けそうになるかもしれません。混同しないように注意しましょう。
以下に一例を書いておきます。
 public class ArrayTest6
 {
  public static void main(String[] args)
  {
   int[] a = new int[10]；//要素が10個の配列を作成
   System.out.println(a.length);//10と表示される
 
   System.out.println(&quot;&quot;);//区切り
 
   int[][][] b = new int[4][2][3];//多次元配列の場合
   System.out.println(b.length);//一つ目の[]の大きさである4と表示される
   System.out.println(b[0].length);//二つ目の[]の大きさである2と表示される、1つ目の添え字がどうだろうと同じとはいえb[].lengthだとコンパイルエラーになるので適当な数字を入れて置くこと
   System.out.println(b[0][0].length);//三つ目の[]の大きさである3と表示される
   System.out.println(&quot;bの要素の数の合計は&quot; + (b.length * b[0].length * b[0][0].length));添え字が何通りあるか=要素が何個あるかを計算
  }
 }
実行結果はこうなります。
 10
 
 4
 2
 3
 bの要素の数の合計は24
**配列は参照型
所で、以下のコードは実行するとどうなるでしょうか。
 public class ArrayTest7
 {
  public static void main(String[] args)
  {
   int a = 0;
   int b = a;
   b++;
   System.out.println(a);
   System.out.println(b);
 
   int[] c = {0, 0};
   int[] d = c;
   d[0]++;
   System.out.println(c[0]);
   System.out.println(d[0]);
  }
 }
前半はbにaの内容を代入、詳しく言えばaがリテラルの0に変化してそれをbに代入して、さらにbだけに数値を1追加しています。つまりaは0のままで、bは1になります。
後半はdにcの内容を代入、さらにdの1つ目の要素に1を追加しています。dは{1, 0}になりますが、cは...
とにかく、実行内容はこちらです。
 0
 1
 1
 1
前半は予想通りaとbがそれぞれ0と1になっていることが分かります。
しかし、cとdは、dだけ変更を加えたはずなのに、c[0]も0ではなく1になってしまいました。

これは、あの式で渡した内容は&amp;u(){配列の内容ではなく、その配列のデータがコンピュータが作業する上で一時的にデータを置く場所であるRAM((例えば、今開いているウィンドウの内容をRAMに書き出して、画面に映す上でRAMから読み込んだ情報を使ったり、使わないウィンドウもRAMにデータを置くことで使う時にすぐにデータを取り出して表示したり...Javaではintなどの変数の情報もRAMに一時的に保存されます。))(物理メモリとも)のどこにあるかの情報、分かりやすく例えれば住所を渡しているからです。}
つまり、配列が入っている変数は厳密には配列の住所が入っている箱だったのです。このような型を&amp;color(#F54738){&amp;bold(){参照型}}と言います。逆に今までやってきたintなどは&amp;color(#F54738){&amp;bold(){基本型}}、あるいは&amp;bold(){プリミティブ型}と呼ばれています。厳密には、というか一般的なコンピュータ用語で参照型もプリミティブ型の一種なのですが...
ちなみにStringでこのようなこと(前のString型変数を代入した後に後のString型変数の内容を変更する)をやっても前半と同じようになります。リテラルに変化するからなのですが、オブジェクト指向を学ぶとちょっと疑問に思う部分です...それは置いときます。

さて、本来こんな事はやりませんが、こんなコードを実行してみましょう。println()の性質上、char型の配列でやると文字列として表示されてしまうのでご注意を。
 public class ArrayTest8
 {
  public static void main(String[] args)
  {
   int[] a = {0, 0};
   System.out.println(a);
  }
 }
このコードの実行結果は環境などによって変わると思われますが、以下のように何か文字列と@の後に16進数の数が表示されると思います。
 [I@5ca881b5
これがaの中に入っているものの正体、@の後の数字がRAM上のどの場所にあるかを示す住所なのです。
ArrayTest6のd = cというのはこの住所を代入しているので、dに変更を加えるとその住所にある配列をいじる事になるので、cを読み込むとdに加えた変更がそちらにも適用されたように見えるという事です。

この参照型は、情報の受け渡しをする上で、膨大なデータを住所という小さい大きさの情報でやり取りができるという利点があります。詳しくはその4でお教えします。

ちなみに、int[]という型はint型の1次元配列が入るっていうだけなので、以下のように元々変数に入っていた配列と要素の数が違う、同じ型の配列を入れる事が可能です。
 public class ArrayTest9
 {
  public static void main(String[] args)
  {
   int[] a = new int[2];
   int[] b = {1, 2, 3};
   a = b;
   System.out.println(a[0]);
   System.out.println(a[1]);
   System.out.println(a[2]);
  }
 }
一応実行結果を書くと以下のようになります。
 1
 2
 3
所で、二次元配列は、一次元配列を要素に持つ一次元配列、つまり配列の配列としても見れる訳ですが、大きさの違う配列を要素として入れる事が出来ます。
 例:
 int[][] a = {{0,1}, {2, 3, 4}};
 int[] b = {5, 6, 7, 8};
 a[0] = b;//これでaの中身は{{5, 6, 7, 8},{2, 3, 4}}に
逆を言えば、&amp;u(){二次元配列の要素として入ってる配列は、大きさがバラバラでも構わないという事です。}

もし同じ要素の新しい配列を作る場合、1つ1つ代入をしなければなりません。
面倒ですが、その3で学ぶ繰り返しを使えばある程度すっきりとした記述が可能です。
配列は一度作ったら大きさを変えられないので、そういう点でも重要そうに見えて、実は好きなように大きさを変えられる配列が存在するので意外と使う事はありません。
それに関してはオブジェクト指向を身に付ける必要がありますが...逆にこのタイプの配列は機能が限られてる分メモリ消費ややる事によっては動作も軽いので、ケチりが癖になってる人は多用するかもしれません...

この性質は、オブジェクト指向をやる上でも関わってくるので、覚えておいて損はありません。
----
&amp;bold(){これでその2は終わりです。次は、条件分岐や繰り返しというものを使っていきましょう。}
----
*コメント
指摘や質問等あったらここへ。
#comment_num2    </description>
    <dc:date>2021-07-02T12:56:10+09:00</dc:date>
    <utime>1625198170</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/15.html">
    <title>Java独学ノート/その1:環境作り</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/15.html</link>
    <description>
      #contents
*開発キットのダウンロード
**JDKをダウンロード
JDK = Java Development Kit。
公式の開発キット。無料で作らせてくれるという良心さ。
https://www.oracle.com/jp/java/technologies/javase-downloads.html
このページのOracle JDKの項、JDK Downloadというのがあるのでそれをクリックすると最新のJDKのダウンロードページに行けます。

Windowsの場合は下から二番目のWindows x64 Installerをクリックしてください。
Oracle Binary Code License Agreement for Java SEを読んで同意すれば・・・と全部英語ですね、[[メモ書き&gt;Java独学ノート/メモ書き]]に大体の事を書いておきます。
同意したなら、I reviewed and accept the Oracle Technology Network License Agreement for Oracle Java SEをクリックしましょう。するとダウンロードができます。
&amp;s(){x86、x64ってなってますが、x86は32ビット用、x64は64ビット用みたいです。}
現在は64ビット用のみ用意されています。JDK8までなら32ビット用が用意されています。(ページを下にスクロールするとある)

コンピューターを右クリックでプロパティをクリックしたり、コントロールパネルからなどシステムを開いて、自分のコンピュータが何ビットか見ておきましょう。
クリックして後はインストーラがやってくれますので従ってください。
**環境変数を変える
&amp;bold(){現在はインストーラーを使う事で自動的に行われます。&amp;br()旧バージョンの場合や早期アクセス版でインストーラーが無くプログラムを直接ダウンロードした場合(ダウンロードページにあるCompressed Archive)などは必要になるかもしれません。}

先ほどの方法で開くシステムから、システムの詳細設定をクリックして開きます。次に開いたシステムのプロパティの環境変数をクリックします。
システム環境変数の中からPathを探してください。ここにJava開発関連の物が入ったフォルダを指定するのですが、自分の場合はC:\Program Files\Java\jdk-16.0.1\binでした(最後はバージョンによって変わる)。-
この環境変数、&quot;;&quot;を使ってパスを区切っているようです。なので、環境変数の最後のところに、;を付けた後その場所のパスを入力してください((自分の場合;C:\Program Files\Java\jdk-16.0.14\binを最後に入力する))。JDKを新しいものにするときはこの環境変数を変える事を忘れずに。

Windows10では(7→10とパソコンを変えたので間は分かりません...)、環境変数が&quot;;&quot;を使って区切らずとも複数入れられるようになっています。
JDKのパスを入力してください。

これは別にやらなくても大丈夫らしいんですが、自分これをしないでやる方法を知らないのと、これをするだけでかなりプログラミング後の作業がしやすくなるので、これをやった事前提で話を進めます。
*試しにプログラミングしてみる
**ソースコードの作成
開発に便利なソフトは有名なものがありますが、自分は公式のもの以外使わないというこだわりがあるので省略します。
とりあえず、メモ帳など文章を書き込めるものを開きます。
次に、以下の事を書き込んでください。
 public class Test
 {
  public static void main(String[] args)
  {
   System.out.println(&quot;ここに好きな言葉を入力&quot;);
  }
 }
これをTest.javaという名前で保存してください。拡張子がjavaになる事がポイントです。
このjavaファイルの事を&amp;color(#F54738){&amp;bold(){ソースコード}}と言います。・・・言いますが一人でプログラミングをやる上では覚える必要はありません。以下、このページで出てくる用語はほとんど覚えなくても良いです、1人でやる場合は。
ともかく、これで後はコンピュータに任せるだけなので、後は基本どのプログラムでも同じです。
**コンパイラでコンパイル
次にやる事は、人間に分かりやすい言葉であるソースコードを、コンピュータの言葉｢マシン語｣に翻訳した&amp;color(#F54738){&amp;bold(){バイトコード}}に変えます。
この翻訳作業を&amp;color(#F54738){&amp;bold(){コンパイル}}、これを行ってくれるプログラムを&amp;color(#F54738){&amp;bold(){コンパイラ}}と言います。

Java公式のコンパイラはjavac、さっき環境変数で指定したフォルダのbinの中に入ってます。
で、これをどう使うかというと、コマンドプロンプトを使います。

まずコマンドプロンプトに作ったソースコードの場所を認識させます。
cdの後、フォルダの場所を指定すると左に出ている(現在認識している)パスの中のフォルダを認識できます。
これは\で区切ると、このフォルダの中のこのフォルダといった指定が可能です。

知らない人のために例を挙げると、C:\Program Filesと左がなっているときにcd Java\binと入力すれば、C:\Program Filesの中のjavaというフォルダのbinというフォルダを認識して左の表示がC:\Program Files\Java\binになります。
ちなみに、違うドライブの中に作った場合、cd /d (目的のドライブから始まるフォルダのパス(例 G:\My Java))でできます。
一つ前のフォルダに移動したい場合は cd ..と入力してください。

それはともかく作ったソースコードのあるフォルダを認識させ、javac Test.javaと入力します。&amp;u(){他の名称のソースコードでも、ファイル名.javaと拡張子まで記載してください。}
そうして、ちゃんとできれば何の表示も無く今認識しているパスが表示され次のコマンドが打てるようになります。
ソースコードのあるフォルダにはTest.classというのができてると思います。これがバイトコードです。
**インタプリタで動作させる
&amp;color(#F54738){&amp;bold(){インタプリタ}}は、バイトコードから情報を読み取ってそれに従う、ゲームで言うゲーム機のようなものです。
java公式のインタプリタは、javacと同じ場所にあるjavaというアプリケーションでできます。

では、javaを使ってTestを起動してみましょう。
コマンドプロンプトにjava Testと記入します。拡張子はつけないでください。
すると、以下の文が表示されて終わるはずです。
 ここに好きな言葉を入力
これでテストされたので完成とします。こうやってjavaのアプリケーションは作られていきます。

ちなみに、java Test.javaという風にファイル名を入力すると、一時的にコンパイルして実行してくれます。
classファイルは変更されないのと、javaファイルの現在の保存された内容を実行するので気を付けてください。
*試しに変えてみる
今出たのは｢ここに好きな言葉を入力｣という言葉です。これは3行目の
 System.out.println(&quot;ここに好きな言葉を入力&quot;);
という文によりjavaが文を表示するという事を行ったためです。このようなコンピュータに作業をさせる文を&amp;color(#F54738){&amp;bold(){命令}}と呼びます。

この文によって文章が表示されたので、ここに好きな言葉を入力という所に何か入力してみましょう。するとその文が表示されたと思います。
ただ、処理の関係上、両隣の二重引用符をつけないとコンパイルエラーになります。また、特定の文字を入力するとコンパイラが勘違いしてコンパイルエラーになります(この例では&quot;を文中に使う)。
----
&amp;bold(){これでその1は終わりです。次は、変数というものを使っていきましょう。}
----
*コメント
指摘や質問等あったらここへ。
#comment_num2    </description>
    <dc:date>2021-07-02T12:50:35+09:00</dc:date>
    <utime>1625197835</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/19.html">
    <title>Java独学ノート/メモ書き</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/19.html</link>
    <description>
      #contents
*利用契約の内容
(編集中)
*予約語まとめ
Java言語仕様では3章にKeywordsという呼び名で紹介されています。
これらは変数などの名前にそのまま使えません。
逆を言えば、演算子などのように名前の途中に含まれていたりしても問題が起きるという事はありません(例、shortcutなど)。
※Java16言語仕様基準、https://docs.oracle.com/javase/specs/jls/se16/html/index.html
|言葉|意味|言葉|意味|言葉|意味|言葉|意味|言葉|意味|
|abstract|抽象&amp;br()メソッドやクラスに付ける修飾子|continue|繰り返し文で後の文を無視して繰り返し文の最初に戻る|for|繰り返し文&amp;br()主に何週するか決まってる時に使う|new|配列、オブジェクトをRAMに発生させる演算子|switch|1つの変数の中身に応じて処理をする条件文|
|assert|(勉強中)|default|switch文のラベル&amp;br()どのcaseラベルにも当てはまらない場合|if|真偽値で処理するかしないかを決める条件文|package|パッケージ&amp;br()クラスファイルの居場所を定義する|synchronized|他のスレッドが処理中にその処理を行わない|
|boolean|真偽値&amp;br()基本型の一つ|do|繰り返し文、do-while文の頭&amp;br()末尾のwhile文の条件を無視して一度は内容を実行|goto|&amp;bold(){Javaでは不使用}&amp;br()switch文で他のラベルに移動して下記の処理をする|private|アクセス修飾子&amp;br()それを内包するクラス内でしかアクセスできない|this|今定義しているクラスまたはインスタンスそのもの|
|break|switch文、繰り返し文の外に出る|double|倍精度の浮動小数点型&amp;br()基本型の一つ|implements|実装する&amp;br()インターフェースをクラスに継承する場合|protected|アクセス修飾子&amp;br()同じパッケージ内及びそれを内包するクラスを継承した子孫がアクセス可能|throw|例外を投げる|
|byte|1バイトの整数型&amp;br()基本型の一つ|else|if文でfalseが出た場合に実行する文|import|パッケージ名やクラス名(static import)を省略できるようにする|public|アクセス修飾子&amp;br()どのパッケージにあるクラスでもアクセス可能|throws|メソッドの、try-catch文で対処しなければならない例外を定義|
|case|switch文のラベル&amp;br()記述されたリテラルと変数の内容が一致する場合|enum|列挙型|instanceof|インスタンスがそのクラス、あるいはそれを継承した子孫であればtrueになる演算子|return|メソッドから抜け出し、void以外であれば戻り値に変化する|transient|(勉強中)|
|catch|Try文内で例外が発生した場合の対処をする文|extends|継承する|int|4バイトの整数型&amp;br()基本型の一つ|short|2バイトの整数型&amp;br()基本型の一つ|try|例外が発生する恐れがある場所をまとめる文&amp;br()catch文で実際に発生した場合の処理を定義|
|char|文字型&amp;br()基本型の一つ|final|変更不可能にする修飾子&amp;br()変数(フィールド)は値変更不可&amp;br()メソッドはオーバーライド不可&amp;br()クラスは継承不可|interface|インターフェース&amp;br()抽象メソッドと定数のみで構成されたクラス|static|静的&amp;br()インスタンス化に関係なく存在するフィールド、メソッド、インナークラス|void|メソッドの戻り値が存在しない事を意味する&amp;br()扱い上は基本型の一つ|
|class|クラス&amp;br()プログラムのまとまりの一つ|finally|Try文で例外発生の有無に関係なく実行する処理を定義する文|long|8バイトの整数型&amp;br()基本型の一つ|strictfp|(勉強中)|volatile|(勉強中)|
|const|&amp;bold(){Javaでは不使用}&amp;br()定数を定義する修飾子|float|単精度の浮動小数点型&amp;br()基本型の一つ|native|(勉強中)|super|丁度そのクラスが継承したクラス|while|繰り返し文&amp;br()真偽値で繰り返すかどうか決める|
あと、_(アンダースコア)も予約語扱いされています(weapon_idのように&quot;_&quot;単体で使わなければ問題ない)。
*小数型、浮動小数点の性質
(編集中)
*特殊な演算子、リテラル
(編集中)
*エスケープ文字
(編集中)
*演算子の優先順位まとめ
インクリメント、デクリメント、真偽値反転 !、キャスト演算子 (など)
算術演算子 +など
関係演算子 ==など
論理演算子 &amp;&amp;など
代入演算子 =など
*インクリメント、デクリメントの書く位置による性質
(編集中)

*その8のメモ書き
**イベントリスナー(EventListener)の項までで作ったコードを一まとめに
3つのソースコードを作りましたが、Listener.javaの内容をそのままBase.javaに入れてBase自身をリスナーとして追加し、Runtime.javaのpublic static void main(String[] args)をBase.javaに入れてjava Baseで起動すれば、一つのコードで済みます。
以下はそれらをまとめたコードです。Baseを基準としてコメントに移植要素を書いておきます。
 import java.awt.*;
 import java.awt.event.*;//Listeners.javaで使ったもの
 
 public class GUI00 extends Frame implements WindowListener, KeyListener//Listener.javaで実装したインターフェイス
 {
  public static void main(String[] args)//Runtime.java要素
  {
   if(args.length &gt; 0)
   {
    for(String name : args)
    {
     new Base(name);
    }
   }
   else System.out.println(&quot;No Args&quot;);
  }
 
  public Base(String name)
  {
   super(name);
   setSize(400, 300);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   setVisible(true);
  }
  //以下Listeners.java要素
  public void windowClosing(WindowEvent e)
  {
   this.dispose();//イベントオブジェクトから呼び出さずとも消せる
  }
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;
   this.dispose();//イベントオブジェクトから呼び出したりWindow型にキャストしなくとも消せる
  }
  //以下インターフェースを実装するため一応実装したメソッド
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
 }
この辺は本当に人によって好みが分かれると思うので、複数人でやっていく場合、GUIの原理をよく理解して、他人のコードを見てどうやってるか理解できるようにしたい所です。

また、Frameを継承せず変数として扱う事でも初期設定をすることができます。
あと、WindowAdapter他アダプタークラスを継承した匿名クラスを、add〇〇Listenerの引数に直接入れる方法も使ってるので、
特に複数人で作る場合は使う人もいると思いますし、覚えると無駄なメソッド実装が無く便利なので覚えておいて損は無いと思います。
アダプタークラスはava.awt.eventに入ってます。
 import java.awt.*;
 import java.awt.event.*;
 
 public class GUI01
 {
  public static void main(String[] args)
  {
   if(args.length &gt; 0)
   {
    for(String name : args)
    {
     Frame f = new Frame(name);//以下はBaseのコンストラクタでやってた事、匿名クラスがListeners.javaでやってた事
     f.setSize(400, 300);
     f.addWindowListener
     (
      new WindowAdapter()//addWindowListenerの引数の中で匿名クラス作成、WindowListenerを実装したクラスなので多態性で入れられる
      {
       public void windowClosing(WindowEvent e){f.dispose();}//WindowAdapterの時点ですべてのメソッドが実装してある(中身はカラ)ので何かをするこれだけでOK
      }
     );
     f.addKeyListener
     (
      new KeyAdapter()
      {
       public void keyPressed(KeyEvent e)
       {
        if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;
        f.dispose();
       }
      }
     );
     f.setVisible(true);
    }
   }
   else System.out.println(&quot;No Args&quot;);
  }
 }    </description>
    <dc:date>2021-07-02T12:49:52+09:00</dc:date>
    <utime>1625197792</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/16.html">
    <title>Java独学ノート</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/16.html</link>
    <description>
      #contents
*概要
**目的
将来ゲームを作りたいのと、MinecraftのMODを作りたいのでJavaを独学で勉強してるのですが、
本だと基礎的過ぎてゲームを作れない(特にGUIが作れないのが・・・)、だからといってGUIの作り方を調べると今までやってきた書き方と違う・・・なんてことがあったので、自分なりに解釈していった事をここにまとめる事にしました。
目標としては、どんな記載の仕方をしたコードでも認識できるような説明、できるだけ核心を突いた説明をしていこうと思います。
ただ、自分にとって分かりやすいように書いたようなノートなので説明が分かりにくいかもしれないです・・・済みません・・・

自分は一人でゲームやMODを作っていきたくて、それ前提でノートを書いていきますが、複数人でプログラムしていく上では問題があるかもしれないです。
一応様々な書き方の例を挙げて、どんな書き方をされても理解できるように、という感じでやっていってます。
簡単な参考書を見た上で、別の書き方や詳しい原理などを知るのに読んでいただけたらおそらく役に立つかもしれませんが、このノートを見て、Javaを理解できたという人がいれば光栄です。
**Javaとはなんだろうか
一言で言えば、オブジェクト指向というプログラミングの手法をやりやすくした、プログラミング言語の1つと言ったところでしょうか。
オブジェクト指向というのは、たとえばゲームに出てくるアイテムや敵、ステージなどをオブジェクトとして定義し、アイテムならアイテムというオブジェクト、そこに性質を加えてそれぞれのアイテムを作り、ゲーム全体を仕切るプログラムは最終的に定義されたものを呼び出して扱えるという・・・説明が難しいのでたとえ話にしないとなかなか言葉にできないものですが、一言にまとめようとすると｢もの｣の種類ごとに定義していく手法・・・で良いのですかね、分からないです、済みません。

昔はブラウザ用のゲームやブラウザを使わず専用のウィンドウで表示されるゲーム(Minecraftとか)など色々ありましたが、
Flashの登場、ChromeのNPAPIサポート終了など、衰退しつつあるJavaですが、それでもまだ現役の言語であります。
Flashが引退した今でも、Unityというゲームを作る事をメインとしたエンジンが登場し、ゲーム作りとしてJavaが使われる事はほぼ無くなっていますが...

もともとサン・マイクロシステムズという会社が扱ってきたのですが、今ではオラクルという会社に合併され、Javaはオラクルが開発・提供しています。わりと最近の事なので、サンのロゴを見たことがある人もいると思います。自分も見たことがあります((たしかSを4つ正方形に並べたやつでしたよね))。
//Javaの開発キットは公式が無償で使わせてくれるので、ゲームを作りたいならJavaがお勧めです。
**バージョンについて
基本的にJava8を基準に解説やリファレンスのURLをやっていってます。
それより後のバージョンで採用された内容などはなるべく注記します。
こちらではJava17でテストしているので、何か違いがあったらごめんなさい...
*目次
**第一章 Javaの基本文法
[[その1:環境作り&gt;Java独学ノート/その1:環境作り]]
[[その2:変数・配列の使用と計算&gt;Java独学ノート/その2:変数・配列の使用と計算]]
[[その3:条件で分岐や繰り返しを行う&gt;Java独学ノート/その3:条件で分岐や繰り返しを行う]]
[[その4:メソッド・クラス・パッケージ&gt;Java独学ノート/その4:メソッド・クラス・パッケージ]]
**第二章 オブジェクト指向
[[その5:オブジェクト指向の基礎+カプセル化&gt;Java独学ノート/その5:オブジェクト指向の基礎+カプセル化]]
[[その6:継承と多態性&gt;Java独学ノート/その6:継承と多態性]]
[[その7:APIリファレンスの読み方&gt;Java独学ノート/その7:APIリファレンスの読み方]]
まとめ中
以下、予定なので出来るかどうかも分からないです・・・済みません・・・
**第三章 GUIで2Dゲームでも
**第四章 3Dのゲームを作る
**第五章 MinecraftのMODを作る
**その他
[[メモ書き&gt;Java独学ノート/メモ書き]]
*参考文献
本:
世界で一番簡単なJavaのe本:秀和システム
スッキリわかるJava入門:インプレスジャパン
スッキリわかるJava入門実践編第2版:インプレスジャパン

サイト:
[[超初心者のプログラム入門(Java)&gt;http://maedakobe.rw.xsi.jp/java2/java2.htm]]
----
*コメント
このページについての指摘、上記ノートの項目に当てはまらないような質問などはこちらに。
#comment_num2    </description>
    <dc:date>2021-07-01T18:09:40+09:00</dc:date>
    <utime>1625130580</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/20.html">
    <title>Java独学ノート/その8?:GUIを作ってみよう</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/20.html</link>
    <description>
      GUIの勉強を始めたのでちょっとずつ書いていきます...
#Contents
*GUIとは
今まで、コマンドプロンプトで色々やってきました。
コマンドプロンプトの特徴として、文字だけで構成されている事が挙げられます。
このように文字だけで人に認識できるようにしたユーザーインターフェース、つまり人とコンピュータがやり取りする画面を&amp;u(){Character User Interface}、略して&amp;color(#F54738){&amp;bold(){CUI}}と言います。
Characterは文字を意味します。基本型のcharはCharacterのCharから来ています。

一方、皆さんが使うウィンドウ、例えばインターネットのページを見るブラウザ、ゲーム、メッセージダイアログその他諸々は、文字だけではなく図形や絵で構成されています。
このように、文字に限らず色々な見た目のものが自由自在に配置してあるユーザーインターフェイスを&amp;u(){Graphical User Interface}、略して&amp;color(#F54738){&amp;bold(){GUI}}と言います。

昔、PCが誕生した頃はCUIが基本でした。
今でも、起動したときに環境ややりたい事によって(PCの復元とか)は文字だけが表示される画面が出てきたり、あのブルースクリーンなんかも文字だけで構成されていたりとCUIで作られているシステムは色々存在しますし、
コマンドプロンプトは、言ってしまえばPCが誕生した頃のPCを再現したようなものです。

昔はGUIなんてやれるほどのコンピュータの能力は無いですし、ファミコンだって、あれは文字の集まりが動いているようなものです((文字ごとに主人公の左上、その右隣、そのさらに右隣といった感じでフォントの感覚で文字と絵、というかパズルのピースを当てはめていた感じです。チートバグ動画なんかだと、文字のデータとそれに当てはまる絵をずらしてしまい文字の規則正しく並んだ物体が動いてるなんて場面をよく見ると思います。))。
それが今はコンピュータの進化や効率の良い描画の処理方法が開発されていって、一般人が触るPCのアプリはほぼ全てGUIになり、知識の浅い人でもPCを扱いやすくなった、といった具合でしょうか。

Javaでは、初代から存在する&amp;u(){Abstract Windowing Tools}、略して&amp;color(#F54738){&amp;bold(){AWT}}と呼ばれる、GUIを作るAPIや、その上位互換(パフォーマンス以外は)である&amp;color(#F54738){&amp;bold(){Swing}}などが存在します。
基本はAWTを学んで、そこでGUI作りのいろはを覚え、そこに付け加える形でSwingを覚えるというのが一般だと思われます。
自分の場合は結構貧乏性なので、極力AWTで作りたいってのもあってAWTの限界はよく知っておきたい所です。
*GUIの構成
**コンポーネント(Component)とコンテナ(Container)
JavaのGUIとして基本となるAPIは、主にjava.awtというパッケージに入っています。

GUIを構成するもの、例えばGUIに表示される文章や入力スペース、画像、チェックボックスなどなど、それらは原則java.awt.&amp;bold(){Component}というクラスを継承しており、&amp;color(#F54738){&amp;bold(){コンポーネント}}と呼ばれています。
ComponentのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Component.html

しかしコンポーネントだけではまとまりがありません。
これらをまとめるもの、逆を言えば、これらを中に入れて管理できるものは原則java.awt.&amp;bold(){Container}というクラスを継承しており、&amp;color(#F54738){&amp;bold(){コンテナ}}と呼ばれています。
ContainerのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Container.html
主なものにウィンドウがあります。
ウィンドウを人がカーソルで移動させれば、その中の文章や画像は置いてけぼりにされずに動きますよね。それはウィンドウというコンテナが管理していて一緒に動かされるからと考えてください。

java.awt.Containerはjava.awt.Componentを継承しています。つまり、コンテナはコンポーネントの一種でもあるのです。
絵を描くアプリケーションで例えるなら、ベースとなるウィンドウ(コンテナ)の中に、具体的に絵を描く部分と、ツールを切り替えたり色を変えたりする部分があって、ツール画面自体はコンテナ、そこにあるツールを選択するボタンはコンポーネントといった具合です。
こういうようにコンテナとして内包する事により、ツール画面自体を動かす(ようにプログラムする)だけで、ボタンも一緒に移動してくれます。
***フレーム(Frame)
まずは、GUIのベース、すなわちウィンドウを発生させてみましょう。

ウィンドウは元を辿るとContainerを継承しています。
つまりウィンドウはコンテナであり、この中にコンポーネントを入れていっていくというのがGUI作りの基本です。

ウィンドウとして扱えるコンテナはjava.awt.Windowがありますが、これだけでは普通のウィンドウとしては足りないので、これを継承しているjava.awt.&amp;bold(){Frame}を基本的に使っていきます。
WindowのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Window.html
FrameのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Frame.html

今回は2つのファイルに分けて作っていきます。
以降独自の方法で要素を追加していきますが、どう組み込むかは人によってまちまちだと思います。
無理に分けようとすると色々呼び出したりする手間があるので、基礎が分かったら独自にまとめた方が良いと思われます。[[メモ書き&gt;Java独学ノート/メモ書き]]に一例を書いておきます。

-Runtime.java
--起動時にどうするかのプログラムです。
--新しくオブジェクトとしてフレーム(を継承したもの)をnew演算子で発生させます、するとウィンドウが発生します。
 public class Runtime
 {
  public static void main(String[] args)
  {
   new Base(&quot;Test&quot;, 400, 300);//引数はウィンドウの名前と大きさ、変数を作らなくても良い
  }
 }

-Base.java
--java.awt.Frameを継承したものです。
--これからこれをいじってGUIを作りたいものに変えていきます。
 import java.awt.*;
 
 public class Base extends Frame
 {
  public Base(String name, int width, int height)//コンストラクタ、ウィンドウの名前と大きさを引数で貰った
  {
   super(name);//Frameのコンストラクタ、String型の引数を入れると、ウィンドウの名前に反映されます。
   setSize(width,height);//Frame、すなわちウィンドウの初期サイズです。それぞれ横と縦の長さ
   setVisible(true);//Frameが見えるかどうか、初期状態では見えなくなっています。
  }
 }
さて、これを&amp;bold(){javac Runtime.java Base.java}とコマンドプロンプトに入力してコンパイルし、&amp;bold(){java Runtime}で起動してみましょう。
すると、Testという名前の真っ白なウィンドウが表示されました。

ところで、×ボタンを押しても消えません。なぜなら、×ボタンを押したときどうするか、
詳しく言えば、×ボタンを押されたというイベントが発生して、そのイベントをキャッチするまでは良いのですが、キャッチされたらどうするかが定義されていないからです。
現状ウィンドウを消す場合はJava自体を終了させなければなりません。コマンドプロンプトでCtrl+Cキーで強制終了させるか、コマンドプロンプト自体を閉じましょう。

ところで、Frameはnew演算子でオブジェクトとして発生するたびにウィンドウが出来ていきます。
Runtime.javaを以下のようにしてみましょう。
 public class Runtime
 {
  public static void main(String[] args)
  {
   if(args.length &gt; 0)//コマンドライン引数がある
   {
    for(String name : args)
    {
     new Base(name, 400, 300);//コマンドライン引数の内容をそのまま入れる
    }
   }
   else System.out.println(&quot;No Args&quot;);//コマンドライン引数が無い場合コマンドプロンプトに引数が無い事を表示
  }
 }
そして同じようにコンパイルし、&amp;bold(){java Runtime あ い う え お}と入力して起動すると・・・?
あ、い、う、え、おとそれぞれ名前の付いたウィンドウが合計5つ表示されるはずです。

5つあるのはFor文でコマンドライン引数の数だけnew演算子を使ったからです。
試しに3つ、6つ、とにかく好きな数言葉を入れてみましょう。その数だけ、それぞれの名前のウィンドウが表示されるはずです。
**イベントリスナー(EventListener)
上記のプログラムで作ったウィンドウは、×ボタンを押しても消えません。
先ほども言った通り、×ボタンを押したらどうするかが定義されてないのが原因です。
逆にこれによって、途中で止めてはいけない作業中に強制停止されない、あるいは作業が終わるまで閉じるのを待つという制御が出来たりと、×ボタンでどうするかが定義できるのは必要な事でもあったりします。

さて、JavaのGUIでイベントを処理するには、コンポーネントにjava.util.EventListenerを継承した&amp;color(#F54738){&amp;bold(){イベントリスナー}}を追加して、対応するメソッドを実装する事で、その操作がされた時の処理を定義することができます。
試しにComponentのページのメソッドの部分を見てください、add〇〇Listenerというメソッドがいくつかあると思います。
また、ContainerやWindow、Frameと見ていくと、その先々で更に発生するであろうイベントが増える分add〇〇Listenerが増えていくことが分かります。

まず、×ボタンを押すというイベントはFrameまで継承されていく過程のどの時点で発生する可能性があるでしょうか。
Windowは×ボタンが存在しないしFrame...と見せかけて、実はWindowなんです。
WindowにはaddWindowListenerというメソッドがあります。ここに引数としてWindowListenerがありますね。クリックしてメソッドを見てみましょう。
windowClosing、これが×ボタンを押した時実行されるメソッドです。｢ユーザーがウィンドウのシステム・メニューでウィンドウを閉じようとしたときに呼び出されます。｣だそうで...紛らわしいですね。

どれが×ボタンを押した事を検出してくれるか分かった所で、とりあえずリスナーを作ってみましょう。
Listener系はインターフェースなので、一つのクラスに複数入れる事もできます。便利ですね。

-Listeners.java
 import java.awt.event.*;
 
 public class Listeners implements WindowListener
 {
  public void windowClosing(WindowEvent e)
  {
   System.exit(0);
  }
  //以下特にそれが起きても何もしないけどインターフェースなので一応実装
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
  }
 }
そしてBaseをこう変えてください。
 import java.awt.*;
 
 public class Base extends Frame
 {
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width,height);
   addWindowListener(new Listeners());//これを追加
   setVisible(true);
  }
 }
そして変更したものをまとめてコンパイルし、起動して出てきたウィンドウの×ボタンを押すと消えるはずです。

ところで、現状この方法ではJavaを直接終了する方法でやっているので、複数ウィンドウが存在する場合は一つ×ボタンを押すだけですべて消えてしまいます。
ウィンドウを直接消したい時はWindow.dispose()を使う事でリソースを解放(RAMの容量を開ける)できます。
これで消したウィンドウはWindowの特定のメソッドで復活可能ですが、逆を言えばどこかで変数に入れて置かなければ完全に抹消されます。

dispose()を使う上で...
リスナーのメソッドにはWindowEventという型の引数がありますね。
この引数にはイベントが起きた時の情報があります。
リファレンスを見ると、情報を引き出せるメソッドがありますね。
また、継承元のEvent系クラスを辿ると、その時点で必ず存在するであろう情報を出せるメソッドが存在します。

って事で、このWindowEventから、×ボタンが押されたウィンドウが(RAM上の)どれかを見つけ出し、それをdispose()で消すようにしてみましょう。
という事でListeners.javaを以下のように変えてみましょう。
 import java.awt.event.*;
 
 public class Listeners implements WindowListener
 {
  public void windowClosing(WindowEvent e)//ここを変更
  {
   e.getWindow()//ウィンドウを呼び出す、型はWindowに
    .dispose();//ウィンドウを消す
  }
  //以下特にそれが起きても何もしないけどインターフェースなので一応実装
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
  }
 }
そしてコンパイルして起動、複数のウィンドウを出して×ボタンを押すと...
ちゃんと押したウィンドウだけ消えるはずです。

ちなみにWindowListenerのリファレンスを見ると、WindowListenerを実装したWindowAdapterというクラスがあります。
これはリスナー・オブジェクトの作成を容易にするため(リファレンスの説明より引用)にある&quot;アダプタ&quot;と呼ばれるクラスです。
既に一通り実装してある(メソッドの中身はカラ)ので、これを使えばListeners.javaの内容はこれで済みます。
一方インターフェースではないのでアダプタを一まとめにすることはできません。
ただし後術の性質の関係上、リスナーはまとめて定義するよりイベントの種類によって個別に定義するのが一般的なので、やり方によりますが気にならない場合が多いと思います。
また、匿名クラスとして使う際にも便利です。[[メモ書き&gt;Java独学ノート/メモ書き]]に一例を書いておきます。
 import java.awt.event.*;
 
 public class Listeners extends WindowAdapter
 {
  public void windowClosing(WindowEvent e)
  {
   e.getWindow().dispose();
  }
 }

リスナーを追加する事に関してですが、これは言い換えると、それ関係のイベントが起きたとき、このクラスを参照してねっていうのをコンポーネントにメモしている感じです。
それを踏まえて、Listeners.javaに、キーボードのEscキーを押すとウィンドウを消すように定義してみましょう。
KeyListenerはコンポーネントの時点で追加できます。Componentのリファレンスを参照してください。
 import java.awt.event.*;
 import java.awt.*;//今回はComponent型とWindow型を使う上でインポートします
 
 public class Listeners implements WindowListener, KeyListener//KeyListenerを追加
 {
  public void windowClosing(WindowEvent e)
  {
   e.getWindow().dispose();
  }
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;//KeyEventから押されたキーの情報を読み込んでEscキーではなかったら何もしない
   Component c = e.getComponent();//継承元のComponentEventのメソッド
   if(c instanceof Window)
    ((Window)c).dispose();//Window型にキャストして消す
  }
  public void keyReleased(KeyEvent e){}//キーが離された時
  public void keyTyped(KeyEvent e){}//文字を入力した時、大げさに言えば文字を入力するキーが押された場合
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
 }
そしてそのままコンパイルして起動してEscキーを押しても...何も起きません。
何故ならBase.java、WindowListenerを追加して、Windowに関するイベントが起きた時に処理をどのクラスに任せれば良いかは知っていますが、KeyListenerは追加されてないため、キーが押された時どうすれば良いかは分からないからです。
なのでBase.javaをこのように変えてみましょう。今までaddWindowListenerに直接new演算子を使ってリスナーを作っていましたが、今回は変数に入れてみましょう。
 import java.awt.*;
 
 public class Base extends Frame
 {
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width, height);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   setVisible(true);
  }
 }
そしてコンパイルすれば、Escキーを押した際にアクティブにしているウィンドウが消えるはずです。
----
&amp;color(#F54738){&amp;bold(){以下、Runtime.javaは戻した状態で話を進めます、戻さなくても一応やれなくはありません。}}
----
**グラフィックス(Graphics)
&amp;color(#F54738){&amp;bold(){Graphics}}は全てのコンポーネントに存在する要素で、描画、つまり画面への表示に影響する部分です。
このGraphicsを弄る事で絵を表示したり、キャラクターや障害物をゲーム状況に応じたように表示する事でゲーム画面を作る事ができます。
Graphicsですが、ホワイトボードで例えると...
この位置にプレイヤーがいて、この位置に敵である円がいて...みたいにマグネットが張り付いている感じではなく、
この位置にプレイヤーの画像と同じ色と形で色塗りして、この位置に敵がいるので円を描いて...みたいに直接ペンやスタンプで描いている感じです。
上記のようにマグネット何かを動かしているようにしたい場合は、基本的にGraphicsをリセットして描き直すのを繰り返す感じでやります。
GraphicsのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Graphics.html

Graphicsを弄る方法は、Component.getGraphics()で呼び出して直接命令する方法と、Componentに存在する、paint(Graphics g)、repaint()およびupdate(Graphics g)をオーバーライドして使用する方法があります。

まずGraphicsを呼び出して直接描画する方法です。
Graphicsには、簡単な図形を描画するメソッドが標準で搭載されているので、それを使用して、マウスの位置を中心とした丸を描くプログラムを組んでみましょう。
まずListeners.javaを以下のように変えます。
 import java.awt.event.*;
 import java.awt.*;
 
 public class Listeners implements WindowListener, KeyListener, MouseMotionListener//MouseMotionListenerを追加
 {
  public void windowClosing(WindowEvent e)
  {
   e.getWindow()
    .dispose();
  }
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;
   Component c = e.getComponent();
   if(c instanceof Window)
    ((Window)c).dispose();
  }
  //ここから
  public void mouseMoved(MouseEvent e)//左クリックせずにマウスを動かした時
  {
   Component c = e.getComponent();//イベントの発生したコンポーネント(フレーム)呼び出し
   Graphics g = c.getGraphics();//コンポーネントからグラフィック呼び出し
 
   g.fillOval//塗りつぶされた楕円を描く
   (
    e.getX() - 15,//左右の位置、イベントが発生した場所(今回の場合はポインターの位置)を取得して半径分引く(座標を左上の頂点とした長方形にすっぽり入るように描画するため)
    e.getY() - 15,//上下の位置
    30,//左右の大きさ、上記の括弧書きした内容の架空の長方形の大きさでもある
    30//上下の大きさ、大きさが違うと楕円、同じだと正円になる
   );
  }
  public void mouseDragged(MouseEvent e)//左クリックしたまま動かした場合
  {
   mouseMoved(e);//クリックしてない時と同じ事をさせるため直接呼び出す
  }
  //ここまで
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
 }
さて、新しいタイプのイベントリスナーが追加されたのと、ちょっと下準備が必要なものなので、Base.javaを以下のように変更します。
都合上paint(Graphics g)を先に使ってますが、後で詳しく解説します。
 import java.awt.*;
 
 public class Base extends Frame//GUI本体
 {
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width, height);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   addMouseMotionListener(l);//マウスポインターの動きに応じた処理があるので追加
   setVisible(true);
  }
 
  //Componentから存在し継承されるにつれオーバーライドされてるメソッド。最初にする描画でコンポーネント(今回はフレーム)、ただし今回は描く図形の色指定のみ
  public void paint(Graphics g)
  {
   super.paint(g);//それぞれのコンポーネントによって違うするべきことがあるので必ず親のpaintを呼び出すこと
   g.setColor(new Color(0,0,0));//これから描くものの色を指定する、赤、緑、青の色の強さを0~255で指定
  }
 }
そしてコンパイルして起動してみてください。
マウスポインターを画面の中で動かすと、その軌跡に応じて黒い線が描かれると思います。

所で、現状ポインターがある位置だけ黒い丸を表示したい時は、画面をリセットしてまた描画するようにしないといけません。
Listeners.javaの途中を以下のように変えてください。
 import java.awt.event.*;
 import java.awt.*;
 
 public class Listeners implements WindowListener, KeyListener, MouseMotionListener//MouseMotionListenerを追加
 {
  public void windowClosing(WindowEvent e)
  {
   e.getWindow()
    .dispose();
  }
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;
   Component c = e.getComponent();
   if(c instanceof Window)
    ((Window)c).dispose();
  }
  //ここから
  public void mouseMoved(MouseEvent e)
  {
   Component c = e.getComponent();
   Graphics g = c.getGraphics();
   c.update(g);//ここを追加、何もオーバーライドしない場合は単に描画がリセットされる
   //ちなみに背景色で全体を塗り広げてしまうっていう手もある
   //参考までにGraphics.fillRect(int x, int y, int width, int height)を使えば塗りつぶした長方形を描けるので、g.setColor(Color c)で背景色を指定してから引数(0, 0, 画面の左右の大きさ, 上下の大きさ)でやれる
   //その際はg.setColor(Color c)で後に描画したいものの色を設定しなおす事を忘れずに
 
   g.fillOval
   (
    e.getX() - 15,
    e.getY() - 15,
    30,
    30
   );
  }
  public void mouseDragged(MouseEvent e)
  {
   mouseMoved(e);
  }
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
 }
すると画面がリセット(真っ白になる)された後円が表示されるため、マウスの位置だけ黒い丸が表示されるようになります。
ちなみに、画面外にポインターが出ると最後にポインターがあった場所に丸が残されます。
これはマウスが画面に出たというイベントを拾ってその時の処理をすれば消せます。対応するリスナーはMouseListenerです(今回は割愛)。

さて、先ほど使っていたpaint(g)とupdate(g)、ついでにrepaint()についてやって行きましょう。

paint(g)はコンポーネントが作られて最初に必ず実行されるのと、後はコンポーネントのサイズが変わった時(フレームなら端をドラッグして大きさを変えた時など)などに自動的に実行されます。デフォルトでは特に何もしません。
update(g)は、repaint()をした際、&amp;u(){軽量コンポーネント}で無ければ呼び出されます。デフォルトでは描画をリセットします。
謎のワードが出ましたが...ともかく、どちらも直接使っても問題ありません。gには何かをしたいGraphics、基本的にはそのコンポーネントのGraphics(Component.getGraphics()などで呼び出す)を入れて使います。
そしてrepaint()、&amp;u(){軽量コンポーネント}であればpaint(g)を、そうでなければupdate(g)を呼び出します。それも瞬時ではなく出来るだけ早く(文として読まれた後、呼び出した処理が終わるのを待たずに次の文を読んでしまう)呼び出します。
こちらは他と違いGraphicsの引数が要らない(gには)ので他のコードなどから描画の更新を行わせるのに便利です。

&amp;color(#F54738){&amp;bold(){軽量コンポーネント}}(勉強中)

さて、とりあえずFrameは軽量コンポーネントではないので、Listeners.javaのc.update(g)をc.repaint()に変えても同じように機能するはずです。cのupdate(g)が呼び出されるはずですから。
そしてやってみると...黒丸が表示されません。
沢山動かすと一瞬見えるときもありますが、すぐに消えてしまいます。
何故なら、&amp;color(#F54738){&amp;bold(){repaint()は}}先ほども言った通り&amp;color(#F54738){&amp;bold(){出来るだけ早く呼び出して、その間はその後の文を実行している}}からです。
これがrepaint()の悩ましい部分です。

ならばどうすれば良いか。
というかこれが、ゲームなど描画が常に変化するGraphicsの正しい使い方なのですが、
&amp;u(){任意の方法でrepaint()を繰り返し呼び出し、update(g)にその時描画したい事を全て詰め込む事で、画面の描画をリセットして描画しなおすを繰り返す事が出来ます。}

これを元に、先ほどまで作った、カーソルを黒丸が追いかけるプログラムを改造していきましょう。
Runtime.java
 public class Runtime
 {
  public static void main(String[] args)
  {
   Base b = new Base(&quot;Test&quot;, 400, 300);
   while(b.isDisplayable())//Componentから継承、そのコンポーネントが表示可能かを真偽値に。Window.disposeで消えたら表示不可になりfalseに
   {
    b.repaint();
   }
  }
 }
Base.java
 import java.awt.*;
 
 public class Base extends Frame
 {
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width, height);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   addMouseMotionListener(l);
   setVisible(true);
  }
 
  public void paint(Graphics g)
  {
   super.paint(g);
   g.setColor(new Color(0,0,0));
  }
  //これを追加
  public void update(Graphics g)
  {
   super.update(g);//それぞれのコンポーネントによって違うするべきことがあるので必ず親のupdateを呼び出すこと
   g.fillOval(DeltaData.getMousePositionX() - 15, DeltaData.getMousePositionY() - 15, 30, 30);//今までリスナー側でやってた事
  }
 }
Listeners.java
 import java.awt.event.*;
 import java.awt.*;
 
 public class Listeners implements WindowListener, KeyListener, MouseMotionListener
 {
  public void windowClosing(WindowEvent e)
  {
   e.getWindow()
    .dispose();
  }
  public void keyPressed(KeyEvent e)
  {
   if(e.getKeyCode() != KeyEvent.VK_ESCAPE) return;
   Component c = e.getComponent();
   if(c instanceof Window)
    ((Window)c).dispose();
  }
  public void mouseMoved(MouseEvent e)//ここを変更
  {
   DeltaData.setMousePosition(e.getX(), e.getY());//ポインターが動くごとにイベントオブジェクトからポインターの座標を取得してDeltaDataに送る
  }
  public void mouseDragged(MouseEvent e)
  {
   mouseMoved(e);
  }
  public void keyReleased(KeyEvent e){}
  public void keyTyped(KeyEvent e){}
  public void windowActivated(WindowEvent e){}
  public void windowClosed(WindowEvent e){}
  public void windowDeactivated(WindowEvent e){}
  public void windowDeiconified(WindowEvent e){}
  public void windowIconified(WindowEvent e){}
  public void windowOpened(WindowEvent e){}
 }
DeltaData.java
-新しくその時その時の情報を保存するクラスを追加
--典型的なカプセル化もやってるので参考になれば...必要ではありません
 public class DeltaData
 {
  private static int mousePositionX;//マウスポインターのウィンドウ内のx座標
  private static int mousePositionY;//マウスポインターのウィンドウ内のy座標
 
  public static int getMousePositionX(){return mousePositionX;}
  public static int getMousePositionY(){return mousePositionY;}
  public static void setMousePosition(int x, int y)
  {
   mousePositionX = x;
   mousePositionY = y;
  }
 }
これらをまとめてコンパイルして実行しましょう。すると...
ちょっと描画がおかしくなると思います。
具体的には、黒丸が上側ちょっとだけ表示されたり、一瞬だけそれ以外が見えたりといった感じになると思います。
一言で言えばちらつきというもので、これは対策しないと起こりうるよくある現象です。

というのも、Base.javaのpublic void update(Graphics g)の中では、フレームのGraphicsを直接弄ってます。
Javaの仕様上上から文を実行するのはすでに承知の上だと思いますが、Graphicsの変化はリアルタイムで行われています。
一方上記のメソッドでは、Graphicsをリセット→Graphicsに、取得してあるマウスポインターの位置情報を元にした位置に黒丸を描画という2つの処理を交互に繰り返しています。
つまり、画面に表示されているのはメソッドでGraphicsを処理している過程だったのです。黒丸が欠けるのは、リセットして黒丸を描画する途中だったり、その逆だったりしているからです。

前までちらつきが起きなかったのは、マウスが動いたというイベントが起きるごとだったので、一度に沢山ポインターの座標が変わらなければ(素早く動かさなければ)限りは過程を無限に見させられる事は無かったのですが、
今回はrepaint()を出来るだけ早く繰り返しているので、常に過程を見させられている状態だったという訳です。

これを解消するために、下記のダブルバッファリングという技法を使います。
*AWTをさらに使いこなす
**ダブルバッファリングとイメージ(Image)
これは、次に表示したい描画を別のものに描き、それを表示させたいコンポーネント(ウィンドウなど)のGraphicsに描画させるという方法で、Graphicsに1つの描画処理だけを行わせる事によりちらつきを無くすという方法です。
Graphicsにはcreate()というコピーを作るメソッドがありますが、Graphicsには、何かしらのコンポーネントに繋がりを必ず持っているので、update(Graphics g)でgのコピーを作ってそれを弄っても画面の変化が起きてしまいます。
例えば、Base.javaをこう変えても同じような感じの実行結果になります。
 import java.awt.*;
 
 public class Base extends Frame
 {
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width, height);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   addMouseMotionListener(l);
   setVisible(true);
  }
 
  public void paint(Graphics g)
  {
   super.paint(g);
   g.setColor(new Color(0,0,0));
  }
  //これを変更
  public void update(Graphics g)
  {
   newG = g.create();//Graphics.create()はクローンを作るメソッド
   super.update(newG);
   newG.fillOval(DeltaData.getMousePositionX() - 15, DeltaData.getMousePositionY() - 15, 30, 30);//クローンを弄っただけなのにフレームに描画処理がされる、クローンもこのフレームを参照しているため
  }
 }

そこで使うのがイメージ(Image)です。Graphicsとの違いを言えば、Imageは絵そのもの(の内容)で、Graphicsは紙(コンポーネント)に描かれて展示されている(画面に表示している)絵といった所でしょうか。
Component.createImage(int width, int height)の説明にも、ダブル・バッファリングのためにイメージを作成するって感じで書いてあります。
公式が言うのですからこちらも使っていきましょう。
ImageのURL:https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Image.html

では、実際に使ってみましょう。Base.javaを以下のように変更してください。
 import java.awt.*;
 
 public class Base extends Frame
 {
  private Image tempImage;//ダブルバッファリング用の一時的イメージ、フィールドにする事でメモリ消費などを節約
  private Graphics temp;//イメージをGraphics型にしたもの、イメージに対しGraphicsの描画メソッドを行うため
 
  public Base(String name, int width, int height)
  {
   super(name);
   setSize(width, height);
   Listeners l = new Listeners();
   addWindowListener(l);
   addKeyListener(l);
   addMouseMotionListener(l);
   setVisible(true);
   //tempImage = createImage(width, height);
   //temp = tempImage.getGraphics();
   //Component.createImage
  }
 
  public void paint(Graphics g)//画面のサイズが変更された場合にも読み込まれるのでその都度Imageの大きさが変わる、コンストラクタなどで一度きりだと画面を大きくした際元の画面の大きさ分しか描画されない
  {
   Dimension size = getSize();//フレームのサイズをjava.awt.Demention型で取得
   tempImage = createImage((int)size.getWidth(), (int)size.getHeight());//Double値で取得してしまうのでキャスト
   temp = tempImage.getGraphics();//一時的イメージをGraphicsの描画メソッドで描画するためImageをGraphicsに変化させる(取得するってよりそんな感じ)
   super.paint(g);
   g.setColor(new Color(0,0,0));
  }
  public void update(Graphics g)
  {
   super.update(temp);//コンポーネントから継承されるたびに追加された描画更新の内容を一時的イメージに適応
   temp.fillOval(DeltaData.getMousePositionX() - 15, DeltaData.getMousePositionY() - 15, 30, 30);//一時的イメージに描画
   g.drawImage(tempImage, 0, 0, this);//一時的イメージをフレームのGraphicsに描画させることで画面を更新
  }
 }
そしてコンパイルして実行すると...やっと思い通りにポインターの位置に黒丸が常に表示されるようになったと思います。

所で、repaint()を無限に呼び出すだけでもメモリを多く使用します(この項の前までのプログラムでも、こちらの環境では100MBぐらい使う)。
そしてダブルバッファリングを行う事で、こちらはもっと多く使います(このプログラムで、こちらの環境では400MB以上)。
Runtime.javaの繰り返しにの部分に、java.lang.Thread.sleep(long millis)((InterruptedExceptionを投げるので注意、catchの内容は空でOK))を入れてみると良いでしょう。そもそも描画を繰り返す方法は他にもありますが...
数字を大きくするとメモリの消費が抑えられますが、画面の更新頻度が減るのでカク付きます。

さて、Imageには他にも別の使い方が存在します。
(編集中)

**コンポーネントをコンテナに追加、そしてレイアウト(Layout)    </description>
    <dc:date>2021-06-02T19:57:47+09:00</dc:date>
    <utime>1622631467</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/3.html">
    <title>右メニュー</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/3.html</link>
    <description>
      **更新履歴
#recent(20)

**カウンター
現在:&amp;online()
今日:&amp;counter(today)
昨日:&amp;counter(yesterday)
累計:&amp;counter()    </description>
    <dc:date>2016-03-12T16:14:57+09:00</dc:date>
    <utime>1457766897</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/17.html">
    <title>雑談</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/17.html</link>
    <description>
      *このページについて
一応掲示板作りました、種類が増えるかどうかは分からないです・・・
*ルール等
・荒らしはこちらで消去しますのでスルーでお願いします。スルーして止まない場合はこちらでアク禁等処置を行います。
・暴言等は避けてください。それに付け込む事も避けてください。
・その他マナーは守ってください、できるだけで構いませんから。
*掲示板
#comment_num    </description>
    <dc:date>2016-03-12T16:14:15+09:00</dc:date>
    <utime>1457766855</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/2.html">
    <title>メニュー</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/2.html</link>
    <description>
      **コンテンツ
[[Java独学ノート]]
自作ゲーム
・これまで
・[[これから]]

**掲示板
[[雑談]]    </description>
    <dc:date>2016-03-12T16:05:45+09:00</dc:date>
    <utime>1457766345</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/longwoodbow/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/longwoodbow/pages/1.html</link>
    <description>
      *概要
このWiki、[[Stick WarのWiki&gt;http://www53.atwiki.jp/stickwarjp/]](ステマ)を作るときに設定を間違えてどうしようかと思ってたので自分流のJavaのやり方や作った/将来作ろうと思ってるゲームについて記載する事にしました。
来る人なんてそういないと思いますが、楽しんでいただけたら光栄です。
//自分が作ろうとしている(というか作りたい)ゲームの情報をここに記録するつもり
//間違えて作ったWikiだけど気にせず・・・
//2013年1月12日に書いてあった概要11日新規作成
*To Do
まずこれからどうするかを考えないといけないですね・・・    </description>
    <dc:date>2016-03-12T16:02:33+09:00</dc:date>
    <utime>1457766153</utime>
  </item>
  </rdf:RDF>
