Javaの文法
Stringオブジェクトは不変(変更不能)である
Stringオブジェクトは生成時に初期化されなければならない
コンパイラは文字列リテラル(ダブルクォーテーションで囲まれた文字列)を見つけると、Stringオブジェクトを生成する
演算子 + と += は文字列を連結するためにオーバーロードされる
StringBufferとStringBuilderオブジェクトは可変(変更可能)なので、オブジェクト生成オーバヘッド無しで柔軟に文字列を生成・変更できる。StringBufferとStringBuilderの違いは、StringBufferがマルチスレッドに対応している(=スレッド・セーフである)のに対し、StringBuilderは対応していないことである。
StringとStringBufferは互いに独立であり、一方から派生したものではない
Object.hashCode()メソッドは連想配列にオブジェクトを保存するための「ハッシュ値」として (int型の) 整数を返す。java.util.Mapインタフェースを実装するクラスは連想配列を提供しhashCodeメソッドに依存する。hashCodeの良い実装は安定 (不変) かつ均等に分布するハッシュ値を返す (異なるオブジェクトのハッシュ値は互いに異なる値となる傾向を持ち、かつハッシュ値は整数値の範囲内で均等に分布する)。
連想配列はequalsとhashCodeの両メソッドに依存するため、これら二つのメソッドの間では、オブジェクトがMapに挿入される場合に関する或る重要な契約が維持されねばならない:
a.equals(b) == b.equals(a)でなければならない。 もしa.equals(b)がtrueならば、a.hashCode() == b.hashCode()でなければならない。
この契約を維持するために、equalsメソッドをオーバーライドしたクラスは同時にhashCodeメソッドもオーバーライドし、逆もまた同様として、hashCodeとequalsが常に同じ性質(または同じ性質の一部)に基づくようにしなければならない。
マップがオブジェクトとの間に有する更なる契約は、ひとたびオブジェクトがマップに挿入されたなら、hashCode と equals両メソッドの結果は以後変わらないということである。したがって、一般にハッシュ関数はオブジェクトの不変(変更不能)な属性に基くように設計するのが良い。
クラスメンバとはフィールド、メソッド、コンストラクタ、クラス内で定義されたネストされたクラスのことである。アクセス制限が厳しいものから並べると、クラスメンバのアクセス修飾子は次の通り。
private – そのクラスからのみアクセス可能 (内部クラスからのアクセスを含む)。private宣言されたメンバはサブクラスによって引き継ぐことができない。
package-private (修飾子を省略した場合) – 同じパッケージ内の他クラスからもアクセス可能。
protected – 上に加え、パッケージ外の継承クラスからアクセス可能。
public – 任意のクラスからアクセス可能。
メソッドをオーバライドする際、そのメソッドのアクセス権を「より厳しく」することはできない。さもなくば親クラスのインタフェース契約を壊してしまうからである。したがってオーバライドされる場合、publicメソッドはpublicとして宣言されねばならず、protectedメソッドをデフォルトアクセス権(修飾子省略)とすることはできない。しかしながら、メソッドをオーバライドしてアクセス権を「より緩める」ことは許される。したがってオーバライドする際、デフォルト (パッケージ) アクセス権のメソッドはprotectedまたはpublicとして宣言することができ、protectedメソッドはpublicとして宣言することができる。
Javaのキーワードには「goto」という綴りも含まれているが、goto文は無い(他にもうひとつ、constも同様に、キーワードとして予約されているが、予約されているだけで使われていない)。
Javaのデータ型には大別して、プリミティブ型と参照型がある。