頭脳一式

人の記憶なんて曖昧なもの。すべての情報を頭に記憶するなんてナンセンス。困ったらここに来ればいいじゃん?

【Java SE8】構文まとめ

いつも思い出せない構文と、こんな書き方もできるよ!っていうバリエーションをまとめてみる。

switch文

変数の値によって処理を振り分けるよっていう主旨の場合、elseif文を使うよりも直感的でわかりやすい。

int num = 1;

switch(num){
case 1:
    System.out.println("1");
    break;
case 2:
    System.out.println("2");
    break;
case 3:
    System.out.println("3");
    break;
default :
    System.out.println("0");
}

default文はどのcaseにも一致しなかった場合に呼ばれる。
javaのswitch文はbreak文を書かないと後続のcaseと不一致でも処理が実行されてしまう。

swich文に使用できる型

  • String型はjavaSE7から使用可能。
  • Boolean型,Long型,Double型,Float型等、浮動小数点型は使えない。

caseに使用できる値には以下の制約がある。

  • 条件式が戻す値と同じ型か、互換性がある型であること。  
  • 定数であるか、コンパイル時に値を決めることができること。
  • NULLでないこと。

上記のうち、定数とはfinal宣言された変数か、もしくはリテラルを指す。変数はcase値として使えないので注意。

配列の初期化

構文:データ型[] 配列の名前 = new データ型[配列のサイズ];

素数を指定して初期化する方法
String[] array = new String[10];


初期化演算子{}を使ってデータを指定する方法
int [] array = new int[] { 1, 2, 3 };

初期化演算子{}を使用した場合は要素数は自動算出されるので、大カッコの中に要素数を指定することはできない。

配列の参照、代入、要素数の取得
String[] array = new String[10];
array[0] = "ABC";       //要素の代入
String str = array[0];  //要素の参照
int num = array.length; //要素数の取得


ArrayListの初期化

まずは普通の初期化。
List<String> list1 = new ArrayList<String>();


次はasListを使って要素を指定して初期化。

但し、asListを使って生成したArrayListは固定サイズなのであとからadd()やremove()が出来ない。
使うと実行時エラーでjava.lang.UnsupportedOperationExceptionが発生する。

List<String> list = Arrays.asList("ABC", "DEF", "GHI");
list.add("JKL"); //ここでUnsupportedOperationExceptionが発生する。
list.remove(0); //ここ同様。


回避する方法1.インスタンスイニシャライザを使う
List<String> list = new ArrayList<String>(){{add("ABC");add("DEF");add("GHI");}};
list.add("JKL"); //add()やremove()も使用可能。

これならadd()やremove()も使えるが見にくい。

回避する方法2.コンストラクタでListを使う
List<String> list = new ArrayList<>(Arrays.asList("ABC", "DEF", "GHI"));
list.add("JKL");


回避する方法3.コレクションクラスのaddAll()を使う。
List<String> list = new ArrayList<String>();
Collections.addAll(list, "ABC", "DEF", "GHI");
list.add("JKL");


三項演算子

構文:条件式 ? 式1 : 式2
条件式がTrueだった場合は式1を返し、Falseの場合は式2を返す。

int a = 10;
int b = 120;
int result = a < b? a : b; //resultには10が代入される。

注:三項演算子は値を返すもの。
条件によって処理を振り分けたい場合には使えないのでif文の代わりには成りえない。

つまりreturnできれば↓のように三項演算子の中でメソッドを使うことも出来る。

int Max = 100;
int Min = 50;

int result = Max > Min ? method(Max) : method(Min);
System.out.println(result); // Maxの方が大きいので10倍されて1000が返る。

static int method(int i) {
    return i * 10;
}


オーバーロード

オーバーロードとは
同一クラス内でかつ、メソッド名が同一で「引数の型、数、並び順が異なる」メソッドを複数定義すること。

int method(int x){
    return x * 10;
}

int method(int x,int y){
    return  x * y;
}

ちなみにオーバーロードには@Overrode アノテーションなるものは存在しないので注意。

以下の制約を満たさなければただの別物のメソッドとなってしまう。

  • メソッド名が同じであること。
  • シグニチャが異なること。(引数の数、型、並び順のいずれかが異なること。)
  • アクセス修飾子と戻り値の型は何でも可。


オーバーライド

オーラーライドとは、スーパークラスで定義したメソッドをサブクラスで再定義すること。

public class Oya {
    void method(int x){
        System.out.println("oya:" +x);
    }
}
public class Kodomo extends Oya{
    @Override
    void method(int x){
        System.out.println("kodomo:" +x);
    }
}

定義したメソッドがオーバーライドとなるには以下の制約がある。

  • アクセス修飾子はスーパークラスのメソッドと同一か、それより緩いものでなければならない。
  • 戻り値の型はスーパークラスのメソッドの戻り値と同一か、そのサブクラスでなければならない。

@Overrideアノテーションはメソッドがオーバーライドしていること宣言する。
オーバーライドしていないメソッドに@Overrideアノテーションを付けているとコンパイルエラーとなる。
定義したメソッドがオーバーライドしていることを見落とさないためにもアノテーションは付けたほうが良い。