昨日の続きで「プログラミング言語Java (The Java Series)第4版」を読みます。
今日も知らない言葉たくさん。
ブランクfinal
「2.2.3 finalフィールド」の所で「ブランクfinal」という言葉が。
フィールドで初期化していないfinal変数のことらしい。初期化ブロックかコンストラクタでは初期化されなければいかんとのこと。初期化ブロックって何…と思ったのですが次に出てきました。
初期化ブロック
「2.5.2 初期化ブロック」こんな変数初期化できるんだ…。コンストラクタじゃないタイミングで初期化って何に使うんだろう、と思ったら「コンストラクタを持つことができない無名内部クラスを書く場合に有用」とのこと。なるほど。
適当にサンプルを書いてみる。
package jp.kikutaro.initial;
public class InitialBlock {
public int initVal;
{
System.out.println("初期化ブロックだお");
System.out.println("initVal = " + initVal);
initVal = 10;
System.out.println("initVal = " + initVal);
}
public InitialBlock(){
System.out.println("コンストラクタだお");
System.out.println("initVal = " + initVal);
initVal = 20;
System.out.println("initVal = " + initVal);
}
}
実行結果
run:
1と2で大きいほうの数字に1を足す=3
初期化ブロックだお
initVal = 0
initVal = 10
コンストラクタだお
initVal = 10
initVal = 20
確かにコンストラクタより前だ。ふむふむ。
static初期化
「2.5.3 static初期化」
staticメンバのみに対してはstatic初期化というのがあるとのこと。
初期化ブロックと同じように適当に書いてみた。
package jp.kikutaro.initial;
public class StaticInitialBlock {
private static int staticNum;
static {
System.out.println("static初期化でごあす");
System.out.println("staticNum = " + staticNum);
staticNum = 1;
System.out.println("staticNum = " + staticNum);
}
public StaticInitialBlock(){
System.out.println("コンストラクタでごあす");
System.out.println("staticNum = " + staticNum);
staticNum = 2;
System.out.println("staticNum = " + staticNum);
}
}
けど、NetBeansに警告受けました。
初期化コード内で、finalでないstatic変数を使用すると危険です。変数の値が初期化文の順序によって変化する可能性があるからです
とのこと。static初期化は複数定義できるし、気を付けて、ってことなのかな…(^^;
エリプス
可変長引数は知ってたのですが「String...」のテンテンテンをエリプスと呼ぶことを知らなかったです。
instanceof演算子
C#の「is」ですかね。
Cloneableの綴り
文法関係ないけど、注釈に「CloneableはClonableと綴られるべきでした」のくだりが笑ってしまいました。確かにalc先生に聞いたらClonableとのこと。
インタフェースの拡張
「4.3 インタフェースの拡張」extendsでインタフェース拡張できるんですね。知らなかった…。C#もあったっぽい。そもそも論で知らなかったという…。
エンクロージング
「第5章 ネストしたクラスとインタフェース」にて「エンクロージング」という言い回しが。
「エンクロージング型」とか「エンクロージングインスタンス、エンクロージングオブジェクト」とか、ネストして定義された、内包された子に付ける修飾子なんですね。
全然進まない…。そろそろ紅白で堀北さんが司会するので、見ないと。