このペースだと読み終わるのに半年かかる。
やばい。
第2章。
興味深いプログラムは、ほとんどが、オブジェクトを生成して操作します。
いきなり言い切りっぷりがすごい。
2.1 簡単なクラス
2.1.1 クラスのメンバー
クラスは3種類のメンバーを持つことができる。
- フィールド
- メソッド
- ネストしたクラスとネストしたインターフェース
これは、C++と同じかな。enumは?と思ったけど、enumはフィールド扱いなのかしら。
2.1.2 クラス修飾子
アノテーションもクラス修飾子、らしい。よくわからない。finalはざっくり言ってconstの仲間だと思ってるけど、クラス修飾子として使うことでクラスのサブクラス化を禁止することもできる。が、『実装パターン』ではやんわり批判されていた気がする。strictfpてのもよくわからない。言語仕様に修飾子として並べる価値がある機能なのか?でも便利そうではある。
2.2 フィールド
アノテーションはフィールドの修飾子にもなる。
2.2.1 フィールドの初期化
フィールドは宣言と同時に代入することで初期化できる。また、それぞれの型にデフォルトの値が用意されている。(値は不定にはならない)
2.2.2 staticフィールド
staticフィールドには「.」構文でアクセスすることができる。クラスに対してもオブジェクトに対しても「.」でstaticフィールドにアクセスできるけど、紛らわしいので素直にクラスに対してアクセスする方がよい。
2.2.3 finalフィールド
遅延初期化は、finalフィールドに適用できません。
残念。
2.3 アクセス制御
パッケージアクセスってのがやはり慣れない。ていうか、どう使うのがいいのかイメージわかない。まあこういうのはある程度まとまったプロダクトコードを読んだほうが(そして書いたほうが)理解が早そうな気もする。
2.4 オブジェクトの生成
オブジェクトはnewで生成して、その領域はガーベッジコレクションによって自動回収される。(デストラクタが呼ばれるのはいつだ……?ていうか、デストラクタ、ない……?)
2.5 生成と初期化
2.5.1 コンストラクタ
コンストラクタは、クラスのメンバーではありません。
???
「継承に関してはこの違いは無視できません」とだけ書いてある。が、わからない!
newによりオブジェクトが生成されて、nameとorbitsがデフォルトの初期値に設定された後にBodyコンストラクタが呼び出されます。
ナンデ???
まあ、わざわざアンダーライン引いてあるし何か意味があるのだろうけど……。当然、メンバイニシャライザなんてものもない。ナンデ??
2.5.2 初期化ブロック
便利そう。だが、濫用はだめよと書いてある。まあ、そうでしょうね。
2.5.3 static初期化
循環するstatic初期化というCoding Horrorについてなど。そんなコード書かねーよと言いたくなるけど、わざわざ注意してるってことはうっかり書いてしまうものなのかもしれない。こわい。
2.6 メソッド
アノテーションはメソッドの修飾子にもなる。それからsynchronnizedですね。かっこいい。nativeは今のとこ謎。
2.6.1 staticメソッド
2.6.2 メソッド呼び出し
ボクシング変換という謎のタームが登場する。「ラッパーオブジェクトが必要に応じて対応する基本データ型の値へ変換される(逆もまた然り)」っていう割と単純げな話だけど、名前がついてるってことはそれなりに便利で、それなりに複雑なものなのだろうと推測される。
2.6.3 可変長引数を持つメソッド
可変長引数を配列と組み合わせるとオーバーロード解決できなくなる話など。しかしまあ、自動的に配列に変換してくれるってのは、便利そう。
2.6.4 メソッドの実行と戻り
値を返すメソッドでは、メソッド内のすべての実行可能パスが、宣言された戻り値型の変数に代入可能(assignable)な値を返すか、例外をスローするかのどちらかでなければなりません。
基本的に変数が参照だからこういう説明になる。 シンプルでよい。
2.6.5 パラメータの値
変数が参照だから、メソッドのパラメータはすべて値渡しになる。ということを丁寧に説明してくれていて、ありがたい。C++で値渡しのパラメータにもconstつけられるのと同じように、Javaのパラメータにもfinalをつけることができる。悪くない。
2.6.6 アクセス制御のためのメソッド使用
アクセッサーメソッド、属性といった用語について。認識と一致しているようなので一安心。それから、アクセス制限はオブジェクト単位ではなく、クラス単位。これもC++と同じなので、馴染みやすい。
2.7 this
2.8 メソッドのオーバーロード
可変長引数と配列のあいまいなオーバーロード解決、再び。さすがにこんなメソッド宣言はしないし、できるとも思わない。
2.9 staticメンバー名のインポート
インポートの使い方は慣れが必要そうだ……。規約も必要そうだ。だいたいC++ではusingなんて使ったこともなかったし、本当に必要なのか?という気もする。
一般的な規則として、コードの可読性と明瞭性を改善するためにstaticインポートを使用すべきであり、タイプの手間を省くために使用すべきではありません。
ご高説ごもっともだが、その原則ってスムーズに 適用できるものかしら……。まあJavaのソースチラ見するとだいたい何行にもわたってimportって書いてあるものだし、ベストプラクティス的なものがあるのだろうと期待する。
2.10 mainメソッド
アプリケーションは、たくさんのmainメソッドを持つことができます。
マジすか。ちょっと面白い。
2.11 ネイティブメソッド
nativeってこれか。リンクの仕方とか書いてないけど、まあ使ってみればわかるものだろう。
第2章おわり。
プログラミング言語を学ぶのは楽しい。本を読むだけでも楽しいけど、感想を書きながら読むと理解が深まるし、もっと楽しい。でも時間もかかるし、続け方を考えてしまう……。どうしようかな。
あ、そういえば、やっぱデストラクタ、ない……?