Java Silverの資格勉強で学んだことをアウトプットしていく


訳あってJava Silverの資格勉強をしているのだが、勉強していて
「これってこういうふうにしても動くんだ~」という発見や驚きがあったので
そういうのを忘れない為に書き留めていこうと思う。

・記事の対象者
①Javaの初学者
②Java Silverの資格勉強をしている人

①制御文(if、for、while等)の中括弧を省略しても動作する

Java Silverの勉強をしていて一番驚いたのがこれ!!
例えば以下のコードの場合でもエラーにならず動作する。
この場合はif文の次の1文がif文の条件に合致した時の処理として使われる。

例①
if(i = 3)
 System.out.println("処理1ですー。");
  System.out.println("処理2ですー。");

上記のコードは、下記のコードの動きと同一になる。

例②
if(i = 3) {
 System.out.println("処理1ですー。");
}
  System.out.println("処理2ですー。");

どちらを使っても動くには動くが、保守性や可読性等が下がるため、基本的には省略せず
例②のように {}を使用する事。

②数値型にアンダースコア(_)を入れてもエラーにならない場合がある

これも勉強していて驚いた事。アンダースコアを使った数値表記はJava SE7から導入されたらしく
下記のルールに従えば、場所や回数は自由らしい。

・先頭と末尾には記述不可
・記号の前後には記述不可

なので、例えば下記のようなコードはOKになる。

例①
int a = 123_456_789;
int b = 1_____9;

しかし、下記のようなコードだとエラーになる。

例②
int a = _123_456_789;
int b = 123_456_789_;
float b = 3_.1415;

基本数値型にアンダースコアを入れることは無いと思うが、覚えておいて損は無いと思う。

③変数宣言時、変数名によってはエラーになる場合がある

変数宣言をする際、基本的にはその変数の使用用途によって変数名をきめると思うが
その際、下記のような変数名だとエラーになる場合がある。

例①
int $[a} = 100;
int b.c = 200;

変数名やメソッド名等の名前の事を 「識別子」 と呼ぶが、識別子の命名規則により
上記のような変数名だとエラーになる時がある。
命名規則としては主に下記のルールがある。

・予約語は使用できない
※予約語については下記参照
https://eng-entrance.com/java-reserved-word
・使える記号はアンダースコア(_)と通貨記号の2つ
・数字は2文字目からでないと使用できない。1文字めのみNG

なので、下記のような変数名だと使用できる。参考にしていただければ・・・。

例②
int $a = 100;
int b_ = 200;
int _0 = 300;

④インターフェースのデフォルトメソッドについて

Java SE8からインターフェースに使えるようになったメソッド。
Java SE7までは、インターフェ∸スに「抽象メソッド」という具体的な処理を記述しない
メソッドのみ使用できた。

使用例①
interface testInterface{
  abstract public void testMethod();
}

Java SE8からは「default」というキーワードを記述することによって
インターフェースに具体的なメソッドが記述できるようになった。

使用例②
interface testInterface{
  //default句を使うことで、interface内にメソッドを実装できる。
	default String testName(){
		return "名前";
	}
}

public class testSample implements testInterface{
}

public class testClass{
	public static void main(String[] args) {

		testInterface sample = new testSample ();
        // 結果:「名前」が表示される。
		System.out.println(sample.testName()); 
	}
}

defaultが使えることによって、実装するクラス内でオーバーライドして
メソッドの処理内容を記述する必要がなくなるというメリットがあるように思う。

⑤インターフェースの多重実現について

Javaで2つ以上のクラスを同時に継承する多重継承はダメだが
インターフェースの多重実装は可能。その際注意がいるのが
メソッド名、引数の型、引数の数が全て同じのデフォルトメソッドの存在になる。

全て同じのデフォルトメソッドを持つインターフェースを多重に実現した場合
どちらのデフォルトメソッドの実装を使うのかの宣言がいる。宣言が無いとエラーになる。
具体的には、下記のようにデフォルトメソッドをオーバーライドし
その処理内でどちらかのデフォルトメソッドを呼び出せばエラーにならない。

interface testInterfaceA{ 
	default void test(){
		System.out.println("A");
	}
}

interface testInterfaceB{ 
    // testInterfaceAと同じメソッドを実装
	default void test(){
		System.out.println("B");
	}
}

public class Main implements testInterfaceA, testInterfaceB{
    public static void main(String[] args) {
        System.out.println("C");
    }
    @Override
    public void test() {
        testInterfaceA.super.test();
    }

}