Study Java Silver 1

Java Silver[^1]の取得が必要になったので勉強がてらまとめていくことにする。
[^1]: 使用したのはオラクル認定資格教科書 Javaプログラマ Silver SE 8
 https://www.shoeisha.co.jp/book/detail/9784798142739
#main()メソッド
Javaでは必ずmain()メソッドから処理が実行される。

```Sample.java
public static void main(String[] args) {}
```
#####NGパターン（コンパイルエラー）
1. `public static void main(string[] args) {}` string[]のsは大文字
2. `public static main(String[] args) {}` voidがない
3. `public static void main(String[] ) {}` argsがない

#####NGパターン（実行時エラー）
1. `public static void main(String args) {}` Stringの後ろに[]がない
2. `public void main(String[] args) {}` staticがない
3. `public static void Main(String[] args) {}` MainのMは小文字

#ソースファイルとクラスファイル
public指定のクラスは1つのソースファイルにつき１つだけ。
public指定のクラスを定義した場合はソースファイル名はpublic指定したクラス名と同じにする。
#####OKパターン
```Test.java
class Foo {}
class Bar {}
```
```Foo.java
public class Foo {}
class Bar
```
#####NGパターン
```Foo.java
//一つのソースファイルにpublic classが2つある
public class Foo {}
public class Bar {}
```
```Bar.java
//ソースファイル名がpublic指定のclass名と違う
public class Foo {}
class Bar {}
```
#コメント
コメントはプログラムをわかりやすくするためのもの。
コンパイルの対象にならない。

```
// 行末までがコメントになる
/* 複数行のコメントが指定できる */
/** 複数行のコメントが指定できる。javadocコマンドでコメントをHTML化できる。（ドキュメントコメント） */
```
#リテラル
ソースコードに書き込んだ値や表記のこと。
主に6種類ある。
#####1. 整数リテラル
小数部を持たない値。
10進数、2進数、8進数、16進数で表現できる。

|進数|例|説明|
|:---|:---|:---|
|10進数|255|0から9までの数字を使用して表現する|
|2進数|0b101|0と1の数字を使用して表現する<br>先頭に0bを入れると2進数と判断される|
|8進数|0377|0から7までの数字を使用して表現する<br>先頭に0を入れると8進数と判断される|
|16進数|0xff|0から9までの数字とaからfまでのアルファベットで表現する<br>先頭に0xを入れると16進数と判断される|
#####2. 浮動小数点数リテラル
小数部を持つ値。
１０進数、指数を表現できる。

|進数|例|説明|
|:---|:---|:---|
|10進数|12.33|-|
|指数|3e4|3.0 × 10の4乗(30000.0)<br>指数を表すeを使う|
#####3. 文字リテラル
1つの文字を表現する。
文字は「'」(シングルクォート)で囲む。
「\」(バックスラッシュ)でエスケープシーケンスを表現することもできる。

*文字リテラルとUnicode*

||例|説明|
|:---|:---|:---|
|1文字|'A'|1つの文字をシングルクォートで囲む|
|Unicode|'\u3012'|\uの後ろに4桁の16進数を指定するとUnicode値になる|

*Unicode以外の主なエスケープシーケンス*

|エスケープシーケンス|意味|
|:---:|:---|
|\n|改行|
|\r|復帰|
|\t|タブ文字|
|\b|バックスペース|
|\'|シングルクォート|
|\"|ダブルクォート|
|\\\|バックスラッシュ|
|\f|フォームフィード|

#####4. 文字列リテラル
複数文字の集合体である文字列を表現する。
文字列は「"」(ダブルクォート)で囲む。

#####5. 論理値リテラル
真偽値をtrueかfalseで表現する。

#####6. nullリテラル
参照型データを利用する際に「何も参照していない」という意味を表現する。

####アンダースコアがある数値リテラル
Java SE 7以降より数字の途中に「_」(アンダースコア)を使用できる。
数値リテラルの可読性を高めるもので「100,000」を「100\_000」のように表現できる。
アンダースコアの使用には以下のルールがある。
> ・リテラルの先頭、末尾には使用できない。
 ・浮動小数点リテラルにある小数点の前後には使用できない。
 ・float値を表現するFおよびlong値を表現するLの前には使用できない。
 ・16進数で使用する0xと2進数で使用する0bの途中および前後には使用できない。
まとめるとリテラルの先頭、末尾および記号の前後には使用できない。

#変数や定数の宣言と初期化
#####変数
データを入れる箱。
変数には名前(**変数名**)をつけて他の箱と区別する。

変数やクラス、メソッドにつける名前は識別子と呼ばれる。
識別子には以下のルールがある。
>・識別子の1文字目は英字、ドル記号、アンダースコアのみ
・識別子の2文字目以降は数字も使用可
・予約語は使用不可
・大文字小文字は区別される
・文字数制限はない

予約語とはJavaですでに使用されている名前のことで以下のものがある。

|予約語(null, true, falseは予約語ではないがリテラルとして扱われるため使用不可)|
|:---|
|abstract, assert, boolean, break, type, byte, case|
|catch, char, class, const, continue, default|
|do, double, else, enum, extends, final|
|finally, float, for, goto, if, implements|
|import, instanceof, int, interface, long, native|
|new, package, private, protected, public, return|
|short, static, strictfp, super, switch, syncronized|
|this, throw, throws, transient, try, void|
|volatile, while, null, true, false|

#####データ型
変数を用意する場合にどのような値を入れるかをデータ型で指定する。
Javaのデータ型は主に基本データ型と参照型に大別できる。
>基本データ型：整数や文字など
参照型：クラス、配列、インターフェース等を含む基本データ型以外の型

基本データ型には以下の8種類がある。

|データ型|意味|サイズ|表現できる値|
|:---|:---|:---|:---|
|byte型|符号付き整数|8ビット|$-2^7$ 〜 $2^7$ - 1 (-128 - 127)|
|short型|符号付き整数|16ビット|$-2^{15}$ 〜 $2^{15}$ - 1 (-32768 - 32767)|
|int型|符号付き整数|32ビット|$-2^{31}$ 〜 $-2^{31}$ - 1|
|long型|符号付き整数|64ビット|$-2^{63}$ 〜 $-2^{63}$ - 1|
|float型|浮動小数点数|32ビット|IEEE754にもとづく値|
|double型|浮動小数点数|64ビット|IEEE754にもとづく値|
|char型|Unicodeで表現できる1文字|16ビット|\u0000 〜 \uFFFF|
|boolean型|真偽値|1ビット|true, false|

#####変数宣言と代入
変数宣言：変数を用意すること

```
データ型 変数名; //変数宣言
```
代入：変数に値を格納すること

```
変数名 = 値; //変数に値を代入
```

変数の初期化：変数を使い始める前に初期値を代入しておくこと
変数宣言と代入は1行で記述することもできる。

```
データ型 変数名 = 値; //変数宣言と代入を同時に行う
```
long型の変数にlong値を入れる場合はリテラルにLまたはlをつける。
float型の変数にfloat値を入れる場合はリテラルにFまたはfをつける。

```
long l = 40L;
float f = 1.15F;
```

#####符号付き整数と浮動小数点数のデフォルトの型
```Sample.java
class Sample {
    public static void main(String[] args) {
    long num1 = 10000000000; //コンパイルエラー
    long num2 = 10000000000L;
    float num3 = 10.0; //コンパイルエラー
    float num4 = 10.0F;
    }
}
```

Javaにおいて符号付き整数のリテラルはデフォルトでint型として認識される。
3行目の10000000000はlong型の値としては問題ないがint型としては扱えない桁数になるためコンパイルエラーになる。よって4行目のようにリテラルの末尾にLが必要になる。
浮動小数点数のリテラルはデフォルトでdouble型として認識される。
なので5行目の10.0はまずdouble型(64ビット)として認識されたあとにfloat型に代入しようとしているためコンパイルエラーになる。よってリテラルの末尾にFが必要になる。
#####定数
変数は変わる値を扱うことができるが、固定された値を扱うための変数も用意できる。
この変数をJavaではfinal修飾子を使い定数として宣言する。

```
final データ型 定数名 = 初期値;
```

定数として宣言した値は初期化したあとに他の値で代入できなくなる。
#####文字列は参照型
Javaにおいて複数文字の集合体である文字列は参照型のデータとして扱う。
文字列を扱う際のデータ型にはString型を使う。
参照型の変数は値のかたまりを指し示す変数という意味で参照変数とも呼ばれる。

```
char型 //基本データ型(扱える文字数は1文字)
String型 //参照型(複数文字扱える)
```
#変数のスコープ(有効範囲)
変数は宣言した場所によって使用できる範囲が制限される。
これを**スコープ（有効範囲）**という。

```Sample.java
class Sample {
  public static void main(String[] args) {
      {
        int x = 100;
        x = 200;
      }
      // x = 300;
  }
}
```
上記Sampleだと3行目から6行目が{}ブロックで囲まれていて、その中で変数xが宣言されている。
よって変数xのスコープは3行目から6行目であり、7行目のコメントアウトを外すとコンパイルエラーとなる。