Javaお勉強(1)

来週SJC-P試験受けるのでメモっていくよ!

transient修飾子
  • インスタンス変数専用の修飾子
  • オブジェクトがシリアライズされる際に、transient修飾された変数は格納しないようになる
  • だから、本当はSerializableとかExternalizableのインターフェースを実装するクラスにしか付かない(けどどんなインスタンス変数にも修飾できる)
共変戻り値(JDK5〜)
  • JDK5より前は、オーバーライドする側のメソッドの戻り値と、オーバーライドされる側のメソッドの戻り値の型が同じである必要があった
  • JDK5以降は、オーバーライドする側のメソッドの戻り値は、オーバーライドされる側の戻り値のサブクラスの型でもOKになった
interface Hoge {                                                     
    Object somethingMethod();
}

public class Fuga {
    public static void main(String[] args) {
        System.out.println(
            new Hoge() {
                @Override
                public Double somethingMethod() {
                    return new Double(0.5);
                }
            }.somethingMethod()
        );    //0.5
    } 
}
if文の罠
  • if (x = y) {}とかみたいに、イコールが1つしか無い場合、無条件でコンパイルエラーにしがちだが、xとyが共にboolean型ならコンパイルが通る!*1
java.io.Consoleクラス(JDK6〜)
  • コンソールからダイレクトに入出力を扱える!
  • 俺たちが打ち込んでいた new BufferedReader(new InputStreamReader(System.in)); とはなんだったのか
  • なんと、パスワード入力用に文字のエコーバックを抑制するreadPasswordメソッドがある
import java.io.Console;

public class ConsoleSample {
    public static void main(String[] args) {
        Console console = System.console();
        String name = console.readLine("%s", "name: ");
        char[] pw = console.readPassword("%s", "pw: ");  //文字が表示されない!
        System.out.println("name: " + name);
        System.out.println("pass: " + new String(pw));
    }
}

つづく

*1:しっかし、こんなのただのバッドノウハウでしかない・・・