【Java Silver】Java Silver SE11 試験対策メモ

# このメモの使い方
**対象：Java Silver SE11受験予定の方**
Java Silverに合格したので、その過程でまとめたノートを公開します。
「黒本」に沿った構成にしています。このノートに書いてあることをマスターすれば合格できると思います。
試験で覚える必要がある箇所や、間違えやすいJavaのルールをまとめてありますので、ご活用ください。

# 第１章 簡単なJavaプログラムの作成
### ◆javaコマンド
・**書き方**：**java 完全修飾クラス名 [引数、引数、・・・]**
※完全修飾名とは、「java.lang.String」のような正式名のこと。「String」クラスは、単純名と呼ぶ。

・引数は、スペースで区切って列挙する。

・ **¥"** ＝「”」と１引数として出力される。

・**コマンドの種類**
①**実行コマンド：**java ファイル名（.javaなどの拡張子は不要）/java ファイル名.java（拡張子をつけることでコンパイルが不要になる）
②**コンパイルコマンド**：javac ファイル名.java（拡張子必要）
③**モジュールコマンド：** jmod

・**javaコマンド実行時の動作：**
　①JVMを起動
　②指定されたクラスをクラスパスから探し出してロードする
　③String型オブジェクトを作成し、起動パラメータ（引数）を格納する
　④起動パラメータ（引数）を保持したString配列型オブジェクトへの参照を引数に渡してメソッドを実行

### ◆整数リテラル
・**整数リテラルの種類：** 整数値（**int型**）、文字（**char型**）、浮動小数点数（**double型**）、真偽値（**boolean型**）の４つ。

・リテラルを他のデータ型であると明示したい時は、**long型は「L」「l」、float型は「F」「f」**　といった接尾辞を値の後ろにつける。

・**各進数の接頭辞**
①**2進数：「0b」を接頭辞としてつける。**　例えば10進数の「63」は「0b0111111」と表現。
②**8進数：「0」を接頭辞としてつける。**　例えば10進数の「63」は「077」と表現。
③**16進数：「0x」を接頭辞としてつける。**　例えば10進数の「63」は「0x3F」と表現。

・**「_」アンダースコア：**桁数の多い数値リテラルを見やすくする。リテラルの**先頭＆末尾**と**記号の前後**には記述できない（記号例：「.」「L」「F」「0b」「0x」 ）。それ以外であれば出現する場所、回数は自由。

### ◆識別子
・**命名規則**:
　①予約語（abstract, if, intなど）を識別子として使えない
　②記号は「_」と通貨記号＄のみ使える
　③数字から始められない

# 第２章 Javaの基本データ型と文字列操作
### ◆型変換
・型変換には２種類ある。
**①暗黙の型変換**：キャスト式が必要ではない。小さいデータ型を、大きいデータ型に入れる。
**②明示的な型変換**：キャスト式が必要。大きいデータ型を、小さいデータ型に入れる。

・**型の大きさ順**
**(小) byte→short→int→long→float→double (大)**
**char型＝int,long,float,doubleに自動変換される。**

### ◆var
・**ローカル変数**のみに使える。
・**使えない：** フィールドの宣言、引数の型宣言、ラムダ式、配列の初期化式、null

### ◆Stringクラス
・Stringは**不変（immutable）** なオブジェクト。文字列を変更するには、新しくインスタンスを作る。

**【Stringクラスの主なメソッド】**
■**indexOfメソッド**：検索したが一致しない場合、-1を返す。引数と一致した場合、その開始位置を返す。
■**replaceメソッド**：先頭から最後まで一致するものを全て置き換えていく。
■**replaceAllメソッド**：置換した結果の文字列を持った新しいStringインスタンスを作り、そのインスタンスへの参照を戻す。
■**lengthメソッド**：文字数（半角、全角関係なく）
■**concatメソッド**：文字を連結させる。

# 第３章 演算子と判定構造
### ◆equalsメソッド
・Objectクラスに属する、**オーバーライド**して**同値性**を確認するメソッド。**オーバーライドせず**使用した場合は、同値性ではなく**同一性**を確認する。

```java:Objectクラスのequalsメソッドの定義
public boolean equals(Object obj){  
         return(this == obj);
}
```
・**同値性（オーバーライド時）：** 異なる参照を持つインスタンスだが、持っている値が同じである性質のこと。
・**同一性（オーバーロード時）：** 異なる参照を持っているかを確認する。異なる場合、falseを返す。


・引数に**null**が入った時は、必ず**false**を返す。

### ◆internメソッド
・文字列がコンスタントプールにあるか確認し、すでにあればその文字列を返す（再利用）。なければその文字列を追加する。

### ◆if文
・{}が省略できる。省略した場合、**最初の一文のみがif文内の処理**とみなされる。

```java:{}を省略
if(a<10)
//{
system.out.print("true") //←この文だけif文の処理とみなされる
//}
system.out.print("false")
```

・条件文に合致し処理内容が実行されたら、その後の条件文は実行されない。

### ◆switch文
・**case値のルール**
　①switch文の引数にある値と、同じ型/互換性がある型であること。
　②定数（final宣言された変数）か、リテラルであるか
　③nullでないこと。

```java:ケース値のルールを確認する
final int NUM = 0;
int num = 0;

switch(num){
    case "10":    System.out.print("A");  //引数numはint型であるが、
                  break;                  //"10"はString型なのでコンパイルエラー

    case num:     System.out.print("B");  //numはfinal宣言されてないのでコンパイルエラー
                  break;
           }
```

・```default```は、どれにも当てはまらないときに実行される。

・```null```を引数に渡すと、```NullPointerException```がスローされる。

#第４章 制御構造
### ◆while文
・**{}を省略する時の注意点**：```do{処理}```の処理は、一文しか書けない。２つ以上書くとコンパイルエラーになる。

```java:{}省略時は、do{}内の処理文は１文まで
int cnt = 0;
do
   system.out.println("A");
   system.out.println("B");  //中かっこを省略し２つの分を記述しているのでコンパイルエラー
while (cnt++<5);
```

### ◆for文
・**初期化子と更新文は複数記述できる**。

・**初期化子は同じ型**でないといけない。２つ目の初期化子からは、型名を書かなくて良い。

・**条件式は１つしか記述できない。** 複数記述するとコンパイルエラー。

```java:条件式は１つまで
for(int i=0, j=2; i<10; i++, j++){
           //処理
  }

◆条件式を複数記述したいときは[[論理演算子]]を使う
for(int i=0, j=2; i<10 && j<10; i++, j++){
          //処理
  }
```

・更新文は繰り返し処理が終わったときに実行される。

・for文内で宣言した変数は、**for文内のみ**で有効。

・```continue```以降に何か処理を書くと、到達不可能コードとしてコンパイルエラーが出る。

# 第５章 配列の操作
### ◆配列
```java:配列　宣言の仕方
//データ型[] 配列変数名
int[] num;

//または
//データ型 配列変数名[]
int num[];
```

```java:配列　サイズを指定して配列を作成
//配列変数名 = new データ型[要素数]
int[] num = new int[5];
//または
int[] num;
num = new int[5];
```

```java:配列　初期化
//データ型 配列変数名 = {配列に入れる値}
int[] num = { 1, 2, 3, 4, 5};
```
・配列のインスタンスを生成すると、値が入ってなくても自動的に0, nullなど型に合わせて**デフォルト値で初期化**される。**（int型→0 Integer型→null double型→0.0 boolean→false String型→¥u0000）**

・次のようにも記述可能。```int[] e[]```

・「int[ ] a = new int[0] 」のように、要素数が０の場合、**ハッシュコード**が表示される。

・**継承関係**：スーパークラス型の配列型変数で、サブクラスのインスタンスの集合を扱える。

```java:配列における継承関係
public interface A{}
public class B implements A{}

public class Main{
     public static void main(String[] args){
             A[] array = new B[]{new B(), new B()};
  }
}
```

・**無名配列**：大かっこ```[]```の中に数字は入れられない。

```java:無名配列の宣言
//[]の中に数字は入れない。
int[] array = new int[] {}

//誤った記述例
int[] array = new int[5] {}
```
# 第６章 インスタンスとメソッド
### ◆Staticなフィールド
・staticで修飾されたフィールドやメソッドは、**static領域**と呼ばれる領域に配置される。

・**staticなフィールドへのアクセス**
①「クラス名.フィールド名」 （例）```Sample.num = 10;```
②通常通りにインスタンス生成、「参照.フィールド名」でアクセス。

```java:staticなフィールドへのアクセス②
Sample s = new Sample();
s.num = 10;
```
・クラス単位で管理される。＝**クラスから作られた全てのインスタンスで共有される。**

・staticなフィールドは、**インスタンスを生成しなくても使える。**

・staticなメソッドは、**staticなメンバ（staticで修飾されたフィールドやメソッド）にしかアクセスできない。**（反対に、staticでないメソッドから、staticなメンバにはアクセス可能）

### ◆ローカル変数
・初期化されていないローカル変数を参照すると、コンパイルエラー。
・```final```をつけて宣言できる。

### ◆this
・ローカル変数(メソッド内で定義した変数)より、**フィールド変数**（メソッド外で定義するクラス変数）を優先したい時に用いる。

### ◆インスタンス
・ダブルクオテーションで文字リテラルを囲うことでも、インスタンスの生成ができる。（例：```String="sample";```）

### ◆メソッドの呼び出し
・戻り値がvoid（つまり、何も値を戻さない）の場合、戻り値を受け取るような代入式を記述するとコンパイルエラー。

```java:例
class Sample{
    public void hello(){
          system.out.println("hello");
  }
}

public class Main{
      public static void main(String[] args){
          Sample s = new Sample();
          String a = s.hello();  //戻り値がvoid型のメソッドを代入して、
                                 //sで値を受け取ろうとしているのでコンパイルエラー
          s.hello(); //ただメソッドを呼び出すだけで何も受け取らないのでエラーにならない
  }
}
```

### ◆return文
・**機能①**：呼び出し元のメソッドに値を戻す。
・**機能②**：呼び出しもとに制御を戻す。メソッドの処理を強制終了し、呼出し元のメソッドに戻る。

・return文の後ろの処理は実行不可能。return文の後ろに何らかの処理をするコードを記述すると、コンパイルエラー。

### ◆オーバーロード
・**オーバーロードのルール：** シグニチャ（引数の数や型、順番）が異なること。**アクセス修飾子の違いは関係ない。**

・戻り値型だけが異なるメソッドは、オーバーロードとみなされず、同じメソッドが重複して存在するとして、コンパイルエラーになる。

＜正しくオーバーロードされていない例＞
```int calc(double a, int b){処理内容}```をオーバーロードしたい。
→```double calc(double a, int b){処理内容}```：戻り値が異なるだけで、オーバーロードされていない。

### ◆コンストラクタ
・別のコンストラクタを呼び出すときは、```this```を使う。最初に記述しないとコンパイルエラー。

・コンストラクタは、インスタンス生成時にしか呼び出せない。

・```void```など戻り値型がついていたら、コンストラクタではない。

・```extends```等で継承しても、**サブクラスには引き継がれない。**

・コンストラクタを修飾する**アクセス修飾子に制限はない。**

・**コンストラクタチェイン**：サブクラスをコンパイルすると、サブクラスのコンストラクタにはスーパークラスのコンストラクタを呼び出す```super();```が追加される。

```java:コンストラクタチェイン（例）
public class B extends A{
  B(){
      this(4);
      System.out.print("3");
   }
  B(int b){
      super(); //←コンパイルして追加されたスーパークラスAの呼び出し
      System.out.print(b);
}
```

### ◆final
・finalで修飾された変数は定数であり、変更できない。
・変更するためには、コンストラクタで値を初期化する必要がある。

```java:コンストラクタで定数を初期化する
public class Sample{
   private final int num;     //定数の宣言
   pibliv Sample() {}         //コンストラクタ内で定数を初期化していないのでコンパイルエラー
   public Sample(int num){
       this.num = num;        //コンストラクタ内で定数を初期化している
   }
}
```


### ◆可変長引数
・**自由に数を変更**できる引数のこと。
・引数の型の直後にピリオド３つを付けて宣言する。

```java
void sample(int... num){
       //do something
}
```

・注意点：
　①**異なる型はまとめられない。**
　②可変長引数以外の型も引数に含める場合、**可変長引数は最後に書く。**

# 第７章 クラスの継承、インターフェース、抽象クラス
### ◆インターフェース
**【基本的なルール】**
・インターフェースを継承した具象クラスは、抽象メソッドを具象メソッドに書き換えなければいけない。
・インターフェースで実装する**抽象メソッド**は、自動的に**アクセス修飾子がpublic**になる。
・**インスタンス化できない**
・インターフェースを継承したクラスでは、メソッドをオーバーライドするときに**public以外のアクセス修飾子へ変更できない。**>>p.522
・**定数フィールド（static, final）** しか定義できない。

**【その他のルール】**
・**defaultメソッド**：defaultメソッドを使うと、メソッドの処理内容が書ける。インターフェースを継承したクラスは、オーバーライトせずにメソッドを使える。
・抽象メソッドをオーバーライドした抽象メソッドでは、**戻り値の型を変更できる。**（この場合の型は、スーパーメソッドで指定されている型のサブクラス型でなければならない。＝ **「共変戻り値」** ）>>p.523
・**デフォルトメソッドとstaticメソッド**として実装を定義できる。

### ◆抽象クラス
・**抽象メソッド**と**具象メソッド**が書ける。
・抽象メソッドには、**必ずabstractをつけ、中身を書いてはいけない。**
・抽象メソッドはオーバーライドされる前提なので、private以外のアクセス修飾子であれば自由に設定できる。
・抽象クラスを継承したサブクラスでは、抽象メソッドを**オーバーライド**しなければならない。
・**インスタンス化できない。**
・抽象クラスを継承した抽象クラスを定義できる。

### ◆オーバーライド
・**オーバーライドのルール：**
　■シグネチャ（メソッド名、引数の型、引数の数、順番）が同じであること。
　■戻り値型は同じ型か、サブクラス型であること。
　■アクセス修飾子は同じか、より緩くするここと。
　■throwsで宣言する例外は、スローする例外と同じ型かサブクラス型であること。

### ◆ポリモーフィズム
・同じ名前のメソッドなのにあるクラスでの振る舞いと別のクラスの振る舞いで違う動きをする

# 第９章 API
### ◆Map
・キーとバリューの組み合わせで管理するコレクション。表のようなイメージ。
・**keyメソッド**：キーを取り出す。
・**valueメソッド**：バリューを取り出す。

### ◆ArrayList
・**スレッドセーフではない**

### ◆compareメソッド
・２つの配列を辞書順に並べた時の、並び順を比較する。
・２つの配列が**等しい**場合：０を返す。
・第１引数が第２引数よりも辞書順で**先**の場合：-１を返す。
・第１引数が第２引数よりも辞書順で**後**の場合：１を返す。

### ◆Mathクラス
・**Math.pow**：累乗した値を取得する。例）Math.pow(2,3); → 2の3乗＝8
・**Math.sqrt**：引数の平方根をdouble型で取得する。例）Math.sqrt(16); →4.0（double型なので小数点まで表示される）
・**Math.round**：引数を小数点第一位で四捨五入し、整数にする。

### ◆stringBuilderクラス
・デフォルトで16文字分のバッファを余分に持っている。
　例："abcde"という文字列を、stringBuilderクラスのcapacity()メソッドでキャパを調べると、16+5＝21になる。

# 第１０章 例外処理
### ◆例外処理

```java:try-catch文の書き方
try {
    例外が発生する可能性のある処理
} catch (例外の型 引数) {
    例外が発生した場合の処理(例外が発生しなければ行われない処理)
} finally {
    例外の有無に関わらず、最後に必ず実行される処理
}
```
・例外処理が実行される順番：①closeメソッド →　②catchブロック　→　③finallyブロック
・**catch文を複数書くときの注意**：先にサブクラスの例外を書く。スーパークラスを先に書くと、**コンパイルエラー。**
・**throw**:意図的に例外を発生させたいときに、処理内容に書く。
・**throws**:検査例外をスローするメソッドに書かなければいけない。mainメソッドでcatchする場合は、このthrowsを用いて宣言するか、Exceptionをcatchの引数に(```catch(Exception）```)記入しなければならない。
・複数のtry-catchがネストしている場合、スローされた例外を受け取るのは、その例外に対応した最も近いcatchブロック。
・tryブロックで宣言した変数の有効範囲は、**tryブロック内のみ。**
・**非検査例外**：RuntimeExceptionとそのサブクラス。throwsで宣言しなくて良い。
・return文が最後にあったら、finally→catchの順に出力される。
・戻り値が入る箱は１つしかないので、最後にreturn文で返された戻り値が、最終的な値になる。

### ◆主な例外の種類
・**NullPointerException**：配列に値が入ってない時に呼び出そうとするとスローされる。system.out.print()で表示される分にはスローされない。
・**IndexOutOfBoundsException**：ArrayIndexOutOfBoundsExceptionやStringIndexOutOfBoundsExceptionのスーパークラス。
・**ClassCastException**：あるオブジェクトを継承関係にないクラスにキャストしようとしたことを示すためにスローされる。
・**ConcurrentModificationException**：オブジェクトの並行変更を検出したメソッドによって、そのような変更が許可されていない場合にスローされる。例えば、あるスレッドで配列の値を順に取り出しているときに、もう１つのスレッドで配列の値を変更しようとしたときなど。
・**UnsupportedOperationException**：変更不可なコレクションに、変更が行われた場合。（```list.of```で作られた配列が変更されたときなど）

# 第１１章 モジュールシステム
**【コマンドの種類】**
```java --describe-module```　```jmod describe```：モジュールの設定情報を調べる
```jdeps --list-deps``` ```java --show-module-resolution```：クラスやモジュールの依存関係を調べる