継承に関して

オーバーライド…スーパークラスで用意されているメソッドとまったく同じ名前のメソッドをサブクラスで作った場合にサブクラスのメソッドが優先して実行される。

スーパークラスのクラス変数にサブクラスのインスタンスを代入できる。サブクラスのインスタンスを代入したスーパークラス変数(ややこしい)はサブクラスでオーバーライドしたメソッドを動かす。が、サブクラスで新しく定義したメソッドは動かない。(シンボルを見つけられませんのエラーがでる。)
superclass aaa = new subclass();
おそらくスーパークラスで定義された時点で、スーパークラスにあるフィールドやメソッドがすべて使えるようにメモリ領域を確保する。そこにサブクラスのフィールド、メソッドを入れようとするわけだからスーパークラスで定義されている(サブクラスでオーバーライドされている)ものしか使えないのでは?

この、スーパークラスの変数としてサブクラスのオブジェクトを定義できるという仕様のメリットは、スーパークラスとサブクラスのオブジェクトを同じ名前の配列変数で扱うことができる。というところ。

superclass sample = new superclass;
sample[0] = new superclass();
sample[1] = new subclass();

    • -

【追記】授業内容「super.this.final」
オーバーライドする時に、スーパークラスのメソッドをそのまま使いつつなにかの処理を追加したいような場合。バージョンアップするような感じ。の時はわざわざスーパークラスのメソッドに書かれていることをもう一回書かなくても「super.メソッド名();」って書けばいいよという話。

変数にthis.をつけるとインスタンス変数を明示的に指定できる。

メソッドにfinalがついているとそのメソッドにサブクラスが作れない。サブクラスでオーバーライドさせたくない時に使う。クラスにfinalつけれるしフィールドにも付けることができます。final付きの変数は宣言と同時に初期化しないといけない。

    • -

【追記】授業内容「Objectクラス」
すべてのクラスはObjectクラスのサブクラスですよ、ということでObjectクラスで用意されているメソッドは特にextendsしなくても使える。以下、Objectクラスに含まれる主なメソッド。
toString()メソッド。「クラス名@ハッシュコード」を返すメソッド。オブジェクトを出力しようとすると自動的にtoString()メソッドが実行される。
toString()で実装されることが多いのは、オブジェクトの内容を出力することでそのオブジェクトの内容がひとめでわかるような物を吐き出すものを用意すること。System.out.print(オブジェクト名);でオブジェクト名とオブジェクトが持っているフィールドなんかを吐き出すようにしておけば便利。
equals()メソッド。オブジェクトが同じかどうかを調べる。もともと用意されているequals()メソッドは厳密にオブジェクトの同一性を検証するものだけれども、Stringクラスの持ってるequalsみたいに動きを変えて、表面上の同一性の検証に動作を変更してオーバーライトされている場合もありますよ。
「==(演算子)」でオブジェクトの比較をするのであれば、常にオブジェクトレベルでの比較になる。(ハッシュコードの比較?→ハッシュコードというのはオブジェクトのメモリ内での位置情報が入ってると思ってたけどどうやら違うらしい。いろいろ計算結果が入っていて計算の仕方は内容によって違う。文字列や数字とか、なんかいろいろ。よくわからんけど)
getClass()メソッド。オブジェクトの元になってるクラスをゲットするというメソッド。デバグなんかに使うと便利という話です。

    • -

【追記】継承時のコンストラクタに関する注意点

継承してサブクラスを作った時に、どこもおかしくないのにコンストラクタで「シンボルを見つけられません」のエラーが出るときがある。
サブクラスにおいてコンストラクタはスーパークラスのコンストラクタを引数で指定しない場合、デフォルトコンストラクタを見にいくらしい。
(デフォルトコンストラクタ=引数をもたないコンストラクタ)

サブクラスを作った時に、コンストラクタは特にスーパークラスを使う必要がない、という場合super.コンストラクタ()を使わずに書いてしまうことがあるけれど、その場合スーパークラスにデフォルトコンストラクタが用意していないとエラーになる。

書いててよくわかってないけど、とにかくこのエラーが出た時は、スーパークラスにデフォルトコンストラクタを作ってみればいいんじゃないのってこと。