【Java Silver黒本】1章から3章までのつまづいたところまとめ。

はじめて知る知識が多いが、特に難しいというわけではない。

知らなかったことを学んでいけば受かりそう。

1章

  • パッケージの目的

パッケージ名を省略すると「無名パッケージ」として解釈される。つまり全てのクラスはなんらかのパッケージに属している。

  • 自動インポートされるクラス

    • java.langパッケージに属するクラス
    • 自クラスと同じパッケージに属するクラス
  • 同名フィールド、同名メソッドのstaticインポート

    • インポートしたものと、クラス内で定義したものの変数名が重複した場合、インポートしたものが無視される
    • 同名フィールドや同名メソッドをインポートした場合、コンパイルエラーとなる

2章

10進数 2進数 8進数 16進数
63 077 0x3F 0b00111111

3章

public class Main {
  public static void main(String[] args) {
    int a = 10;

    int b = a++ + a + a-- - a-- + ++a;
    // (10) + (10 + 1) + (11) - (11 - 1) + (10 - 1 + 1)
    //  10  +  11      +  11  -  10      +  10
    // => 32
  }
}
  • Object.equals(Object o)

    • Objectクラスのequalsメソッドは同一性のチェックのみを行うので、同値性のチェックを行うためには継承先の各クラスでオーバーライドしなければならない。
  • コンスタントプール

    • 定数やシンボルを保存する領域。ヒープ内に存在し、全てのスレッドから共有される。コンスタントプールに置く定数値の定義は、各クラスの中に存在し、クラスの読み込み時にメソッドエリアにコピーされる。
  • else if文

    • elseとifの間では改行できない。
  • switch文

    • switch(ARG)ARG部分
      • longを除く整数型
      • 文字、文字列
      • 列挙型
    • case VALUEVALUE部分
      • 条件式が戻す値と同じ型か、もしくは互換性のある型か
      • final宣言された変数かリテラル
      • nullではないこと
  • 整数型、浮動小数点数型のキャスト

    • より小さい範囲の型へ非明示的にキャストすることはできない。
    • 明示的なキャストで範囲外の数値(byte型に257など)を与えると、最大ビットを超えた分が切り捨てられるがエラーにはならない。

下のコードは非明示的キャストでコンパイルエラーになる例である。

public class Main {
  public static void main(String[] args) {
    int i = 1;

    long l = i;
    short s = i; // => コンパイルエラー
    byte b = i; // => コンパイルエラー
  }
}

でもこれ↓はエラーにならない。

public class Main {
  public static void main(String[] args) {
    int i = 1;

    long l = 1;
    short s = 1;
    byte b = 1;
  }
}

これ↓はエラーになる。

public class Main {
  public static void main(String[] args) {
    long l = 1L;
    int i = 1L; // => コンパイルエラー
    short s = 1L; // => コンパイルエラー
    byte b = 1L; // => コンパイルエラー
  }
}

また、浮動小数点数値を使うと、

この例↓ではエラーにならないが、

public class Main {
  public static void main(String[] args) {
    double d = 1;
    float f = 1;
  }
}

これ↓だとコンパイルエラーになる。

public class Main {
  public static void main(String[] args) {
    double d = 1.0;
    float f = 1.0; // => コンパイルエラー
  }
}

257を2進数で表すと0b1_0000_0001だが、9ビットの数値となるので、一番左のビットが切り捨てられ、0b0000_0001と同値になる。

public class Main {
  public static void main(String[] args) {
    byte b = (byte)257; // => 1
  }
}