Java SE7 Gold 取得を目指して (2)


Java SE7 Gold をとりたい…!

本日は第2回目です。

本日知ったこと(2章)

  • 可変長引数

    • 可変長引数を持つメソッドより、引数を明示的に指定したメソッドの方が優先して呼ばれる
    // obj.method(10, 20);
    void method(int... args) { }
    void method(int a, int b) { }; // ← こっちが呼ばれる
    
    • メソッドがオーバーロードされた場合、以下の順で上から一致するものが探される
    // obj.method(10);
    
    // 完全一致
    void method(int a) { }
    
    // 暗黙の型変換
    void method(long a) { } 
    
    // オートボクシング
    void method(Integer a) { } 
    
    // 可変長引数
    void method(int... a) { } 
    
    
  • 継承・実装

    • 抽象クラスのstaticメンバは、AbstClass.staticMethod() で呼べる
    • 同一名のメンバを持つことができるが、使う際は明示的にクラス名を指定しないとコンパイルエラー
    interface I {
      String str = "X";
    }
    class Super {
      static String str = "Super";
    }
    class Sub extends Super implements I {
      public void print() {
        // System.out.print(str);
        System.out.print(I.str);
        System.out.print(Super.str);
      }
    }
    
    • Superオブジェクト型でSubクラスを保持した場合、非staticメソッド以外は親クラスのメンバが呼ばれる
    class Super {
      String str1 = "Super val";
      static String str2 = "Super static val";
      void method1() {
        System.out.println("Super method");
      }
      static void method2() {
        System.out.println("Super static method");
      }
    }
    class Sub extends Super {
      String str1 = "Sub val";
      static String str2 = "Sub static val";
      void method1() {
        System.out.println("Sub method");
      }
      static void method2() {
        System.out.println("Sub static method");
      }
    }
    
    Super obj = new Sub();
    System.out.println(obj.str1); // Super val
    System.out.println(obj.str2); // Super static val
    obj.method1(); // Sub method
    obj.method2(); // Super static method
    

staticメソッドを同一シグネチャで上書きすることは、オーバーライドではなく隠蔽と呼ぶらしいです。隠蔽、メダロットで覚えた言葉ですね。