Java Silverに向けて【学習メモ】

何かの資格を取ろうということで、Java Silverの取得を目指す。
ここには、独学で勉強した際の記録

# Javaの基礎
## 変数の命名
使用できる文字
ただし、数字は2文字目以降で使用可能

* アルファベット（a-zA-Z）
* 数字（0-9）
* アンダースコア（_）
* ダラー（$）

## プリミティブ型（基本データ型）と参照型
### プリミティブ型（基本データ型） 
| 型 | 初期値 | ラッパークラス |
|:--|:--|:--|
| boolean | false | Boolean |
| char | '\u0000'（空文字） | Character |
| byte | 0 | Byte |
| short | 0 | Short |
| int | 0 | Integer |
| long | 0 | Long |
| float | 0.0f | Float |
| double | 0.0d | Double |

### 参照型
プリミティブ型（基本データ型）以外の型すべて
例えば、オブジェクト型、列挙型、配列型がある。
また、初期値として「**null**」が指定される。

* String
* Date
* Integer
* ArrayList
* ...


## double型の 0 除算
* dublbe > 0 の場合、「Infinity」
* dublbe = 0 の場合、「NaN」
* dublbe < 0 の場合、「-Infinity」

## 開始メソッドmain()について
**String配列型**の引数を１つ定義する必要がある
可変長引数（String... v）は配列と同等の扱いになる

```java:sample.java
public static void main(String args[]) {}
public static void main(String[] argv) {}
public static void main(String... v) {}

// 実行時エラーになる
public void main(String args[]) {}
```

## 配列
### 配列の宣言
配列の宣言には2つの表記があり、どちらでも構わない
また多次元配列の場合、併用も可能

```java:sample.java
// 表記1
int[] num;
// 表記2
int num[];

// 多次元：表記1
int[][] num;
// 多次元：表記2
int num[][];
// 多次元：表記1と表記2の併用
int[] num[];
```

### 配列の生成
配列変数を宣言し、配列を生成せずに値設定処理を記述した場合は、コンパイルエラー

```java:sample.java
int[] num;
// → エラーになる
num[0] = 111;
```

### ArrayListクラス
java.utilパッケージ配下のため、import文が必要
左辺と右辺の「<>」のデータ型を合わせる必要がある
「<>」のデータ型として指定できるのは、**参照型**のみ

```java:sample.java
// OK
ArrayList<Integer> array = new ArrayList<Integer>();
ArrayList array = new ArrayList();
ArrayList<Integer> array = new ArrayList<>(); // ダイヤモンド演算子
ArrayList<Integer> array = new ArrayList<Integer>(10); // 初期サイズ10のリストを生成

// コンパイルエラー
ArrayList<int> array = new ArrayList<int>(); //基本データ型たのため
ArrayList<String> array = new ArrayList<Integer>(); // 右辺と左辺のデータ型が異なるため
ArrayList<Integer> array = new ArrayList<String>(); // 右辺と左辺のデータ型が異なるため
```

## クラス変数、インスタンス変数
* クラス変数
1つのクラスで1つ作成され、すべてのオブジェクトで共有される

* インスタンス変数
作成されたオブジェクト毎に作成され、オブジェクト毎に異なる


```java:sample.java
class Hoge {
  // クラス変数
  private static int v1;
  // インスタンス変数 
  private int v2;
}
```

## 演算子
// ToDo 表示自分で起こしたい
http://www.kusa.ac.jp/~kajiura/java/console/operators.htm

## オーバーライドとオーバーロード
* オーバーライド
親クラスのメソッドを子クラスで再定義すること、子クラス上で親クラスのメソッドを上書きすること

* オーバーロード
同じメソッド名、戻り値の型で**引数の数、型が異なる**メソッドを複数定義すること

# 継承
## abstractクラス、interfaceクラス
* abstractクラス
extendsキーワードで継承する
抽象メソッドは、抽象クラス内でしか定義できない

* intarefaceクラス
インスタンス化できない
implementsキーワードで実装する
インターフェイスを実装したクラスは、インターフェイスで定義されたメソッドをすべてオーバーライドする必要がある。
オーバーライドしない場合は、そのクラスを抽象クラスで定義する必要がある

# 例外処理
## 例外クラス
Object
┗ Throwable
　　┠ Error
　　┗ Exception　---------------------　checked例外（検査例外）
　　　　┗ RuntimeException　-------　unchecked例外（非検査例外）


## checked例外（検査例外）
例外処理：**必須**

* Errorクラス及びそのサブクラス
* RuntimeExceptionクラス以外のExceptionのサブクラス

### Errorクラスのサブクラス例
* StackOverflowError
* NoClassDefFoundError

### RuntimeExceptionクラス以外のExceptionのサブクラス例
* IOException
* FileNotFoundException 

## unchecked例外（非検査例外）
例外処理：**任意**

* RuntimeExceptionクラス及び、そのサブクラス

### RuntimeExceptionクラスのサブクラス例
* ArrayIndexOutOfBoundException
* NullPointerException

# 制御処理（条件分岐、繰り返し）
## if文
処理分が1文の場合のみ、「{ }」は省略可能

## for文
初期化文と更新文は複数記述可能かつ省略可能
ただし、条件文は１つのみ記述可能
各文は省略できるが、「**;**」は必須
処理分が1文の場合のみ、「{ }」は省略可能

```java:sample.java
for(初期化文; 条件文; 更新文) { }

// 各文を省略
for(;;) { }
```

## while文
処理分が1文の場合のみ、「{ }」は省略可能

## do-while文
処理分が1文の場合のみ、「{ }」は省略可能


## switch文
switch文の式には、下記のデータ型のみが利用できる
また、基本データ型については、そのラッパークラスも利用可能

* byte
* char
* short
* int
* enum
* String

## continue文、break文
* continue文
continue文以降の処理実行せず、次の繰返し処理を継続実行する

* break文
実行中の繰り返し処理を抜ける