class と interface
class および interface は、新しい型のデータを定義するキーワードです。
class(または interface )に続く文字列がクラス名、
それに続くブロックがクラス定義と解釈されます。
インターフェイスは、実装を持たないように制限を受ける特殊なクラスです。
インターフェイスの定義のブロック内には、static変数と abstractメソッド
しか存在できません。
クラスの宣言の形式の例を以下に示します。
class NewClass {
}
extends と implements
extends と implements はクラスの継承を実現するためのキーワードです。
extends は新しいクラス定義のクラス名の後に現れます。
extends の直後の文字列は、ベースとなるクラス名と解釈されます。
新しいクラスは、この指定されたクラス(インターフェイスであってもよい)の
拡張クラスとして定義されます。
class で新しいクラスを定義する場合、
extends の後に指定できるクラス名は1つだけです。
interface で新しいインターフェイスを定義する場合、
extends の後に指定できるインターフェイス名は複数あってかまいません。
インターフェイス名の間は , で区切ります。
すべてのクラスは Object という共通の先祖のクラスを持っています。
extends が存在しない場合、先祖のクラスが存在しないという意味ではなく、
extends Objetct を省略したものとして扱われます。
implements も新しいクラス定義のクラス名の後に現れます。
implements の後の文字列は、組み込まれるインターフェイス名と解釈されます。
implements の後に指定できるのは、
インターフェイスとして定義されたものに限ります。
(通常のクラスを指定するとエラーになる)
implements の後に来るインターフェイス名は、複数あってもかまいません。
インターフェイス名の間は , で区切ります。
Java言語では、implements の機能を通じて多重継承を実現します。
継承を行うクラスの宣言の形式の例を以下に示します。
class NewClass extends OldClass implements Interface1,Interface2 {
}
this と super
this はクラス定義内で、そのクラスのオブジェクト自身を表すための
キーワードです。
メソッドの引数として自分自身のオブジェクトを渡したり、
ローカル変数との名前の衝突を解消する場合などに用いられます。
super はクラス定義内で、そのクラスのスーパー・クラスの機能を 呼び出すために用いるキーワードです。 super.init() のようにして、スーパー・クラスで定義されたメソッドを 呼び出すことを可能にします。 super() はスーパー・クラスのコンストラクタを呼び出します。
new と null
new は新しいオブジェクトのデータを生成するキーワードです。
new の後には生成したいオブジェクトのコンストラクタが来ます。
Java言語では配列のサイズを指定する時にも new が必要です。
なぜなら配列もクラスだからです。
int a[]; と int[] a;
は同じ意味です。int[] がクラス名と考えればわかりやすいでしょう。 new の後のサイズの指定は次のような形式です。
a = new int[10];
これは、「配列のクラスのコンストラクタが int[] であり、
それに引数 10 を与えてオブジェクトを生成している。
引数はサイズを記憶する変数の値である。」と解釈してください。
実際、配列のサイズはどの配列のクラスでも length という public 変数に
格納されています。したがって、上で定義した配列 a のサイズは次のようにして
いつでも知ることができます。
int count = a.length; // 値 10 が返る
null は「オブジェクトが存在しない」ことを表す特別な値です。 どのクラスのオブジェクトにも代入することができます。 (ただし原始型のデータには代入できない。) 宣言だけで生成されていないオブジェクトの値は null に初期化されています。 Java言語ではメモリの解放は明示的に行われません。 不用になったオブジェクトは、 デストラクタに相当するメソッドを呼び出して処理する必要はありません。 単に null を代入するだけでオブジェクトと変数の間の繋がりはなくなります。 どの変数とも繋がりを持たなくなったオブジェクトは、 自動的にガーベッジ・コレクションの対象となります。
オブジェクトの変数はクラスの型を指定して宣言し、
クラスのコンストラクタを用いて生成します。
したがって通常は、オブジェクトが何という名前のクラスなのかは自明です。
しかし外から引数で渡されてきたオブジェクトのような場合には、
それが何というクラスのオブジェクト(インスタンス)であるか
チェックしたい場合も生じます。
instanceof はそのような時に使用するキーワードです。
instanceof は boolean 型の値を返す2項演算子です。
if( objetcname instanceof ClassName )
先頭の項のオブジェクトが
後の項のクラスに所属するオブジェクト(インスタンス)であれば true,
そうでなければ false が返ります。