Java silver 勉強中

JavaSilver勉強中。今更感あるけど(笑)

黒本の章末、総仕上げ問題で不正解だったものを実際にコーディングして復習。

①子クラスで継承したメソッドの可視性を厳しくすることはできない

   interface inter {  
        //インターフェースで宣言したメソッドは暗黙的にpublicで修飾される!
        void test();
    }
    
    class impl implements inter {
        //子クラス(実装クラス)側は親クラスで宣言された可視性より厳しい可視性にはできない
        public void test() {
            
        }
        //このメソッド宣言ではコンパイルエラー!
        protected void test() {
            
        }

    }

②起動引数なしのmainメソッド実行 要素数0の配列として使用される。
→argsにアクセスしてもNullPointerExceptionにはならない

③StringBuilderのコンストラク
前提:StringBuilderは内部的で文字列を保持するためのバッファを持つ。
デフォルト(コンストラクタでバッファ数を指定しない)では16文字分のバッファを持つ。

       //sb1はバッファとして16文字分の領域を持つ(デフォルト)
        StringBuilder sb1 = new StringBuilder();
        //sb2はバッファとして30文字分の領域を持つ
        StringBuilder sb2 = new StringBuilder(30);

④LocalDateのインスタンス生成時に不正な日付を与えるとExceptionが発生する

     //2017年1月32日は存在しない日付
        LocalDate date = LocalDate.of(2017, 1, 32);

結果

Exception in thread "main" java.time.DateTimeException: Invalid value for DayOfMonth (valid values 1 - 28/31): 32

⑤継承関係にあるクラス構造でのメソッド実装義務があるのは実現クラス

   interface ParentInterface {
        void test();
    }
    
    interface childInterface extends ParentInterface {
        void childTest();
    }
    //このクラスではインターフェースのメソッドを実装しなくてもコンパイルエラーにはならない   
    abstract class parentClass implements childInterface{
        
    }
    //このクラスはインターフェースのメソッドを実現する必要がある
    class child extends parentClass {
            //コンパイルエラー!!
    }

⑥アクセス修飾子のレベル
public → 全クラスからアクセス可能
デフォルト(指定なし)→同一パッケージ、同一クラス内
protected → 同一パッケージ、同一クラス、サブクラス
private → 同一クラス内のみ

⑦switch文で使用できる型
byte,short,int,char,String,Byte,Short,Integer,Character,列挙型(Enum)

⑧配列の宣言

       int[] array = new int[3];
        int[] array2 = {1,2,3,};
        int[] array3;
        array3 = new int[]{1,2,3,4,};
                        
        int[] array4;
                //コンパイルエラー
        array4 = {1,2,3,};

ArrayListのremoveメソッド

       List<String> list = new ArrayList<>();
        list.add("A");
        list.add("B");
        list.add("C");
        list.add("D");
        list.add("A");
        //#equalsで一致したオブジェクトで初めに合致したオブジェクトを削除する
        list.remove("A");
        //要素0のAのみが削除対象となる
        System.out.println(list);

結果

[B, C, D, A]

⑩staticイニシャライザ
staticなフィールドに対して何らかの初期化処理を行う場合に使用する。
static変数は使用しないで、例としてstaticイニシャライザで標準出力。

public class Main {
    
    static {
        System.out.println("first");
    }
    
    static {
        System.out.println("second");
    }

    public static void main(String[] args) {
        System.out.println("in main method");
        
    }
}

結果

first
second
in main method

⑪arraycopyメソッド

       
        char[] array = "hello world".toCharArray();
        char[] array2 = new char[array.length];
        //(コピー元、コピー元のどこからコピー開始するか、コピー先配列、コピー先配列のどこからコピー開始するか、第2引数の位置からいくつの要素をコピーするか)
        System.arraycopy(array, 0, array2, 1, 5);
        
        System.out.println(array2);

結果

□hello□□□□□

オーバーロード時の呼び出されるメソッドの優先順位

   public static void main(String[] args) {
        System.out.println(calc(5, 8));
    }

    //呼び出し側で渡された実引数の個数にマッチする仮引数を受け取るメソッドが優先されて呼び出される
    static int calc(int a, int b){
        System.out.println("2arg");
        return a + b;
    }
    
    static int calc(int... ints){
        System.out.println("varargs!");
        return IntStream.of(ints).sum();
    }

結果

2arg
13

今日はこれくらいで。
javaそこそこできると思っていたけど、まだまだだ。
勉強勉強。